Kubeadm升级 Kubernetes 1.18.1版本

参考地址:

系统环境:

  • 系统版本:CentOS 7.8
  • 内核版本:4.4.218-1
  • 升级前 kubernetes 版本:1.17.4
  • 升级后 kubernetes 版本:1.18.1

注意事项:

升级 Kubernetes 1.18+ 且使用 IPVS 模块,需要将 CentOS 内核版本升级至 4.4 +,否则 kube-proxy 会报 parseIP 错误!

一、查看当前集群组件列表(master 节点)

$ kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.17.4
k8s.gcr.io/kube-controller-manager:v1.17.4
k8s.gcr.io/kube-scheduler:v1.17.4
k8s.gcr.io/kube-proxy:v1.17.4
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

二、配置 Kubernetes 国内 yum 源(master 节点)

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

三、升级 Kubeadm 工具版本(master 节点)

升级 Kubeadm 工具,然后执行检测命令:

## 升级 Kubeadm 工具
$ yum update -y kubeadm-1.18.1-0

## 升级前执行 Kubeadm 检测命令
$ kubeadm upgrade plan

输出日志内容如下:

Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       AVAILABLE
Kubelet     3 x v1.17.4   v1.18.1

Upgrade to the latest stable version:

COMPONENT            CURRENT   AVAILABLE
API Server           v1.17.4   v1.18.1
Controller Manager   v1.17.4   v1.18.1
Scheduler            v1.17.4   v1.18.1
Kube Proxy           v1.17.4   v1.18.1
CoreDNS              1.6.5     1.6.7
Etcd                 3.4.3     3.4.3-0

You can now apply the upgrade by executing the following command:

        kubeadm upgrade apply v1.18.1
_____________________________________________________________________

四、通过 kubeadm 升级 Kubernetes 集群(master 节点)

1、查看待升级的 kubernetes 组件镜像列表

$ kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

2、创建拉取待升级的 Kubernetes 组件镜像脚本

创建拉取镜像脚本 pull-image.sh 文件:

$ vi pull-image.sh

脚本内容如下:

## 设置镜像仓库地址
MY_REGISTRY=registry.aliyuncs.com/google_containers

## 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.18.1
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.18.1
docker pull ${MY_REGISTRY}/kube-scheduler:v1.18.1
docker pull ${MY_REGISTRY}/kube-proxy:v1.18.1
docker pull ${MY_REGISTRY}/etcd:3.4.3-0
docker pull ${MY_REGISTRY}/pause:3.2
docker pull ${MY_REGISTRY}/coredns:1.6.7
## 设置标签
docker tag ${MY_REGISTRY}/kube-apiserver:v1.18.1          k8s.gcr.io/kube-apiserver:v1.18.1
docker tag ${MY_REGISTRY}/kube-scheduler:v1.18.1          k8s.gcr.io/kube-scheduler:v1.18.1
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.18.1 k8s.gcr.io/kube-controller-manager:v1.18.1
docker tag ${MY_REGISTRY}/kube-proxy:v1.18.1              k8s.gcr.io/kube-proxy:v1.18.1
docker tag ${MY_REGISTRY}/etcd:3.4.3-0                    k8s.gcr.io/etcd:3.4.3-0
docker tag ${MY_REGISTRY}/pause:3.2                       k8s.gcr.io/pause:3.2
docker tag ${MY_REGISTRY}/coredns:1.6.7                   k8s.gcr.io/coredns:1.6.7

执行镜像拉取脚本:

$ sh pull-image.sh

3、通过 kubeamd 升级 Kubernetes 集群

通过 kubeadm 工具升级 kubernetes 集群:

$ kubeadm upgrade apply 1.18.1

...
[addons]: Migrating CoreDNS Corefile
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.18.1". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

升级过程中,不用备份当前节点的 Etcd 和 Kubernetes 清单数据,Kubeadm 会自动备份相关数据存于 /etc/kuberntes/tmp 目录下。

4、升级 Kubelet 与 kubectl 工具

## 升级 master 节点 kubectl 版本
$ yum update -y kubectl-1.18.1-0

## 升级 master 节点 kubelet 版本
$ yum update -y kubelet-1.18.1-0

# 重新加载系统配置
$ systemctl daemon-reload

# 重启 kubelet
$ systemctl restart kubelet

# 查看 kubelet 状态
$ systemctl status kubelet

五、升级工作节点 kubeadm、kubelet 版本(全部 worker 节点)

升级各个工作节点上的 kubelet 版本:

## 设置节点进入维护状态,方便升级 kubelet 版本
$ kubectl drain [节点名称] --ignore-daemonsets

## 升级 kubeadm 版本
$ yum update -y kubeadm-1.18.1-0

## 升级 kubelet 版本
$ yum update -y kubelet-1.18.1-0

## 重新加载系统配置
$ systemctl daemon-reload

## 重启 kubelet
$ systemctl restart kubelet

## 查看 kubelet 状态
$ systemctl status kubelet

## 设置工作节点取消维护状态,允许应用镜像调度:
$ kubectl uncordon [node名称]

六、查看版本是否升级成功(master 节点)

在对集群中所有节点的 kubelet 进行升级之后,请执行以下命令,以确认所有节点又重新变为 Ready 可用状态:

$ kubectl get nodes

七、升级网络插件(master 节点)

Kubernetes 有很多网络插件,一般都是安装时候选择的,所以 Kubeadm 并不维护这些网络插件镜像的升级,需要根据自己安装的插件信息,选择性更新,下面是常用的 Flannel、calico 网络插件升级文档信息供参考:

注意:升级网络插件时,注意配置网络插件的子网域和 kubeadm 配置中的 podSubnet.podSubnet 值保持一致,可以通过 kubectl describe configmaps kubeadm-config -n kube-system 命令查看。

  • Calico 升级参考文档: 如果 Kubernetes 集群使用的是 Calico 网络插件,请参考:

https://docs.projectcalico.org/maintenance/kubernetes-upgrade

  • Flannel 升级参考文档:如果 Kubernetes 集群使用的是 Flannel 网络插件,请参考:

https://github.com/coreos/flannel/blob/master/Documentation/kubernetes.md

 

八、升级 Docker 版本(全部节点)

由于 Kubernetes 对 Docker 版本有限制,所以升级 Kubernetes 的同时也需要升级 Docker 版本:

## 安装 yum 工具,方便下一步配置 yum 源:
$ yum install -y yum-utils device-mapper-persistent-data lvm2

## 这里使用 Aliyun Docker yum 源文件进行安装 Docker,输入下面命令进行源配置:
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 显示docker-ce所有可安装版本:
$ yum list docker-ce --showduplicates | sort -r

* updates: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* epel: mirrors.njupt.edu.cn
docker-ce.x86_64            3:19.03.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable 

## 升级 Docker 版本
$ yum update -y docker-ce-19.03.8

## 重启 Docker
$ systemctl daemon-reload && systemctl restart docker

## 重启 Kubelet
$ systemctl restart kubelet

发表评论