4. 升级前环境准备:Kubernetes集群版本确认、Cilium当前版本检查、etcd/CRI兼容性验证

在实施Cilium CNI升级之前,必须对现有环境进行全面的基线检查。跳过环境准备直接升级,可能导致集群网络中断、租户隔离策略失效,甚至数据面不可逆损坏。本章聚焦三个核心维度:Kubernetes版本兼容性、Cilium当前版本状态、etcd与CRI运行时兼容性。

操作原则:所有检查命令应在集群的控制平面节点上执行,并确保kubectl上下文指向目标集群。建议在非生产环境先完成一次完整的升级演练。

4.1 Kubernetes集群版本确认

Cilium对Kubernetes API有严格的版本依赖。升级前必须确认集群版本是否在目标Cilium版本的支持矩阵内。使用以下命令获取集群版本信息:

# 获取集群版本(Server Version)
kubectl version --short

# 获取所有节点kubelet版本
kubectl get nodes -o wide

# 获取API Server版本详情
kubectl get --raw /version | jq .

以下表格列出了Cilium 1.14/1.15/1.16对Kubernetes版本的最低要求与推荐版本:

Cilium版本 最低K8s版本 推荐K8s版本 备注
1.14.x 1.21 1.24 – 1.27 支持IPv4/IPv6双栈
1.15.x 1.23 1.25 – 1.28 引入BGP Control Plane v2
1.16.x 1.25 1.27 – 1.30 支持Gateway API v1.0
风险提示:如果集群版本低于Cilium要求的最低版本,升级Cilium会导致API Server与Cilium Operator之间的CRD通信失败,租户隔离策略(CiliumNetworkPolicy)将无法同步。此时应先升级Kubernetes集群。
Kubernetes版本兼容性检查流程 kubectl version --short 解析 Server Version 比对Cilium支持矩阵 版本不满足 → 先升级K8s 版本满足 → 继续下一步 检查所有控制平面与工作节点版本是否一致 异构版本集群需额外验证kube-proxy兼容性

4.2 Cilium当前版本检查

在升级前,必须精确记录当前运行的Cilium版本、Helm Release配置以及DaemonSet状态。这为升级后的回滚提供基线。

# 检查Cilium DaemonSet使用的镜像版本
kubectl -n kube-system get ds cilium -o jsonpath='{.spec.template.spec.containers[0].image}'

# 通过Helm查看当前部署参数(推荐)
helm get values cilium -n kube-system

# 查看Cilium版本详情
kubectl -n kube-system exec ds/cilium -- cilium version

# 检查Cilium Operator版本
kubectl -n kube-system get deployment cilium-operator -o jsonpath='{.spec.template.spec.containers[0].image}'

记录以下关键信息到升级清单中:

  • Cilium Agent版本:例如 v1.14.5
  • Cilium Operator版本:通常与Agent版本一致
  • Helm Chart版本:例如 1.14.5
  • 内核模块版本:cilium status 中的BPF相关字段
  • 配置参数差异:与默认值的diff
关键检查项:如果当前Cilium版本低于1.12,升级路径需要先升级到1.12 LTS版本,再跳转到目标版本。跨大版本升级(如1.11→1.15)必须分步执行,否则CRD迁移会失败。

4.3 etcd兼容性验证

Cilium使用etcd存储集群状态(如Identity、Endpoint、IPAM分配)。etcd版本必须与Kubernetes及Cilium的客户端库兼容。验证方法如下:

# 获取etcd集群版本
kubectl -n kube-system get pods -l component=etcd -o jsonpath='{.items[0].spec.containers[0].image}'

# 或通过etcdctl直接查询(需在etcd Pod内执行)
kubectl -n kube-system exec etcd-master -- etcdctl version

# 检查Cilium与etcd的连接状态
kubectl -n kube-system exec ds/cilium -- cilium status | grep -i etcd

etcd版本兼容性对照表:

Kubernetes版本 推荐etcd版本 Cilium兼容etcd版本 注意事项
1.24 – 1.26 3.5.6 – 3.5.9 3.4.x, 3.5.x 避免使用3.4.22以下版本(存在watch泄漏)
1.27 – 1.28 3.5.9 – 3.5.12 3.5.x 需启用gRPC keepalive
1.29 – 1.30 3.5.12+ 3.5.10+ 强制TLS 1.3支持
etcd升级警告:如果etcd版本低于3.5.0,Cilium的Identity GC可能因watch事件丢失导致租户标识残留。建议在Cilium升级前先将etcd升级到3.5.x LTS版本。

4.4 CRI运行时兼容性验证

Cilium通过CRI(Container Runtime Interface)与容器运行时交互,获取Pod网络命名空间信息。不同CRI实现(containerd、CRI-O、Docker)对CNI插件的调用方式存在差异。

# 检查集群使用的CRI运行时
kubectl get nodes -o jsonpath='{.items[0].status.nodeInfo.containerRuntimeVersion}'

# 检查containerd版本(如果使用containerd)
crictl version

# 验证Cilium与CRI的通信状态
kubectl -n kube-system logs -l k8s-app=cilium --tail=20 | grep -i "cri\|containerd\|runtime"

CRI兼容性检查清单:

  • containerd:推荐 ≥ 1.6.18,支持CNI v1.0.0规范
  • CRI-O:推荐 ≥ 1.26.0,需验证conmonrs版本
  • Docker:仅适用于K8s ≤ 1.24,Cilium 1.14+已弃用Docker CRI适配器
  • CRI-Dockerd:如果使用Docker作为运行时,必须使用cri-dockerd ≥ 0.3.0
CRI运行时与Cilium CNI交互架构 Kubelet CRI Shim 容器运行时 Cilium CNI Plugin Pod NetNS Cilium通过CRI获取Pod Sandbox ID 再调用CNI ADD将网络接口插入Pod NetNS

4.5 环境准备检查清单

将以下清单作为升级前环境准备的最终验收标准,逐项确认后签字:

检查项 命令/方法 通过标准 状态
K8s版本 kubectl version --short ≥ 1.25(Cilium 1.16) ☐
Cilium版本 cilium version 记录当前版本号 ☐
etcd版本 etcdctl version ≥ 3.5.0 ☐
CRI运行时 crictl version containerd ≥ 1.6.18 ☐
Helm Release helm get values 备份当前values.yaml ☐
集群健康 kubectl get nodes 所有节点Ready ☐
最佳实践:在完成上述所有检查后,建议执行一次全量备份,包括etcd快照、Cilium Helm values、以及所有Cilium CRD资源(CiliumNetworkPolicy、CiliumEndpoint等)。备份命令示例:etcdctl snapshot save /backup/etcd-snapshot.db。