K8s:通过 kubectl 插件 Kubepug 实现集群升级检查(废弃API资源检查)

news2024/11/15 8:33:06

写在前面


  • 分享一个小工具,可用于 版本升级的 废弃 API 对象检查
  • 博文内容涉及:
    • kubepug 离线安装,配置 kubectl 插件
    • kubepug 两种方式离线使用 Demo
  • 理解不足小伙伴帮忙指正

昔我往矣,杨柳依依。今我来思,雨雪霏霏。 ——《小雅·采薇》


k8s 的版本迭代很快,虽然主要版本一直没有变化,但是次要版本一直在迭代,2022年一年就发布了三个次要版本,同时不同的次要版本之间 API 资源一直在变化,有新加入的,也有废弃删除的。不同版本的 api 资源版本也有不同,往往不是向下兼容的,比如在低版本中 API 资源版本为 v1beta1,而高版本可能升级为 v1。但是在高版本中不能运行低版本的API资源。

所以在 k8s 版本升级的时候,需要对之前废弃的和删除的 API 资源 做出清理,需要升级的做升级,或者替换为其他的 API 资源。 在这之前,需要一个工具来检查 API 资源对象,那些事已经废弃的,那些将要废弃。

Kubepug 即是这样一个工具,一个升级前检查器,可帮助在迁移到新的主要版本之前在 Kubernetes 资源中找到已弃用和已删除的 API

KubePug/Deprecations 作为一个 kubectl 插件,他可以实现下面的功能:

  • 从特定的 Kubernetes 版本下载 swagger.json
  • 解析此 Json 发现弃用通知
  • 验证当前的 kubernetes 集群或输入文件,检查此已弃用的 API 版本中是否存在对象,允许用户在迁移前进行检查

Kubepug 安装

如果可以科学上网,并且安装了 krew,可以使用下面的方式。

kubectl krew install deprecations

如果是内网环境,可以浏览器下载二进制文件

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$wget  https://github.com/rikatz/kubepug/releases/download/v1.4.0/kubepug_linux_amd64.tar.gz

然后配置为 kubectl 插件

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$tar -zxvf kubepug_linux_amd64.tar.gz
LICENSE
README.md
kubepug
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$mv kubepug kubectl-kubepug
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$mv ./kubectl-kubepug  /usr/local/bin/
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug

查看版本测试

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug version
 __  ___  __    __  .______    _______   ______ .___________. __               __  ___  __    __  .______    _______ .______    __    __    _______
|  |/  / |  |  |  | |   _  \  |   ____| /      ||           ||  |             |  |/  / |  |  |  | |   _  \  |   ____||   _  \  |  |  |  |  /  _____|
|  '  /  |  |  |  | |  |_)  | |  |__   |  ,----'`---|  |----`|  |      ______ |  '  /  |  |  |  | |  |_)  | |  |__   |  |_)  | |  |  |  | |  |  __
|    <   |  |  |  | |   _  <  |   __|  |  |         |  |     |  |     |______||    <   |  |  |  | |   _  <  |   __|  |   ___/  |  |  |  | |  | |_ |
|  .  \  |  `--'  | |  |_)  | |  |____ |  `----.    |  |     |  `----.        |  .  \  |  `--'  | |  |_)  | |  |____ |  |      |  `--'  | |  |__| |
|__|\__\  \______/  |______/  |_______| \______|    |__|     |_______|        |__|\__\  \______/  |______/  |_______|| _|       \______/   \______|
kubectl-kubepug: Shows all the deprecated objects in a Kubernetes cluster allowing the operator to verify them before upgrading the cluster.
It uses the swagger.json version available in master branch of Kubernetes repository (github.com/kubernetes/kubernetes) as a reference.

GitVersion:    v1.4.0
GitCommit:     4de32d695b27c52c16d4a801b613b78e45e28ca9
GitTreeState:  clean
BuildDate:     2022-08-21T18:25:40
GoVersion:     go1.18.5
Compiler:      gc
Platform:      linux/amd64

获取集群当前 API 状态

可以使用以下命令检查正在运行的集群的状态

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug --k8s-version=v1.22.2
Error: Get "https://raw.githubusercontent.com/kubernetes/kubernetes/v1.22.2/api/openapi-spec/swagger.json": dial tcp 0.0.0.0:443: connect: connection refused
time="2023-01-08T23:23:59+08:00" level=error msg="An error has occurred: Get \"https://raw.githubusercontent.com/kubernetes/kubernetes/v1.22.2/api/openapi-spec/swagger.json\": dial tcp 0.0.0.0:443: connect: connection refused"

