任务

Edit This Page

将 kubeadm 高可用集群从 v1.11 升级到 v1.12

本页介绍了如何将基于 kubeadm 创建的 Kubernetes HA 集群从 1.11.x 版本升级到 1.12.x 版本。除了升级,您还必须遵守使用 kubeadm 创建 HA 集群 的相关说明。

准备开始

在继续之前:

Note:

任何控制平面或 etcd 节点上的所有命令都应以 root 身份运行。

准备两种方法

升级 kubeadm 到与要升级到的 Kubernetes 版本匹配的版本:

apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm && \
apt-mark hold kubeadm

检查条件并确定升级版本:

kubeadm upgrade plan

您应该看到如下内容:

Upgrade to the latest stable version:

COMPONENT            CURRENT   AVAILABLE
API Server           v1.11.3   v1.12.0
Controller Manager   v1.11.3   v1.12.0
Scheduler            v1.11.3   v1.12.0
Kube Proxy           v1.11.3   v1.12.0
CoreDNS              1.1.3     1.2.2
Etcd                 3.2.18    3.2.24

叠加控制平面节点

升级第一个控制平面节点

为该控制平面节点修改 configmap/kubeadm-config 文件:

kubectl get configmap -n kube-system kubeadm-config -o yaml > kubeadm-config-cm.yaml

在编辑器中打开文件并替换以下值:

您还必须将另一个参数(initial-cluster-state: existing)传递给 etcd.local.extraArgs。

kubectl apply -f kubeadm-config-cm.yaml --force

开始升级:

kubeadm upgrade apply v<YOUR-CHOSEN-VERSION-HERE>

您应该看到如下内容:

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

kubeadm-config ConfigMap 现在从 v1alpha2 版本更新为 v1alpha3

升级其他控制平面节点

每个额外的控制平面节点都需要与第一个控制平面节点做不同的修改。运行:

kubectl get configmap -n kube-system kubeadm-config -o yaml > kubeadm-config-cm.yaml

在编辑器中打开文件并为 ClusterConfiguration 替换以下值:

这应该更新为本地节点的 IP 地址。

这应该更新为本地节点的 IP 地址。

您还必须修改 ClusterStatus, 为 apiEndpoints 下的当前主机添加映射。

将 cri-socket 的注解添加到当前节点,例如使用 docker:

kubectl annotate node <nodename> kubeadm.alpha.kubernetes.io/cri-socket=/var/run/dockershim.sock

在节点上应用修改后的 kubeadm-config:

kubectl apply -f kubeadm-config-cm.yaml --force

开始升级:

kubeadm upgrade apply v<YOUR-CHOSEN-VERSION-HERE>

您应该看到如下内容:

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

外部 etcd

升级每个控制平面

获取用于创建集群的 kubeadm 配置的副本。所有节点的配置应该相同。在升级开始之前,配置必须存在于每个控制平面节点上。

# 在每个控制平面节点上
kubectl get configmap -n kube-system kubeadm-config -o jsonpath={.data.MasterConfiguration} > kubeadm-config.yaml

在编辑器中打开文件并设置 api.advertiseAddress 为本地节点的 IP 地址。

现在,在每个控制平面节点上分别执行升级命令。

kubeadm upgrade apply v1.12.0 --config kubeadm-config.yaml

升级 etcd

Kubernetes v1.11 至 v1.12 只将 etcd 的 patch 版本从 v3.2.18 更改为 v3.2.24。这是一个滚动升级,没有停机时间,因为您可以在同一个集群中运行两个版本。

在第一台主机上,修改 etcd 清单:

sed -i 's/3.2.18/3.2.24/' /etc/kubernetes/manifests/etcd.yaml

等待 etcd 进程重新连接。其他 etcd 节点日志中将出现错误警告。这是预料之中的。

在其他 etcd 主机上重复此步骤。

下一步

手动升级您的 CNI 提供商

您的容器网络接口(CNI)提供程序可能有自己的升级说明。检查插件页面找到您的 CNI 提供商,看看是否需要采取其他升级步骤。

更新 kubelet 和 kubectl 包

通过在每个节点上运行以下命令来升级 kubelet 和 kubectl:

# 使用你的发行版软件包管理器,例如基于 Debian 系统上的 'apt-get' 
# 对于版本,基于 kubeadm 的输出来设置(参见上文)
apt-mark unhold kubelet kubectl && \
apt-get update && \
apt-get install kubelet=<NEW-K8S-VERSION> kubectl=<NEW-K8S-VERSION> && \
apt-mark hold kubelet kubectl && \
systemctl restart kubelet

本例假设使用一个基于 deb 的系统,并使用 apt-get 安装升级后的软件。在基于 rpm 的系统上,对于所有软件包都使用 yum install <PACKAGE>=<NEW-K8S-VERSION> 命令。

验证新版本的 kubelet 是否正在运行:

systemctl status kubelet

无论当前路径在哪里,使用 kubectl 运行以下命令,再次验证已升级的节点是否可用:

kubectl get nodes

如果对于升级后的主机其 STATUS 列显示 Ready,则可以继续;否则您可能需要重复该命令,直到节点显示 Ready

如果出现问题

如果升级失败,请检查是否符合以下列出的可能场景:

您可以再次运行 kubeadm upgrade apply,因为它是幂等的,最终应该确保实际状态是您声明的期望状态。您可以运行 kubeadm upgrade apply 并设置参数 --force 请求”更新”正在运行的集群(从 x.x.x --> x.x.x ),尝试从错误状态中恢复。

反馈