跳到正文
cyxc.club

七台虚机上把 Kubernetes 升到 1.33.1

/ 约 10 分钟

契机是要装 GitLab 19。Operator 对 Kubernetes 1.32 已经标 Deprecated,1.33 才是 Supported。当时还是 1.32.3,kubeasz 下一档 3.6.7 对应 1.33.1,所以先把 K8s 升到这一档再装。

换底座之前先把版本升完。2026-08-22 夜里到 08-23 凌晨,集群 cyxck8s-01 还在 7 台 Ubuntu 24.04 虚机上,控制端和私仓都在 10.1.4.100easzlab.io.local:500010.1.4.100:5000)。目标按指定写成 v1.33.1。kubeasz 3.6.7 对应的就是这一版。

Kubernetes 1.33 官方维护窗口在 2026-06-28 已经结束。仍然升 1.33.1,没有接着走 1.34 / 1.35。一周后才把节点换成三台裸机,那是另一篇:把跑在 PVE 里的 Kubernetes 换成三台物理机。这篇只写 08-23 这一夜:哪些必须跟、哪些刻意不动、kubeasz 文档里哪几条不能照做。

当时版本 Rook v1.16.6 Ceph Squid 19.2.1(3 mon / 6 OSD) Calico v3.28.3(etcd datastore,IPIP Always) etcd 3.5.20 containerd 2.0.4 kubeasz 3.6.6。 kube-proxy IPVS。Pod CIDR 172.20.0.0/16,Service 10.68.0.0/16

目录


要解决什么

七个节点当时全部 Ready、可调度:

角色 节点 地址
master / etcd k8s-10-1-4-100 10.1.4.100
master / etcd k8s-10-1-4-101 10.1.4.101
master / etcd k8s-10-1-5-100 10.1.5.100
worker k8s-10-1-4-102 / k8s-10-1-4-103 10.1.4.102 / .103
worker k8s-10-1-5-101 / k8s-10-1-5-102 10.1.5.101 / .102

inventory 里 [kube_node] 只有 4 个 worker。三台 master 不在这个组里。ezctl upgrade 会把不在 [kube_node] 的 master cordon,这是 kubeasz 的默认行为,不是事故。升完再 kubectl uncordon

必须跟的只有两层:

  1. Kubernetes 控制面和 kubelet 到 1.33.1。这是指定目标。
  2. Rook operator 到 1.17。1.16.6 不声明支持 1.33;1.17.9 是当时 1.17 的最后一版。

其余(Calico / CoreDNS / node-local-dns / etcd / containerd)跟 kubeasz 3.6.7 对齐,属于建议项,当晚一起做了。Ceph 数据面、runc、metrics-server,以及已有的证书 / Ingress / 监控 / 数据库 operator,兼容性结论是 不必为 1.33 单独升级,就没动。


kubeasz 不能当全家桶

3.6.6 → 3.6.7 不是跑一遍 ezdown -Dezdown 里的 get_kubeasz() 对已有安装只有两种结果:

  • /etc/kubeasz/roles/kube-node 已经在:打一行 kubeasz already existed整段跳过,roles 还是 3.6.6。
  • 目录不在:先把 down/bin/ 挪到 /tmp,然后 rm -rf /etc/kubeaszclusters/ 不会跟着挪走,现网 inventory、证书、etcd 备份会一起没掉。

所以当晚只换了 easzlab/kubeasz:3.6.7 容器,并覆盖 roles/playbooks/ezctlclusters/bin/down/ 没让脚本碰。旧代码当时在 /etc/kubeasz.code.bak.3.6.6/(这篇写的时候那个目录已经不在了)。hosts.bak.3.6.7-upstream 还在。

kubeasz 3.6.7 发布说明对齐的版本就是当晚要的那一组:k8s v1.33.1、etcd 3.5.21、containerd 2.1.1、Calico v3.28.4、CoreDNS 1.12.1、dnsNodeCache 1.25.0。runc 仍是 1.2.6,metrics-server 仍是 v0.7.2,这两项 3.6.7 默认也没变,所以本轮不动。

另外三条也不能按文档的「setup」走:

文档里的做法 现网会怎样
ezctl setup network roles/calico 会重签 Calico 证书、删掉重建 calico-etcd-secrets
ezctl setup cluster-addon 已有 CoreDNS / node-local-dns / metrics-server 的名字在 kubectl get pod 里,直接跳过,镜像不会换
ansible-playbook -t upgrade_etcd playbooks/02.etcd.yml 三台 etcd 一起 systemctl restart

Calico / DNS 是改 yaml 再 kubectl apply。etcd 是逐台停服务、换二进制、再起。


先备份,再改 K8S_VER

控制端当时还在 4.100。二进制和配置的时间戳写在各目录的 VERSION.txt 里(UTC),下面换成 CST。