如果没有科学上网,会报上面的错误,可以把 对应的 swagger 文件下载下来上传。然后在检查的时候指定 swagger 文件目录

PS C:\Users\山河已无恙\Downloads> curl -o swagger-v1.22.2.json https://raw.githubusercontent.com/kubernetes/kubernetes/v1.22.2/api/openapi-spec/swagger.json
PS C:\Users\山河已无恙\Downloads> scp .\swagger-v1.22.2.json  root@192.168.26.81:/root/ansible/krew/
root@192.168.26.81''s password:
swagger-v1.22.2.json                                           100% 4400KB  86.4MB/s   00:00
PS C:\Users\山河已无恙\Downloads>

通过 --swagger-dir= 指定 对应的 swagger 文件位置,--k8s-version=v1.22.2 指定要检测的版本

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$mkdir -p  swagger/folder
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$mv swagger-v1.22.2.json  swagger/folder/

通过输出我们可以看到当前集群的一些 api 变化

  • v1 版本的 ComponentStatus(ComponentStatusList)v1.19+ 中已弃用
  • policy/v1beta1a 版本 PodSecurityPolicyv1.21+ 版本已弃用,v1.25+ 版本不可用
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug --k8s-version=v1.22.2 --swagger-dir=./swagger/folder
W0108 23:32:02.991528   30270 warnings.go:70] v1 ComponentStatus is deprecated in v1.19+
W0108 23:32:02.995308   30270 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
RESULTS:
Deprecated APIs:

ComponentStatus found in /v1
         ├─ ComponentStatus (and ComponentStatusList) holds the cluster validation info. Deprecated: This API is deprecated in v1.19+
                -> GLOBAL: scheduler
                -> GLOBAL: controller-manager
                -> GLOBAL: etcd-0

PodSecurityPolicy found in policy/v1beta1
         ├─ PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container. Deprecated in 1.21.
                -> GLOBAL: controller
                -> GLOBAL: speaker


Deleted APIs:

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$

通过 kubectl 也可以看到当前集群存在的对应 API 资源。

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl get psp
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME         PRIV    CAPS      SELINUX    RUNASUSER   FSGROUP     SUPGROUP    READONLYROOTFS   VOLUMES
controller   false             RunAsAny   MustRunAs   MustRunAs   MustRunAs   true             configMap,secret,emptyDir
speaker      true    NET_RAW   RunAsAny   RunAsAny    RunAsAny    RunAsAny    true             configMap,secret,emptyDir
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$
┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager   Healthy     ok
etcd-0               Healthy     {"health":"true","reason":""}

假如我们希望升级到 v1.25.2 ,可以下载 1.25.2 版本的 swagger json 文件

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug --k8s-version=v1.25.2 --swagger-dir=./swagger/folder
W0108 23:43:37.187999   41352 warnings.go:70] v1 ComponentStatus is deprecated in v1.19+
W0108 23:43:37.339503   41352 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
RESULTS:
Deprecated APIs:

ComponentStatus found in /v1
         ├─ ComponentStatus (and ComponentStatusList) holds the cluster validation info. Deprecated: This API is deprecated in v1.19+
                -> GLOBAL: scheduler
                -> GLOBAL: controller-manager
                -> GLOBAL: etcd-0


Deleted APIs:

PodSecurityPolicy found in policy/v1beta1
         ├─ API REMOVED FROM THE CURRENT VERSION AND SHOULD BE MIGRATED IMMEDIATELY!!
                -> GLOBAL: controller
                -> GLOBAL: speaker

通过检查可以看到 ,1.25 之后的废弃和已经删除的 API 资源。如果要升级到 1.25 需要把删除的 API 处理掉。

在这里插入图片描述

查看指定文件资源 API 状态

Kubepug 可以放入 CI / 检查输入文件:

  • 来自 master 分支的 swagger.json 将被使用
  • 将验证所有 YAML 文件(不包括子目录)
  • 如果发现已弃用或已删除的对象,程序将退出并出错。

这里指定为当前的版本。

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug --input-file=/root/ansible/ --error-on-deleted --error-on-deprecated  --k8s-version=v1.22.2 --swagger-dir=./swagger/folder
........
RESULTS:
Deprecated APIs:


Deleted APIs:

calicoApiConfig found in /v1
         ├─ API REMOVED FROM THE CURRENT VERSION AND SHOULD BE MIGRATED IMMEDIATELY!!
                -> OBJECT:  namespace: default location: /root/ansible//calicoctl.j2

Error: found 1 Deleted APIs and 0 Deprecated APIs
time="2023-01-08T23:50:39+08:00" level=error msg="An error has occurred: found 1 Deleted APIs and 0 Deprecated APIs"

