导语:测试环境版本比较低1.14.2 需要升级到1.18 记录一下自己大致的升级过程。给自己做笔记,中间可能有漏步骤,下次升级再来补呗。

此次升级是kubeadm安装的k8s

kubbernetes版本兼容性

在升级之前你需要了解各版本间的关系:

  1. kubernetes版本命名方式表示为XYZ,其中X表示主要版本,Y表示次要版本,Z表示补丁版本。
    比如 1.16.0
  2. K8s所有组件 kube-controller,kube-scheduler,kubelet的版本号不得高于kube-apiserver的版本号。
  3. 这些组件的版本号可低于kube-apiserver的1个次要版本,比如kube-apierver是1.16.0,其它组件的版本可以为1.16.x和1.15.x。
  4. 在一个HA集群中,多个kube-apiserver间的版本号最多只能相差一个次版本号,比如 1.16和1.15。
  5. 最好所有组件与kube-apiserver版本号完全一致。
  6. 因此升级Kubernetes集群时,最先升级的核心组件就是kube-apiserver。
  7. 且只能向上升级为一个次要版本。
  8. kubectl版本最多只能比kube-apiserver高或低一个次版本号。

宏观升级流程

  1. 升级主控制平面节点。
  2. 升级其他控制平面节点。
  3. 升级Node节点。

升级注意事项

  1. 确定升级前的的kubeadm集群版本。
  2. kubeadm upgrade不会影响到工作负载,仅涉及k8s内部的组件,但是备份etcd数据库是最佳实践。
  3. 升级后,所有容器都会重启动,因为容器的hash值已更改。
  4. 由于版本的兼容性,只能从一个次要版本升级到另外一个次要版本,不能跳跃升级。
  5. 集群控制平面应使用静态Pod和etcd pod或外部etcd。

kubeadm upgrade 集群升级命令详解

通过查询命令行帮助:

$ kubeadm upgrade -h

Upgrade your cluster smoothly to a newer version with this command.

Usage:
  kubeadm upgrade [flags]
  kubeadm upgrade [command]
