3. 升级前网络状态确认
在集群升级操作启动之前,必须对租户网络的当前健康状态进行基线化确认。升级前的网络状态快照既是判断升级是否成功的参照系,也是升级后出现故障时进行回退或隔离的决策依据。本节从连通性测试、策略验证和日志采集三个维度,讲解如何构建可复现、可审计的升级前网络健康检查流程。
3.1 连通性测试:端到端可达性基线
连通性测试的目标是验证租户 Pod、Service、NodePort 以及外部入口之间的 L3/L4 可达性。建议采用分层测试策略,逐层确认,避免将底层网络问题误判为升级后故障。
| 测试层级 | 测试对象 | 典型命令/工具 | 预期结果 |
|---|---|---|---|
| L2 同节点 | 同节点 Pod ↔ Pod | kubectl exec -n tenant-a -- ping <peer-pod-ip> |
延迟 < 2ms,丢包率 0% |
| L3 跨节点 | 跨节点 Pod ↔ Pod | kubectl exec -n tenant-a -- ping <peer-pod-ip-on-other-node> |
延迟 < 5ms,丢包率 0% |
| L4 Service | Pod ↔ ClusterIP | kubectl exec -n tenant-a -- curl -m 3 http://<svc-cluster-ip>:<port> |
HTTP 200 / TCP 连接建立 |
| L4 NodePort | 外部节点 ↔ NodeIP:NodePort | curl -m 3 http://<node-ip>:<node-port> |
HTTP 200 / TCP 连接建立 |
| L7 Ingress | 外部域名 ↔ Ingress ↔ Service | curl -H "Host: app.tenant-a.example.com" https://<ingress-ip> |
HTTP 200,响应体正确 |
基线记录要求: 将每一层测试的延迟、丢包率、HTTP 状态码、响应时间写入结构化日志或 CMDB 事件记录。升级后对比时,若延迟增加超过 50% 或出现丢包,应视为网络退化。
3.2 策略验证:网络策略与安全组规则快照
升级前必须确认租户隔离策略(NetworkPolicy、安全组、ACL)处于生效状态,且规则集合与预期一致。策略验证的核心是“规则覆盖率”与“规则冲突检测”。
3.2.1 NetworkPolicy 生效性检查
使用 kubectl describe networkpolicy 确认策略已正确应用到目标 Namespace,并通过临时诊断 Pod 验证策略是否实际阻断/放行了预期流量。
# 检查策略是否被正确解析
kubectl get networkpolicy -n tenant-a -o wide
# 使用 netshoot 诊断 Pod 验证隔离效果
kubectl run -n tenant-a tmp-netshoot --image=nicolaka/netshoot -- sleep 3600
kubectl exec -n tenant-a tmp-netshoot -- curl -m 3 http://<forbidden-svc>:<port>
# 预期:连接超时或被拒绝(符合策略预期)
3.2.2 安全组与 ACL 快照
对于使用云厂商 CNI(如 AWS VPC CNI、Azure CNI)或底层 SDN 的场景,需同步采集安全组/ACL 规则快照,并与 NetworkPolicy 进行双向校验。
| 策略类型 | 采集命令/方法 | 校验要点 |
|---|---|---|
| K8s NetworkPolicy | kubectl get netpol -n tenant-a -o yaml |
podSelector、ingress/egress 规则、端口范围 |
| AWS 安全组 (ENI) | aws ec2 describe-security-groups --group-ids <sg-id> |
源/目标 CIDR、协议、端口;与 NetPol 无冲突 |
| Azure NSG | az network nsg rule list --nsg-name <nsg> |
优先级、方向、源/目标 IP 组 |
| 底层 SDN ACL | SDN 控制器 API 导出 | 租户隔离标签、VNI/VXLAN 映射 |
常见陷阱: 升级过程中 CNI 组件重启可能导致 NetworkPolicy 控制器重新计算规则,若底层安全组未同步更新,会出现“策略漂移”。升级前务必保存安全组规则的 JSON/YAML 快照,并计算其哈希值用于升级后比对。
3.3 日志采集:网络事件与指标基线
升级前的日志和指标基线是故障定位的“时间锚点”。建议在升级前至少采集以下三类数据:
- CNI 组件日志: 采集 kube-system 命名空间下所有 CNI 相关 Pod(如 calico-node、cilium-agent、aws-node)最近 30 分钟的日志,重点关注
error、warning、timeout关键字。 - 网络指标基线: 使用 Prometheus 或 kubectl top 记录租户 Pod 的
网络入/出带宽、TCP 重传率、连接数、丢包率。建议持续采集 15 分钟以获取稳定基线。 - 关键事件日志: 采集 kube-apiserver 审计日志中与租户 Namespace 相关的
NetworkPolicy、Service、Endpoint变更事件,时间窗口为升级前 1 小时。
3.4 检查清单与自动化建议
将上述检查项整理为可执行的 Shell 脚本或 Operator,确保每次升级前自动运行并输出通过/失败状态。
#!/bin/bash
# upgrade-preflight-network-check.sh
# 用法:./upgrade-preflight-network-check.sh <namespace>
NAMESPACE=$1
echo "[1/5] 连通性测试:同节点 Pod ↔ Pod"
# ... 执行 ping 测试并记录结果
echo "[2/5] 连通性测试:跨节点 Pod ↔ Pod"
# ... 执行 ping 测试并记录结果
echo "[3/5] 连通性测试:Service ClusterIP 可达"
# ... 执行 curl 测试并记录结果
echo "[4/5] 策略验证:NetworkPolicy 规则快照"
kubectl get networkpolicy -n $NAMESPACE -o yaml > pre-upgrade-netpol-$NAMESPACE.yaml
echo "[5/5] 日志采集:CNI 组件日志归档"
kubectl logs -n kube-system -l k8s-app=calico-node --tail=5000 > pre-upgrade-cni-logs.txt
echo "升级前网络健康检查完成。请检查 pre-upgrade-* 文件。"
关键交付物: 升级前网络健康检查应输出以下文件,并纳入升级变更单的附件:
pre-upgrade-connectivity-<namespace>.json— 分层连通性测试结果pre-upgrade-netpol-<namespace>.yaml— NetworkPolicy 快照pre-upgrade-cni-logs.txt— CNI 组件日志归档pre-upgrade-metrics-baseline.csv— 网络指标基线(带宽、重传率、连接数)