直接指出删除的 API 资源和对应的文件。上面两个参数的意思:

  • --error-on-deleted 如果发现一个被删除的对象,程序将以返回代码 1 而不是 0 退出,默认为 false
  • --error-on-deprecated 如果发现一个被废弃的对象,程序将以返回代码 1 而不是 0 退出。

当然也可以检查要升级的版本。

┌──[root@vms81.liruilongs.github.io]-[~/ansible/krew]
└─$kubectl kubepug --input-file=/root/ansible/ --error-on-deleted --error-on-deprecated  --k8s-version=v1.25.2 --swagger-dir=./swagger/folder
........
RESULTS:
Deprecated APIs:


Deleted APIs:

PodDisruptionBudget found in policy/v1beta1
         ├─ API REMOVED FROM THE CURRENT VERSION AND SHOULD BE MIGRATED IMMEDIATELY!!
                -> OBJECT: calico-kube-controllers namespace: kube-system location: /root/ansible//calico.yaml

calicoApiConfig found in /v1
         ├─ API REMOVED FROM THE CURRENT VERSION AND SHOULD BE MIGRATED IMMEDIATELY!!
                -> OBJECT:  namespace: default location: /root/ansible//calicoctl.j2

Error: found 2 Deleted APIs and 0 Deprecated APIs
time="2023-01-08T23:52:37+08:00" level=error msg="An error has occurred: found 2 Deleted APIs and 0 Deprecated APIs"

博文参考


https://github.com/rikatz/kubepug

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HBase入门】1. HBase基础

简介 Hadoop 从 1970 年开始&#xff0c;大多数的公司数据存储和维护使用的是关系型数据库大数据技术出现后&#xff0c;很多拥有海量数据的公司开始选择像Hadoop的方式来存储海量数据Hadoop使用分布式文件系统HDFS来存储海量数据&#xff0c;并使用 MapReduce 来处理。Hadoo…

【Ajax】同源策略、跨域和JSONP

一、同源策略什么是同源如果两个页面的协议&#xff0c;域名和端口都相同&#xff0c;则两个页面具有相同的源。例如&#xff0c;下表给出了相对于 http://www.test.com/index.html 页面的同源检测&#xff08;如果没有写端口号&#xff0c;默认是80&#xff09;&#xff1a;UR…

开篇点睛——Elasticsearch

在互联网当中我们的查询的信息主要包括文章、视频、图片、网站信息等各式各样的复杂海量信息。怎么才能快速、准确的检索到我们想要的信息呢? 传统意义上根据数据的格式&#xff0c;我们会将数据分为三个大类 结构化数据非结构化数据半结构化数据 接下来我们详细的了解一下这…

Day07 - 面向对象

1. 面向对象概述 面向对象是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的&#xff0c; 面向对象方法 &#xff0c;把相关的数据和方法组织为一个整体来看待&#xff0c;从更高的层次来进行系统建模&a…

开发人员必备的 15 个备忘单

随着网络编程技术的快速发展&#xff0c;我们必须学习很多新东西。有些语言和框架非常复杂&#xff0c;您可能记不住所有的语法或方法。备忘单是易于访问的笔记。当有人在过去目睹任何有帮助或有价值的事情时&#xff0c;包括我自己&#xff0c;我们都会做笔记。但是&#xff0…

Vue 快速入门(四)

前面已经介绍Vue常用指令的基本应用&#xff0c;这篇介绍Vue的一些特殊属性的使用。 01 - 计算属性Computed 计算属性关键词&#xff1a;Computed。 计算属性在处理一些复杂逻辑时是很有用的。 普通的写法 比如字符串反转普通写法&#xff0c;如下&#xff1a; <!DOCTYPE h…

Godot根据遮罩图移动粒子

前言 目前UI粒子特效unity引擎比较多&#xff0c;也好找资料&#xff0c;但是一般都是利用模型&#xff0c;使用3D粒子伪装2D效果。 Godot中也可以做到这一点&#xff0c;并且Godot有专门的2D粒子系统&#xff0c;可以通过一张遮罩图对粒子的位置进行设置。 godot粒子教程 …

nginx学习笔记6(小d课堂)

高并发-服务端缓存前置 我们现在启动了我们的一个jar包。 这次我们的nginx配置文件只保留这个。 我们先更改了它的文件名称。 然后我们现在利用默认的先去复制一份nginx配置文件&#xff1a; 我们这样就初始化完了我们的nginx配置文件。 记得加上我们的分号。 然后我们再重启…

AcWing第87场周赛题解

