升级前最好备份所有组件及数据,例如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 是最新的补丁
yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes
kubeadm upgrade plan

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
yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes
kubeadm upgrade node
在所有的 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 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
- 指定是否打印将在升级中使用的配置文件。
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
- 执行升级,不提示确认(非交互模式)。
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"
- 调度程序清单的路径
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
- 要跳过的阶段的列表