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

简介: 本文记录了一次将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好用得多。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
154 9
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
6月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
609 33
|
6月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
341 19
|
6月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
9月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
6月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
201 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
|
8月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
7月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
9月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
666 13

推荐镜像

更多