08-23 00:54,从镜像 easzlab/kubeasz-k8s-bin:v1.33.1 取出控制面二进制。旧的 1.32.3 放到 /etc/kubeasz/bin.bak.v1.32.3/,新的放到 /etc/kubeasz/bin/,另外留一份 /etc/kubeasz/bin.v1.33.1/。当时节点上跑的还是 1.32.3。

00:56config.yml 备份成 config.yml.bak.K8S_VER-1.32.3,再把 K8S_VER 改成 1.33.1ezctl upgrade 看的是 /etc/kubeasz/bin 里的 kube-apiserver --version,不是只改这一行;但 inventory 渲染、以后加节点都会读 K8S_VER,所以要先改、先留备份。

00:57,etcd 快照:

/etc/kubeasz/clusters/cyxck8s-01/backup/snapshot_202608230057.db

同时复制成 snapshot.db。revision 126432817,5791 keys,约 72MB,hash 5dc3bb0b。三成员 10.1.4.100 / 10.1.4.101 / 10.1.5.100 当时都 healthy。同目录里还有更早的 snapshot_202608222320.dbsnapshot_202608230044.db


Kubernetes 只换二进制

kubeasz 文档把 1.32.3 → 1.33.1 这种 跨 minor 写成「不建议」。官方 Kubernetes 升级路径本来就是一次一个 minor。风险在 API 和插件,不在 ezctl upgrade 会不会把 1.32 二进制覆盖成 1.33。93.upgrade.yml 做的事很窄:

  1. 对照现网 kube-apiserver --version 和控制端 /etc/kubeasz/bin 里的版本,相同就中止。
  2. 先对 [kube_master]kube-master + kube-node
  3. 再对 [kube_node] 里、又不在 master 组的节点跑 kube-node

控制端:

Terminal window
docker exec kubeasz ezctl upgrade cyxck8s-01

ezctl upgrade 开始的墙钟时间没有单独记。VERSION.txt 在 00:54 仍写着 cluster_nodes=still v1.32.308-23 04:01 对照时,7 个节点的 apiserver / controller-manager / scheduler / kubelet / kube-proxy 已经都是 v1.33.1,readyz / livez 通过。

升完三台 master 会处于 SchedulingDisabled,把它们 uncordon 即可。[kube_node] 仍然只有那 4 个 worker,没有改 inventory。


Rook 先到 1.17,Ceph 数据面不动

Rook v1.16.6 → v1.17.9。先升 operator chart,再升 cluster chart。默认 StorageClass 仍是 ceph-block

Ceph 镜像当晚 刻意停在 Squid 19.2.1。3 mon / 6 OSD,HEALTH_OK。operator 换了,OSD 守护进程的 Ceph 版本没有跟。后来裸机替换和扩盘把数据面带到了 19.2.3,那是 08-30 之后的事,见 把跑在 PVE 里的 Kubernetes 换成三台物理机,不要和这一夜混。

Rook 这次 helm 的精确钟点没有单独留下。04:01 对照时 operator 已经是 1.17.9。


Calico / DNS:私仓双路径

