一、注意事项

升级前最好备份所有组件及数据,例如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
要跳过的阶段的列表

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