将Kubernetes集群版本从1.18升级至1.24

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文记录了一次将Kubernetes集群从1.18.0版本升级到1.24.16版本的过程以及遇到的相关问题的解决。

将Kubernetes集群版本从1.18升级至1.24

1. 系统配置

虚拟机版本:VMware Workstation Pro 17

虚拟机镜像版本:CentOS Linux release 7.9.2009 (Core)

Docker版本:ce-20.10.11

旧Kubernetes版本:1.18.0

新Kubernetes版本:1.24.16

2. 版本区别

Kubernetes从1.20版本开始已经弃用了DockerShim,并在1.24版本移除了DockerShim,后续如果需要使用Docker作为容器运行时(Container Runtime),需要安装cri-docker,即一个CRI(Container Runtime Interface)的实现。

3. 升级过程
3.1 cri-docker的安装与配置

安装cri-docker作为CRI的实现:

# v0.3.4是2023年7月30日的新版本
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz

tar -xf cri-dockerd-0.3.4.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd

相关文件的配置:

cri-docker.service:

vim /usr/lib/systemd/system/cri-docker.service
# 写入下面的内容
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify

# 此阿里云地址需要联网,如果不能联网需要指定本地镜像仓库
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7

ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

StartLimitBurst=3

StartLimitInterval=60s

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

cri-docker.socket,这个文件配置了kubelet与cri-dockerd的通信:

vim /usr/lib/systemd/system/cri-docker.socket

# 写入下面的内容
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

配置Kubernetes使用cri-docker:

vim /var/lib/kubelet/kubeadm-flags.env
# 添加参数
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 --container-runtime=remote --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"

启动cri-docker服务:

systemctl daemon-reload
systemctl start cri-docker
3.2 Kubernetes集群版本的升级

开始升级前,需要注意:

1)新版本的Kubernetes不再使用docker作为默认的CRI实现,需要我们自己配置实现。

2)Kubernetes的集群升级不支持跨版本,即不能从1.18直接升级到1.24,具体可见https: //v1-24.docs.kubernetes.io/zh-cn/releases/version-skew-policy/

3)在1.24版本中,Kubernetes正式移除了关于DockerShim的相关配置,所以使用旧版本的配置启动Kubernetes会出现参数无法识别的问题。

上面的几个点都是博主在升级过程中遇到的错误,下面是升级的过程,具体也可以查看官方文档:https: //v1-24.docs.kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

如果集群还在工作,可以使用下面的指令腾空节点,腾空后该节点禁止被调度:

# 在主节点使用
# 主节点一般不运行pod,所以主要用来腾空工作节点
kubectl drain <nodeName> --ignore-daemonsets

# 升级完成后,解除腾空
kubectl uncordon <nodeName>

【主节点】

升级kubeadm版本:

# 由于不能跨版本升级,所以这里直接使用Kubernetes-1.18.0的下一个大版本1.19.0
yum install -y kubeadm-1.19.0-0 --disableexcludes=kubernetes

使用新版本的kubeadm查看更新计划:

# 这一步会检测你现在的环境、版本、配置等是否符合升级的要求
# 某些问题会提示你使用 --config 的方式进行配置解决
kubeadm upgrade plan

如果你想从1.18版本直接跳到1.24版本,那么它会提示:

[upgrade/config] FATAL: this ersion of kubeadm only supports deploying clusters with the control plane version >= 1.23.0. Current version: v1.18.0.

没有问题或解决完相关的问题后,进行集群的升级:

kubeadm upgrade apply v1.19.0
# 等待
...... successful

将kubelet和kubectl也更新到1.19.0

# 安装新版本的kubelet和kubectl
yum install -y kubelet-1.19.0-0 kubectl-1.19.0-0 --disableexcludes=kubernetes

# 服务重启
systemctl daemon-reload
systemctl restart kubelet

此时可以查看主节点的版本是否已经更新:

# 由于机器性能等原因,版本不一定会马上刷新,如版本未更新,可以等待一会查看
kubectl get nodes -o wide

【工作节点】

工作节点的大部分流程和主节点的流程一致,只是在集群升级上有出入:

# 主节点
kubectl upgrade apply v1.19.0

# 工作节点
kubectl upgrade node

由于不能跨版本升级,所以博主这里是一个大版本一个大版本升上去的,中间的过程基本一致,所以这里就省略到1.24版本的升级,如果升级途中有问题,可以查看下面的内容,下面内容记录了博主升级过程中遇到的错误。

3.3 问题总结

如果成功升级到1.24版本且每个节点的运行状态正常,可以忽略后续内容。

1)"--network-plugin"配置无法识别

到1.24版本,查看节点状态会发现每个节点都是"NotReady",即启动失败,此时查看kubelet.service的状态,会发现其没有"active"。

查看kubelet的相关日志:

journalctl -f -u kubelet
...
k8s-master: Error: failed to parse kubelet flag: unknown flag: --network-plugin

发现kubelet无法识别"--network-plugin"这个参数,因为该配置和"DockerShim"一起在Kubernetes的1.24版本移除了。(开始博主以为是某个TLS漏洞的问题,还将集群从1.23.0升级到1.23.17,以为是小版本跨越太多导致的,日志要认真从底下看,Error是最需要注意的)

发现问题后,需要去将配置中的"--network-plugin"删除:

# 找到 "--network-plugin" 删除即可
vim /var/lib/kubelet/kubeadm-flags.env

# 服务重启
systemctl restart kubelet

2)默认cgroupDriver未设置

在升级过程中,可能遇到下面的问题:

the value of KubeletConfiguration.cgroupDriver is empty; setting it to "systemd"

此时需要将在Kubelet的配置文件中设定默认"cgroupDriver"为"systemd"。

vim /etc/kubernetes/kubelet.conf
# or
vim /var/lib/kubelet/config.yaml

3)Docker版本问题

博主这里使用的Docker版本是ce-20.10.11,是Kubernetes认可的比较新的稳定版本,如果出现Docker有关的问题,可以尝试将Docker升级或降级到ce-20.10版本。

4)不要太相信AI

开始升级前,我去“请示”了一下copilot如何从1.18升级到1.24,它告诉我直接拉取1.24版本的kubeadm然后upgrade,这当然是错的,跨版本问题和CRI实现问题copilot都没有提出,当然,这也浪费了我的许多时间,许多情况下,百度和官方文档比AI好用得多。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
21天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
90 17
|
13天前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
113 1
|
15天前
|
Kubernetes Linux 开发工具
centos7通过kubeadm安装k8s 1.27.1版本
centos7通过kubeadm安装k8s 1.27.1版本
|
18天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
59 1
|
18天前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
36 1
|
23天前
|
Kubernetes Cloud Native Ubuntu
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第65天】本文将带你进入云原生的世界,通过一步步指导如何在本地环境中搭建Kubernetes集群,并部署一个简单的应用。我们将使用Minikube和Docker作为工具,探索云原生技术的魅力所在。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和实践技巧。
|
9天前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
|
15天前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
58 0
|
16天前
|
弹性计算 Kubernetes Linux
如何使用minikube搭建k8s集群
如何使用minikube搭建k8s集群
|
20天前
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。