`

Available Commands:
  apply       Upgrade your Kubernetes cluster to the specified version.
  diff        Show what differences would be applied to existing static pod manifests. See also: kubeadm upgrade apply --dry-run
  node        Upgrade commands for a node in the cluster. Currently only supports upgrading the configuration, not the kubelet itself.
  plan        Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter.

命令解析:

  • apply: 升级Kubernetes集群到指定版本。
  • diff: 即将运行的静态Pod文件清单与当前正运行的静态Pod清单文件的差异。
  • node: 升级集群中的node,当前(v1.16)仅支持升级kubelet的配置文件(/var/lib/kubelet/config.yaml),而非kubelet本身。
  • plan: 检测当前集群是否可升级,并支持升级到哪些版本。

其中node子命令又支持如下子命令和选项:

$ kubeadm upgrade node  -h
Upgrade commands for a node in the cluster. Currently only supports upgrading the configuration, not the kubelet itself.

Usage:
  kubeadm upgrade node [flags]
  kubeadm upgrade node [command]

Available Commands:
  config                     Downloads the kubelet configuration from the cluster ConfigMap kubelet-config-1.X, where X is the minor version of the kubelet.
  experimental-control-plane Upgrades the control plane instance deployed on this node. IMPORTANT. This command should be executed after executing `kubeadm upgrade apply` on another control plane instance

Flags:
  -h, --help   help for node

Global Flags:
      --log-file string   If non-empty, use this log file
      --rootfs string     [EXPERIMENTAL] The path to the 'real' host root filesystem.
      --skip-headers      If true, avoid header prefixes in the log messages
  -v, --v Level           number for the log level verbosity

命令解析:

  • config: 从集群configmap中下载kubelet的配置文件kubelet-config-1.x,其中x是kubelet的次要版本。
  • experimental-control-plane: 升级部署在此节点的控制平面各组件, 通常在第一个控制平面实例上执行"kubeadm upgrade apply"后,应执行此命令。

开始升级

想直接升级到1.18 炸了

kubectl get nodes
kubectl version

kubernetes server 下载 国内镜像 kubernetes版本_版本号

升级CNI插件。

这一步是可选的,查询CNI插件是否可以升级。

yum list --showduplicates kubeadm --disableexcludes=kubernetes

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_02

#  升级kubeadm版本
yum install  kubeadm-1.18.13-0 kubelet-1.18.13-0  kubectl-1.18.13-0
# 安装完成之后 确认一下各个组件的版本 确保是你想要的
kubelet --version
kubectl version
kubeadm version

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_03

# 升级检查和方案
kubeadm upgrade plan

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_04

kubernetes server 下载 国内镜像 kubernetes版本_版本号_05

老老实实一个个版本升级

1.14.2 >1.15.2
1.15.2 > 1.16.2
1.16.2 > 1.17.2
1.17.2 > 1.18.2
# 删除刚刚装的1.18
yum remove -y  kubectl-1.18.13
yum -y remove kubelet-1.18.13-0.x86_64

yum install  kubeadm-1.15.2-0 kubelet-1.15.2-0  kubectl-1.15.2-0 -y

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_06

kubeadm upgrade plan

kubernetes server 下载 国内镜像 kubernetes版本_版本号_07

查看 kubeadm 的配置
kubeadm config view > /tmp/kubeadm-config.yaml
升级1.15.2
kubeadm upgrade apply v1.15.2

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_08

这样子升级好kubectl版本就一致了

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_09

继续升级

kubernetes server 下载 国内镜像 kubernetes版本_版本号_10

报错了 ERROR CoreDNSUnsupportedPlugins]: there are unsupported plugins in the CoreDNS Corefile

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_11

网上说是因为coredns里的host模块的问题 需要注释掉

# edit configmap 并注释
kubectl edit cm coredns -n kube-system

继续尝试升级 依旧报错

there are NotReady control-planes in the cluster: [op-k8s-m001]

此时查看node状态会发现master 是notready

查看报错

journalctl -u kubelet | tail -n 300

临时解决的办法是给 /etc/cni/net.d/10-flannel.conflist 添加cniVersion字段

重启Node后将需要重做,终极办法是在Master上更新Flannel(新的版本带有cniVersion字段)或者修改Flannel的ConfigMap kubectl edit cm kube-flannel-cfg -n kube-system,因为这个配置是Node加入时读取的。

kubernetes server 下载 国内镜像 kubernetes版本_版本号_12

继续升级

kubernetes server 下载 国内镜像 kubernetes版本_版本号_13

报错There are kubelets in this cluster that are too old that have these versions [v1.14.2]

升级node的kubelet

yum install  kubelet-1.15.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

kubernetes server 下载 国内镜像 kubernetes版本_版本号_14

继续升级

kubernetes server 下载 国内镜像 kubernetes版本_版本升级_15

master成功升级到1.16.2

kubernetes server 下载 国内镜像 kubernetes版本_Pod_16

升级node到1.16.2

yum install  kubelet-1.16.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

升级master到1.17.2

yum install  kubeadm-1.17.2-0 kubelet-1.17.2-0  kubectl-1.17.2-0 -y
kubeadm upgrade plan
kubeadm upgrade apply v1.17.2

升级node到1.17.2

yum install  kubelet-1.17.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

kubernetes server 下载 国内镜像 kubernetes版本_Pod_17

升级到1.18.2

master

yum install  kubeadm-1.18.2-0 kubelet-1.18.2-0  kubectl-1.18.2-0 -y
kubeadm upgrade plan
kubeadm upgrade apply v1.18.2

kubernetes server 下载 国内镜像 kubernetes版本_版本号_18

kubernetes server 下载 国内镜像 kubernetes版本_版本号_19

升级node到1.18.2

yum install  kubelet-1.18.2-0 -y
systemctl daemon-reload
systemctl restart kubelet
systemctl status  kubelet

升级完成

kubernetes server 下载 国内镜像 kubernetes版本_Pod_20