契机是要装 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.100(easzlab.io.local:5000 → 10.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。
目录
- 要解决什么
- kubeasz 不能当全家桶
- 先备份,再改 K8S_VER
- Kubernetes 只换二进制
- Rook 先到 1.17,Ceph 数据面不动
- Calico / DNS:私仓双路径
- etcd 一台一台换
- containerd 换二进制,不动 toml
- 平台组件没为 1.33 动
- 时间线(CST,UTC+8)
- 08-23 04:01 对照
- 备份还在哪
要解决什么
七个节点当时全部 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。
必须跟的只有两层:
- Kubernetes 控制面和 kubelet 到 1.33.1。这是指定目标。
- 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 -D。ezdown 里的 get_kubeasz() 对已有安装只有两种结果:
/etc/kubeasz/roles/kube-node已经在:打一行kubeasz already existed,整段跳过,roles 还是 3.6.6。- 目录不在:先把
down/、bin/挪到/tmp,然后rm -rf /etc/kubeasz。clusters/不会跟着挪走,现网 inventory、证书、etcd 备份会一起没掉。
所以当晚只换了 easzlab/kubeasz:3.6.7 容器,并覆盖 roles/、playbooks/、ezctl。clusters/、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:56,config.yml 备份成 config.yml.bak.K8S_VER-1.32.3,再把 K8S_VER 改成 1.33.1。ezctl 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.db、snapshot_202608230044.db。
Kubernetes 只换二进制
kubeasz 文档把 1.32.3 → 1.33.1 这种 跨 minor 写成「不建议」。官方 Kubernetes 升级路径本来就是一次一个 minor。风险在 API 和插件,不在 ezctl upgrade 会不会把 1.32 二进制覆盖成 1.33。93.upgrade.yml 做的事很窄:
- 对照现网
kube-apiserver --version和控制端/etc/kubeasz/bin里的版本,相同就中止。 - 先对
[kube_master]跑kube-master+kube-node。 - 再对
[kube_node]里、又不在 master 组的节点跑kube-node。
控制端:
docker exec kubeasz ezctl upgrade cyxck8s-01ezctl upgrade 开始的墙钟时间没有单独记。VERSION.txt 在 00:54 仍写着 cluster_nodes=still v1.32.3;08-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/node、easzlab/cni、easzlab/kube-controllers、easzlab/coredns。私仓里旧路径还在,新路径当时没有。模板本身 没改,是往私仓按新路径补 push。
01:52 先把 tar 灌进私仓,当时 push 的还是旧路径(VERSION.txt 写明 cluster not applied):
easzlab.io.local:5000/calico/node:v3.28.4easzlab.io.local:5000/calico/cni:v3.28.4easzlab.io.local:5000/calico/kube-controllers:v3.28.4easzlab.io.local:5000/coredns/coredns:1.12.1easzlab.io.local:5000/easzlab/k8s-dns-node-cache:1.25.0旧 tar(calico_v3.28.3.tar、coredns_1.11.4.tar、k8s-dns-node-cache_1.23.1.tar)留着。
01:55 备份现网 yaml:
yml/calico.yaml.bak.v3.28.3yml/coredns.yaml.bak.1.11.4yml/nodelocaldns.yaml.bak.1.23.1config.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.4、coredns.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.4(easzlab/*) |
| CoreDNS | 1.11.4 | 1.12.1(easzlab/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.db、snapshot_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.3、coredns.yaml.bak.1.11.4、nodelocaldns.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 和逐台替换的精确钟点没有同等记录,文里标了不确定的地方。