「Kubernetes」- 升级由「kubeadm」创建的集群(从1.12.1到1.12.10版本)

  CREATED BY JENKINSBOT

内容简介

本文将介绍如何升级由kubeadm命令创建的高可用集群。本文是对官方「Upgrading kubeadm clusters from v1.11 to v1.12」文档的简单整理。

注意事项

官方文档并没有给出高可用集群的在同次版本号间升级的方法。

环境概述

系统环境: CentOS Linux release 7.4.1708 (Core)
软件版本: Kubernetes v1.12.1
  Docker version 18.06.1-ce, build e68fc7a
  Helm v3.0.0-beta.3
网络信息: k8s-master[1-3]:10.10.50.91 – 93
  node[1-6]:10.10.50.81 – 86
  VIP:10.10.50.90

# 开始之前

集群需要运行在1.11.0或以后版本,但是不能1.12版本。系统SWAP分区需要被禁用。集群需要使用静态的「Control Plane」和「etcd」POD实例。

仔细阅读「发行说明」页面。

确定已经备份重要组件,比如存储在数据库的应用状态。虽然升级只涉及Kubernetes组件,但是备份永远是最佳实践。

在升级后,所有容器将重启,因为容器spec hash发生了变化。
-「Container spec hash changed. Container will be killed and recreated. #53644

升级不能跨越次版本号,即可以从1.12升级到1.13版本,但是不能从1.12升级到1.14版本。

# 确定目标版本

目前为1.12.1版本,而目标为1.16.2版本,但是不能跨次版本号,但是升级到1.13.0失败。因此我们才决定尝试升级到1.12的最后一个版本:

#!/bin/sh

yum list --showduplicates kubeadm --disableexcludes=kubernetes | grep 1.12
# kubeadm.x86_64                     1.12.10-0                     kubernetes-ali

很显然,我们要升级到1.12.10-0版本(我使用阿里云的源仓库)。

# 升级主节点(Control Plane)

升级kubeadm命令

首先,升级kubeadm命令:

#!/bin/sh

yum install kubeadm-1.12.10-0 kubelet-1.12.10-0 --disableexcludes=kubernetes

# 验证版本
kubeadm version

(后面的kubelet-1.13.12-0是我自己添加的。因为如果不添加该包,系统kubelet会被升级到1.16.3-0版本)

获取可用版本

然后,检查集群是否可升级,并获取可升级版本:

#!/bin/sh

kubeadm upgrade plan

该命令将输出可用版本,也将输出升级命令。

执行升级命令

#!/bin/sh

kubeadm upgrade apply v1.12.10

kubeadm upgrade apply v1.12.10 --config kubeadm-config.default.v1alpha3-aliyun # 使用自定义配置,以拉去镜像

升级网络插件

查看「Installing Addons」页面,找到容器网络升级方案。

# 升级Master与Node包

驱除工作负载

在每个节点上执行如下命令,

#!/bin/sh

kubectl drain '<NODE_NAME>' --ignore-daemonsets

升级软件包

#!/bin/sh

yum install -y kubeadm-1.12.10-0 kubelet-1.12.10-0 --disableexcludes=kubernetes

# 升级程序文件(在Node中)

在除了主节点外的所有节点中,升级kubelet配置。执行如下命令:

#!/bin/sh

kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)

systemctl restart kubelet
systemctl status kubelet

执行如下命令恢复工作负载:

#!/bin/sh

kubectl uncordon '<NODE_NAME>'
kubectl get nodes

附加说明

Static Pods

所谓静态Pod实例,是指由kubelet直接管理的Pod实例。

从失败中恢复

如果kubeadm upgrade失败并且没有回滚,比如在执行期间意外关机,可再次运行kubeadm upgrade命令。该命令幂等的,它会确保最终状态与期望状态是一致的。

如果从坏状态恢复,可以执行kubeadm upgrade --force命令,不改变集群运行的版本。

kubeadm upgrade apply

该命令执行如下动作:
(1)检查集群处于可升级状态:可以访问API Server服务;所有节点为Ready状态;「Control Plane」处于健康状态;
(2)强制执行版本外泄策略;
(3)确保「Control Plane」镜像可以拉取;
(4)升级「Control Plane」组件。如果失败,则回滚;
(5)应用新的kube-dns与kube-proxy清单文件,并强制所有必要的RBAC规则被创建;
(6)创建API Server的新证书及密钥文件,并备份旧文件(如果在180天内过期);

参考文献

Upgrading kubeadm clusters
Create static Pods