抱歉&#xff0c;3题只有前2题&#xff0c;第三题投入产出比太低&#xff0c;就不做了 一&#xff0c;移动棋子 4797. 移动棋子 - AcWing题库 题目 难度&#xff1a;简单 思路 直接套dfs模板&#xff0c;起点通过输入时得到&#xff0c;终点&#xff08;3&#xff0c;3&am…

Multiple Dimension Input 处理多维特征的输入

文章目录6、Multiple Dimension Input 处理多维特征的输入6.1 Revision6.2 Diabetes Dataset 糖尿病数据集6.3 Logistic Regression Model 逻辑斯蒂回归模型6.4 Mini-Batch&#xff08;N samples&#xff09;6.5 Neural Network 神经网络6.6 Diabetes Prediction 糖尿病预测6.6…

Exadata存储服务器(又称Exadata存储单元)

存储单元可以说是让Exadata如此大规模普及并且使用效果优异的核心要素。 I/O性能问题始终是Exadata存储或者存储服务器尽力去解决的问题。 Exadata存储服务器概述 Exadata数据库一体机通常预装了3类硬件&#xff1a; 数据库计算节点服务器存储服务器极速的InfiniBand存储交…

离散数学与组合数学-03函数

文章目录离散数学与组合数学-03函数3.1 函数基本概念3.1.1 函数的定义3.1.2 函数举例3.1.3 函数的数量3.1.4 关系与函数的差别3.2函数的类型3.2.1 函数类型3.2.2 函数类型的必要条件3.2.3 函数类型的数学化描述3.2.4 函数类型的证明3.3 函数的运算3.3.1 函数的复合运算3.3.2 函…

统计学习方法 学习笔记(1)统计学习方法及监督学习理论

统计学习方法及监督学习理论1.1.统计学习1.1.1.统计学习的特点1.1.2.统计学习的对象1.1.3.统计学习的目的1.1.4.统计学习的方法1.1.5.统计学习的研究1.1.6.统计学习的重要性1.2.统计学习的分类1.2.1.基本分类1.2.1.1.监督学习1.2.1.2.无监督学习1.2.1.3.强化学习1.2.1.4.半监督…

【HBase入门】2. 集群搭建

安装 上传解压HBase安装包 tar -xvzf hbase-2.1.0.tar.gz -C ../server/ 修改HBase配置文件 hbase-env.sh cd /export/server/hbase-2.1.0/conf vim hbase-env.sh # 第28行 export JAVA_HOME/export/server/jdk1.8.0_241/ export HBASE_MANAGES_ZKfalsehbase-site.xml vim…

【算法】洗牌算法

目录1.概述2.代码实现2.1.暴力法2.2.Fisher-Yates 洗牌算法3.应用本文参考&#xff1a; LeetCode 384. 打乱数组 1.概述 &#xff08;1&#xff09;洗牌算法可以理解为&#xff1a;设计算法来打乱一个没有重复元素的数组 nums&#xff0c;并且打乱后&#xff0c;数组的所有排列…

使用C++实现学委作业管理系统

开发环境学委作业管理系统在 Microsoft Visual Studio 2013 编译器开发的 MFC 项目&#xff0c;计算机使用的系统是 window10。1.2 基本原理与技术要求熟悉文件读写、mfc 基本知识、c 类运用、链表使用、排序算法、Microsoft Visual Studio 2013 编译器的使用。1.3 需求说明学委…

【数据结构】二叉搜索树的实现

目录 一、二叉搜索树的概念 二、二叉搜索树的中序遍历用于排序去重 三、二叉搜索树的查找 1、查找的非递归写法 2、查找的递归写法 四、二叉搜索树的插入 1、插入的非递归写法 2、插入的递归写法 五、二叉搜索树的删除 1、删除的非递归写法 2、删除的递归写法 六、…

autojs模仿QQ长按弹窗菜单(二)

牙叔教程 简单易懂 上一节讲了列表和长按事件 autojs模仿QQ长按弹窗菜单 今天讲弹窗菜单 由粗到细, 自顶向下的写代码 我们现在要修改的文件是showMenuWindow.js function showMenuWindow(view) {let popMenuWindow ui.inflateXml(view.getContext(),<column><bu…

基于双层优化的微电网系统规划设计方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

机制设计原理与应用(一)机制设计基础

什么是机制设计&#xff1f; 微观经济学和CS /EE的交叉学科。它采用了一种工程方法来设计激励机制&#xff0c;以实现战略环境中不完全信息的预期目标。机制设计具有广泛的应用,特别是在资源管理方面。 文章目录1 机制设计的基础1.1 简介1.2 机制设计与博弈及优化的关系1.3 机…