3.6.7 模板把镜像路径从旧的 calico/*coredns/coredns 改成了 easzlab/nodeeaszlab/cnieaszlab/kube-controllerseaszlab/coredns。私仓里旧路径还在,新路径当时没有。模板本身 没改,是往私仓按新路径补 push。

01:52 先把 tar 灌进私仓,当时 push 的还是旧路径(VERSION.txt 写明 cluster not applied):

easzlab.io.local:5000/calico/node:v3.28.4
easzlab.io.local:5000/calico/cni:v3.28.4
easzlab.io.local:5000/calico/kube-controllers:v3.28.4
easzlab.io.local:5000/coredns/coredns:1.12.1
easzlab.io.local:5000/easzlab/k8s-dns-node-cache:1.25.0

旧 tar(calico_v3.28.3.tarcoredns_1.11.4.tark8s-dns-node-cache_1.23.1.tar)留着。

01:55 备份现网 yaml:

yml/calico.yaml.bak.v3.28.3
yml/coredns.yaml.bak.1.11.4
yml/nodelocaldns.yaml.bak.1.23.1
config.yml.bak.before-calico-dns-bump

现网最后 apply 的是 3.6.7 那条 easzlab/* 路径,tag 为 Calico v3.28.4、CoreDNS 1.12.1、node-local-dns 1.25.0。中间有一份 yaml 备份还停在旧路径的 3.28.4 / 1.12.1(calico.yaml.bak.path-calico-v3.28.4coredns.yaml.bak.path-coredns-coredns-1.12.1),说明先按旧路径能拉起来,再切到模板路径。

没有跑 ezctl setup network,也没有跑 ezctl setup cluster-addon。网络仍是 Calico etcd datastore + IPIP Always。


etcd 一台一台换

02:20,控制端 etcd 二进制换成 3.5.21(来源是 GitHub etcd-v3.5.21-linux-amd64.tar.gz),3.5.20 备份在 /etc/kubeasz/bin.bak.etcd.v3.5.20/。各节点旧二进制在 /opt/kube/bin.bak.etcd.v3.5.20/

-t upgrade_etcd 会在三台机器上连续 copy 二进制、写 unit、systemctl restart etcd。三节点 etcd 经不起一起重启。实际是逐台:停服务 → 换 /opt/kube/bin 里的 etcd / etcdctl → 再起,确认 member healthy 再动下一台。

04:01 时三成员都是 3.5.21,leader 在 10.1.4.100。逐台切换的墙钟没有逐台记下。


containerd 换二进制,不动 toml

02:26,containerd 2.0.4 → 2.1.1,来源 easzlab/kubeasz-ext-bin:1.12.5。二进制在 /opt/kube/bin/containerd-bin/。控制端备份 /etc/kubeasz/bin/containerd-bin.bak.v2.0.4/,各节点同名 bak,以及 containerd.service.bak.v2.0.4

没有改 /etc/containerd/config.toml。3.6.6 已经在用 containerd 2.0,配置文件大版本那一跳发生在更早;2.0.4 → 2.1.1 只换二进制。runc 仍是 1.2.6(3.6.7 默认也是这个)。unit 带 --log-level warn,这是 3.6.7 为 exec 类健康检查打日志太多做的修复,不是配置文件改动。


平台组件没为 1.33 动

已有的证书、Ingress、监控、数据库 operator 当晚核对过兼容性,不必为 1.33 单独升,版本保持原样。metrics-server 3.6.7 默认仍是 v0.7.2,也没动。


时间线(CST,UTC+8)

VERSION.txt 的是文件写入时间。ezctl upgrade、逐台 etcd、逐台 containerd、Rook helm、kubeasz 容器替换没有同等精度的钟点,只知道都在 04:01 对照之前做完。

时间 做什么
08-22 23:20 已有 etcd 快照 snapshot_202608222320.db
08-23 00:44 再一份快照 snapshot_202608230044.db
00:54 1.32.3 二进制备份;1.33.1 放入 /etc/kubeasz/bin(节点仍是 1.32.3)
00:56 config.yml 备份;K8S_VER 改成 1.33.1
00:57 etcd 快照 snapshot_202608230057.db(三成员 healthy)
00:57 之后 ezctl upgrade cyxck8s-01;master cordon 后再 uncordon
01:52 Calico 3.28.4 / CoreDNS 1.12.1 / node-local-dns 1.25.0 镜像进私仓(当时仍是旧路径)
01:55 备份现网 Calico / DNS yaml
01:55 之后 apply 到 easzlab/* 路径;未跑 setup network / cluster-addon
02:20 etcd 3.5.21 二进制就位;随后逐台替换
02:26 containerd 2.1.1 二进制就位;未改 config.toml
04:01 对照:7/7 kubelet v1.33.1,Rook v1.17.9,Ceph 19.2.1 HEALTH_OK,0 个异常 Pod,kubeasz 3.6.7

08-23 04:01 对照

组件 升级前 04:01
Kubernetes(7 节点) v1.32.3 v1.33.1
Rook Operator v1.16.6 v1.17.9
Ceph 数据面 19.2.1 19.2.1(未升)
Calico v3.28.3 v3.28.4easzlab/*
CoreDNS 1.11.4 1.12.1easzlab/coredns
node-local-dns 1.23.1 1.25.0
etcd 3.5.20 3.5.21(leader 10.1.4.100
containerd 2.0.4 2.1.1
runc 1.2.6 1.2.6
kubeasz 3.6.6 3.6.7

没有继续升 1.34 / 1.35。以后要安全补丁,走 kubeasz 3.6.8 / 3.6.9,不要在 1.33 上再找补丁号。


备份还在哪

内容 路径
etcd 快照 /etc/kubeasz/clusters/cyxck8s-01/backup/(含 snapshot_202608222320.dbsnapshot_202608230057.db
控制端 bin 1.32.3 /etc/kubeasz/bin.bak.v1.32.3/
控制端 bin 1.33.1 副本 /etc/kubeasz/bin.v1.33.1/
config.yml 1.32.3 clusters/cyxck8s-01/config.yml.bak.K8S_VER-1.32.3
Calico / DNS 原 yaml yml/calico.yaml.bak.v3.28.3coredns.yaml.bak.1.11.4nodelocaldns.yaml.bak.1.23.1
etcd 3.5.20 /etc/kubeasz/bin.bak.etcd.v3.5.20/,各节点 /opt/kube/bin.bak.etcd.v3.5.20/
containerd 2.0.4 /etc/kubeasz/bin/containerd-bin.bak.v2.0.4/,各节点同名 bak、containerd.service.bak.v2.0.4

来源:控制端 VERSION.txt、现网 yaml、08-23 04:01 对照(kubectl / etcdctl / ceph -s)。Rook helm 和逐台替换的精确钟点没有同等记录,文里标了不确定的地方。