kubeadm升级k8s集群
升级前最好备份所有组件及数据,例如etcd千万不要跨小版本进行升级,例如从1.16升级到1.19,Kubernetes默认向前兼容两个版本。
·
一、注意事项
升级前最好备份所有组件及数据,例如etcd
千万不要跨小版本进行升级,例如从1.16升级到1.19,Kubernetes默认向前兼容两个版本
二、查看当前版本
[root@master-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-1 Ready control-plane,master 90d v1.20.1
master-2 Ready control-plane,master 89d v1.20.1
master-3 Ready control-plane,master 89d v1.20.1
worker-1 Ready <none> 89d v1.20.1
worker-2 Ready <none> 89d v1.20.1
worker-3 Ready <none> 89d v1.20.1
三、确定当前版本
yum clean all
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 在列表中找到最新的 1.21 版本号
# 该版本号格式为 1.21.x-0,其中 x 是最新的补丁
四、升级 master 节点
4.1 在第一个 master 节点上执行如下命令,升级 kubeadm
yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes
4.2 第一个 master 节点上执行命令 kubeadm upgrade plan
kubeadm upgrade plan
4.3 执行如下命令以升级:
kubeadm upgrade apply v1.21.0
发现拉取coredns的时候报错
[preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0: output: Error response from daemon: manifest for registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0 not found: manifest unknown: manifest unknown
在所有节点从其他仓库拉取镜像 然后在打个tag吧
docker pull registry.cn-beijing.aliyuncs.com/dotbalo/coredns:1.8.0
docker tag registry.cn-beijing.aliyuncs.com/dotbalo/coredns:1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
再执行
kubeadm upgrade apply v1.21.0
在其他 master 节点上执行命令
kubeadm upgrade node
在所有的 master 节点上执行如下命令以升级 kubelet 和 kubectl
yum install -y kubelet-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes
执行如下命令,以重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
五、升级 worker 节点
5.1 在所有的 worker 节点上执行如下命令,升级 kubeadm
yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes
5.2 升级 kubelet 的配置
kubeadm upgrade node
5.3 升级 kubelet 和 kubectl
在所有的 worker 节点执行命令
yum install -y kubelet-1.21.0-0 kubectl-1.21.0-0--disableexcludes=kubernetes
执行如下命令,以重启 kubelet
systemctl daemon-reload && systemctl restart kubelet
六、检查集群的状态
kubectl get nodes -o wide
[root@master-1 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master-1 Ready control-plane,master 90d v1.21.0 192.168.248.101 <none> CentOS Linux 7 (Core) 5.6.1-1.el7.elrepo.x86_64 docker://19.3.11
master-2 Ready control-plane,master 90d v1.21.0 192.168.248.102 <none> CentOS Linux 7 (Core) 5.6.1-1.el7.elrepo.x86_64 docker://19.3.11
master-3 Ready control-plane,master 90d v1.21.0 192.168.248.103 <none> CentOS Linux 7 (Core) 5.6.1-1.el7.elrepo.x86_64 docker://19.3.11
worker-1 Ready <none> 90d v1.21.0 192.168.248.111 <none> CentOS Linux 7 (Core) 5.6.1-1.el7.elrepo.x86_64 docker://19.3.11
worker-2 Ready <none> 90d v1.21.0 192.168.248.112 <none> CentOS Linux 7 (Core) 5.6.1-1.el7.elrepo.x86_64 docker://19.3.11
worker-3 Ready <none> 90d v1.21.0 192.168.248.113 <none>
七、kubeadm其他命令用法
7.1 查看当前可升级版本,并验证你当前的集群是否可升级。
kubeadm upgrade plan [version] [flags]
参数如下:
--allow-experimental-upgrades
显示不稳定版本的 Kubernetes 作为升级替代方案,并允许升级到 Kubernetes 的 Alpha/Beta/发行候选版本。
--allow-release-candidate-upgrades
显示 Kubernetes 的发行候选版本作为升级选择,并允许升级到 Kubernetes 的发行候选版本。
--config string
配置文件的路径。
--feature-gates string
一组描述各种特征特性门控的键值对。选项有:
PublicKeysECDSA=true|false (ALPHA - 默认值=false)
RootlessControlPlane=true|false (ALPHA - 默认值=false)
UnversionedKubeletConfigMap=true|false (BETA - 默认值=true)
-h, --help
plan 的帮助信息
--ignore-preflight-errors strings
其错误将显示为警告的检查列表。 例如:'IsPrivilegedUser,Swap'。 值 'all' 忽略所有检查错误。
--kubeconfig string 默认值:"/etc/kubernetes/admin.conf"
与集群通信时使用的 kubeconfig 文件。如果标志为未设置,则可以在一组标准位置中搜索现有的 kubeconfig 文件。
--print-config
指定是否打印将在升级中使用的配置文件。
7.2 将 Kubernetes 集群升级到指定版本
kubeadm upgrade apply [version]
参数如下:
--allow-experimental-upgrades
显示 Kubernetes 的不稳定版本作为升级替代方案,并允许升级到 Kubernetes 的 alpha/beta 或 RC 版本。
--allow-release-candidate-upgrades
显示 Kubernetes 的候选版本作为升级替代方案,并允许升级到 Kubernetes 的 RC 版本。
--certificate-renewal Default: true
执行升级期间更改的组件所使用的证书的更新。
--config string
kubeadm 配置文件的路径。
--dry-run
不要更改任何状态,只输出要执行的操作。
--etcd-upgrade 默认值: true
执行 etcd 的升级。
--feature-gates string
一组键值对,用于描述各种功能。选项包括:
PublicKeysECDSA=true|false (ALPHA - 默认值=false
RootlessControlPlane=true|false (ALPHA - 默认值=false)
UnversionedKubeletConfigMap=true|false (BETA - 默认值=true)
-f, --force
强制升级,但可能无法满足某些要求。这也意味着非交互模式。
-h, --help
apply 操作的帮助命令
-ignore-preflight-errors strings
错误将显示为警告的检查列表;例如:'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误。
--kubeconfig string 默认值:"/etc/kubernetes/admin.conf"
与集群通信时使用的 kubeconfig 文件。如果未设置标志,则在相关目录下搜索以查找现有 kubeconfig 文件。
--patches string
包含名为 "target[suffix][+patchtype].extension" 的文件的目录的路径。 例如,"kube-apiserver0+merge.yaml"或仅仅是 "etcd.json"。 "target" 可以是 "kube-apiserver"、"kube-controller-manager"、"kube-scheduler"、"etcd" 之一。 "patchtype" 可以是 "strategic"、"merge" 或者 "json" 之一, 并且它们与 kubectl 支持的补丁格式相同。 默认的 "patchtype" 是 "strategic"。 "extension" 必须是"json" 或"yaml"。 "suffix" 是一个可选字符串,可用于确定首先按字母顺序应用哪些补丁。
--print-config
指定是否应打印将在升级中使用的配置文件。
-y, --yes
执行升级,不提示确认(非交互模式)。
7.3 显示哪些差异将被应用于现有的静态 pod 资源清单
kubeadm upgrade diff [version] [flags]
参数如下:
--api-server-manifest string 默认值:"/etc/kubernetes/manifests/kube-apiserver.yaml"
API服务器清单的路径
--config string
kubeadm 配置文件的路径
-c, --context-lines int 默认值:3
差异中有多少行上下文
--controller-manager-manifest string 默认值: "/etc/kubernetes/manifests/kube-controller-manager.yaml"
控制器清单的路径
-h, --help
帮助
--kubeconfig string 默认值:"/etc/kubernetes/admin.conf"
与集群通信时使用的 kubeconfig 文件,如果标志是未设置,则可以在一组标准位置中搜索现有的 kubeconfig 文件。
--scheduler-manifest string 默认值:"/etc/kubernetes/manifests/kube-scheduler.yaml"
调度程序清单的路径
7.4 升级集群中某个节点的命令
kubeadm upgrade node [flags]
"node" 命令执行以下阶段:
preflight 执行节点升级前检查
control-plane 如果存在的话,升级部署在该节点上的管理面实例
kubelet-config 更新该节点上的 kubelet 配置
参数如下:
--certificate-renewal 默认值: true
对升级期间变化的组件所使用的证书执行更新。
--dry-run
不更改任何状态,只输出将要执行的操作。
--etcd-upgrade 默认值: true
执行 etcd 的升级。
-h, --help
node 操作的帮助命令
--ignore-preflight-errors strings
其错误将显示为警告的检查列表。示例:'IsPrivilegedUser,Swap'。 值 'all' 忽略所有检查中的错误。
--kubeconfig string 默认值: "/etc/kubernetes/admin.conf"
用于与集群交互的 kubeconfig 文件。如果参数未指定,将从一系列标准位置检索存在的 kubeconfig 文件。
--patches string
包含名为 "target[suffix][+patchtype].extension" 的文件的目录的路径。 例如,"kube-apiserver0+merge.yaml"或仅仅是 "etcd.json"。 "target" 可以是 "kube-apiserver"、"kube-controller-manager"、"kube-scheduler"、"etcd" 之一。 "patchtype" 可以是 "strategic"、"merge" 或者 "json" 之一, 并且它们与 kubectl 支持的补丁格式相同。 默认的 "patchtype" 是 "strategic"。 "extension" 必须是"json" 或"yaml"。 "suffix" 是一个可选字符串,可用于确定首先按字母顺序应用哪些补丁。
--skip-phases strings
要跳过的阶段的列表
更多推荐
已为社区贡献33条内容
所有评论(0)