news 2026/9/30 2:50:39

K8s集群超大集群Calico故障批量处置实操

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
K8s集群超大集群Calico故障批量处置实操

K8s集群超大集群Calico故障批量处置实操

技术栈:Kubernetes v1.32.13 + Rocky Linux 8.6 + Calico网络组件 + Containerd 1.7.x

操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案

K8s集群超大集群Calico故障批量处置实操

操作环境

  • K8s 集群 3 节点:k8s-master(192.168.1.10), k8s-node1(192.168.1.11), k8s-node2(192.168.1.12),K8s 版本 v1.32.13

  • 网络组件:Calico网络策略,已部署对应网络组件 Pod,CNI 插件已配置,容器运行时 Containerd 1.7.x

  • 操作系统 Rocky Linux 8.6,内核版本已适配网络需求,已加载必要内核模块(br_netfilter、vxlan、ip_tables 等)

  • 集群网络规划:Pod 网段、Service 网段、节点网络已规划完毕,无网段冲突,DNS 服务正常运行

  • 已配置监控告警体系(Prometheus + Grafana),网络指标可采集,具备日志归集和故障排查能力

对接原理

K8s集群超大集群Calico故障批量处置实操是 K8s 集群网络系统运维中的核心操作场景。K8s 网络体系通过 CNI(Container Network Interface)插件实现 Pod 网络的创建和管理,网络组件负责集群内 Pod 间通信、Pod 与 Service 间通信、以及集群内外网络互通。Calico网络策略作为具体的网络组件,为集群提供网络连通性、网络策略、负载均衡或入口路由能力。运维操作的核心目标是确保网络的可用性、性能、安全性和可管理性:通过规范化的网络配置确保 Pod 间通信正常,通过网络策略实现访问控制和安全隔离,通过负载均衡和 Ingress 实现流量分发和外部访问,通过监控告警和日志分析实现故障快速定位,通过自动化脚本和 SOP 提升运维效率。所有操作需遵循业务无感知原则,对生产网络的变更采用灰度和滚动方式,避免影响业务运行。

详细步骤

1. 网络现状盘点与连通性检查

# 1. 检查集群节点状态 kubectl get nodes -o wide kubectl get pods -n kube-system -o wide ​ # 2. 检查网络组件状态 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' kubectl get pods -A | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' ​ # 3. 检查网络连通性 # 节点间连通性 for node in k8s-master k8s-node1 k8s-node2; do echo "=== 检查 $node ===" kubectl get node $node -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' echo "" done ​ # Pod 间连通性测试 kubectl run net-test-1 --image=busybox --restart=Never -- sleep 3600 kubectl run net-test-2 --image=busybox --restart=Never -- sleep 3600 sleep 10 POD1_IP=$(kubectl get pod net-test-1 -o jsonpath='{.status.podIP}') POD2_IP=$(kubectl get pod net-test-2 -o jsonpath='{.status.podIP}') echo "Pod1 IP: $POD1_IP" echo "Pod2 IP: $POD2_IP" kubectl exec net-test-1 -- ping -c 3 $POD2_IP ​ # 4. 检查 DNS 解析 kubectl exec net-test-1 -- nslookup kubernetes.default.svc.cluster.local ​ # 5. 检查 Service 网络 kubectl get svc -A kubectl get endpoints -A ​ # 6. 导出网络配置 kubectl get pods -n kube-system -o yaml > /tmp/network_pods_backup_$(date +%Y%m%d).yaml kubectl get cm -n kube-system -o yaml > /tmp/network_cm_backup_$(date +%Y%m%d).yaml echo "网络配置已备份到 /tmp/" ​

2. 制定操作方案与备份防护

# 1. 备份当前网络配置(操作前必做) kubectl get pods -n kube-system -o yaml > /tmp/network_pods_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get cm -n kube-system -o yaml > /tmp/network_cm_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get svc -A -o yaml > /tmp/network_svc_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get ingress -A -o yaml > /tmp/network_ingress_backup_$(date +%Y%m%d_%H%M%S).yaml kubectl get networkpolicy -A -o yaml > /tmp/network_np_backup_$(date +%Y%m%d_%H%M%S).yaml ​ # 2. 记录当前网络状态 echo "=== 网络状态记录 $(date) ===" > /tmp/network_status_$(date +%Y%m%d).txt echo "--- 节点状态 ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get nodes -o wide >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- 网络组件 Pod ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get pods -n kube-system -o wide >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- Service ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get svc -A >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- Ingress ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get ingress -A >> /tmp/network_status_$(date +%Y%m%d).txt echo "--- NetworkPolicy ---" >> /tmp/network_status_$(date +%Y%m%d).txt kubectl get networkpolicy -A >> /tmp/network_status_$(date +%Y%m%d).txt cat /tmp/network_status_$(date +%Y%m%d).txt ​ # 3. 制定操作方案 cat > /tmp/network_operation_plan.md << 'EOF' # 网络操作方案 ## 一、操作目标 ## 二、影响范围评估 ## 三、操作步骤与时间窗口 ## 四、回滚方案 ## 五、验证标准 ## 六、风险点与应对措施 EOF echo "操作方案模板已创建" ​ # 4. 确认业务窗口 echo "当前时间: $(date)" echo "建议在业务低峰期执行网络操作,避免影响业务" ​ # 5. 通知相关业务方 # echo "网络运维操作通知" | mail -s "网络运维通知" admin@example.com ​

3. 执行网络组件配置操作

# 1. 检查网络组件配置 # Flannel 配置 kubectl get cm kube-flannel-cfg -n kube-system -o yaml 2>/dev/null | head -50 # Calico 配置 kubectl get cm calico-config -n kube-system -o yaml 2>/dev/null | head -50 # kube-proxy 配置 kubectl get cm kube-proxy -n kube-system -o yaml 2>/dev/null | head -50 ​ # 2. 检查网络组件日志 # Flannel 日志 kubectl logs -n kube-system -l app=flannel --tail=50 2>/dev/null # Calico 日志 kubectl logs -n kube-system -l k8s-app=calico-node --tail=50 2>/dev/null # kube-proxy 日志 kubectl logs -n kube-system -l k8s-app=kube-proxy --tail=50 2>/dev/null ​ # 3. 检查网络接口和路由 # 在节点上执行(通过 kubectl debug 或 ssh) # ip addr show | grep -E 'flannel|cali|weave|cni0|docker0' # ip route show # iptables -t nat -L -n | head -50 ​ # 4. 执行具体网络配置操作(根据标题调整) echo "执行网络组件具体配置操作..." echo "请根据操作方案执行具体步骤" ​ # 5. 应用网络配置变更 # kubectl apply -f /tmp/network_config.yaml # kubectl rollout restart daemonset/flannel -n kube-system # kubectl rollout restart daemonset/calico-node -n kube-system # kubectl rollout restart daemonset/kube-proxy -n kube-system ​ # 6. 等待网络组件重启完成 kubectl rollout status daemonset/flannel -n kube-system --timeout=120s 2>/dev/null kubectl rollout status daemonset/calico-node -n kube-system --timeout=120s 2>/dev/null kubectl rollout status daemonset/kube-proxy -n kube-system --timeout=120s 2>/dev/null echo "网络组件重启完成" ​

4. 验证网络连通性与业务无感知

# 1. 验证节点网络状态 kubectl get nodes -o wide # 预期:所有节点 Ready,网络 IP 正确 ​ # 2. 验证网络组件 Pod 状态 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns' # 预期:所有网络组件 Pod Running,READY 1/1 ​ # 3. 验证 Pod 网络连通性 # 创建测试 Pod kubectl run net-test-a --image=busybox --restart=Never -- sleep 3600 2>/dev/null kubectl run net-test-b --image=busybox --restart=Never -- sleep 3600 2>/dev/null sleep 15 ​ # 获取 Pod IP POD_A_IP=$(kubectl get pod net-test-a -o jsonpath='{.status.podIP}' 2>/dev/null) POD_B_IP=$(kubectl get pod net-test-b -o jsonpath='{.status.podIP}' 2>/dev/null) echo "Pod A IP: $POD_A_IP" echo "Pod B IP: $POD_B_IP" ​ # 同节点 Pod 通信 kubectl exec net-test-a -- ping -c 3 $POD_B_IP 2>/dev/null # 预期:ping 成功,无丢包 ​ # 跨节点 Pod 通信(确保两个 Pod 在不同节点) # kubectl exec net-test-a -- ping -c 3 <其他节点Pod IP> ​ # 4. 验证 DNS 解析 kubectl exec net-test-a -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null # 预期:DNS 解析成功,返回 Service IP ​ # 5. 验证 Service 访问 kubectl exec net-test-a -- wget -q -O- http://kubernetes.default.svc.cluster.local 2>/dev/null | head -5 # 预期:Service 访问正常 ​ # 6. 验证网络策略(如果配置了) kubectl get networkpolicy -A # 预期:网络策略已应用,符合预期 ​ # 7. 清理测试 Pod kubectl delete pod net-test-a net-test-b --force --grace-period=0 2>/dev/null echo "测试 Pod 已清理" ​

5. 网络监控告警与巡检配置

# 1. 配置网络监控指标 # 检查 Prometheus 是否采集网络指标 kubectl get servicemonitor -A 2>/dev/null | grep -E 'flannel|calico|kube-proxy|ingress|metallb|traefik' kubectl get podmonitor -A 2>/dev/null | grep -E 'flannel|calico|kube-proxy|ingress|metallb|traefik' ​ # 2. 配置网络告警规则 cat > /tmp/network_alerts.yaml << 'EOF' groups: - name: network-alerts rules: - alert: NetworkComponentPodDown expr: kube_pod_status_phase{namespace="kube-system",phase="Running",pod=~"flannel.*|calico.*|kube-proxy.*|coredns.*"} == 0 for: 5m labels: severity: critical annotations: summary: "网络组件 Pod 异常" - alert: PodNetworkLatencyHigh expr: histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket[5m])) by (le)) > 1 for: 5m labels: severity: warning annotations: summary: "DNS 解析延迟过高" - alert: NetworkPolicyDenyHigh expr: rate(calico_denied_packets_total[5m]) > 100 for: 5m labels: severity: warning annotations: summary: "网络策略拒绝包数过高" EOF echo "告警规则模板已创建" ​ # 3. 配置网络日志归集 # 检查日志采集配置 kubectl get configmap -n kube-system | grep -i log # 配置 Fluentd/Filebeat 采集网络组件日志 ​ # 4. 配置网络巡检脚本 cat > /tmp/network_audit.sh << 'SCRIPT' #!/bin/bash echo "=== 网络巡检 $(date) ===" echo "--- 节点状态 ---" kubectl get nodes -o wide | grep -v Ready echo "--- 网络组件 Pod ---" kubectl get pods -n kube-system | grep -v Running | grep -v NAME echo "--- DNS 解析测试 ---" kubectl run dns-test --image=busybox --restart=Never --rm -it -- nslookup kubernetes.default 2>/dev/null | tail -3 echo "--- Service 异常 ---" kubectl get svc -A | grep -v ClusterIP | grep -v NodePort | grep -v LoadBalancer | grep -v TYPE echo "--- Ingress 异常 ---" kubectl get ingress -A 2>/dev/null | grep -v CLASS | grep -v '<none>' echo "=== 巡检完成 ===" SCRIPT chmod +x /tmp/network_audit.sh /tmp/network_audit.sh ​ # 5. 设置定时巡检 # crontab -e # 0 2 * * * /tmp/network_audit.sh >> /var/log/network_audit.log 2>&1 ​

6. 验证操作结果与生成报告

# 1. 验证网络组件状态 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' # 预期:所有网络组件 Pod Running,READY 正常 ​ # 2. 验证网络连通性 kubectl run net-verify --image=busybox --restart=Never --rm -it -- ping -c 3 kubernetes.default 2>/dev/null # 预期:网络连通正常 ​ # 3. 验证业务 Pod 状态 kubectl get pods -A | grep -v Running | grep -v NAME | head -20 # 预期:无因网络问题导致的异常 Pod ​ # 4. 验证 Service 访问 kubectl get svc -A -o wide | head -20 # 预期:Service 正常,Endpoints 有后端 IP ​ # 5. 验证 Ingress 访问(如果配置了) kubectl get ingress -A 2>/dev/null # 预期:Ingress 规则正常,地址已分配 ​ # 6. 验证网络策略(如果配置了) kubectl get networkpolicy -A 2>/dev/null # 预期:网络策略已应用 ​ # 7. 生成操作报告 echo "=== 网络操作报告 ===" > /tmp/network_operation_report.txt echo "操作时间: $(date)" >> /tmp/network_operation_report.txt echo "操作前网络组件 Pod 数: $(cat /tmp/network_pods_backup_*.yaml 2>/dev/null | grep -c 'kind: Pod')" >> /tmp/network_operation_report.txt echo "操作后网络组件 Pod 数: $(kubectl get pods -n kube-system --no-headers | wc -l)" >> /tmp/network_operation_report.txt echo "异常节点: $(kubectl get nodes | grep -v Ready | grep -v NAME | wc -l)" >> /tmp/network_operation_report.txt echo "异常 Pod: $(kubectl get pods -A | grep -v Running | grep -v NAME | wc -l)" >> /tmp/network_operation_report.txt echo "Service 数: $(kubectl get svc -A --no-headers | wc -l)" >> /tmp/network_operation_report.txt echo "Ingress 数: $(kubectl get ingress -A --no-headers 2>/dev/null | wc -l)" >> /tmp/network_operation_report.txt echo "NetworkPolicy 数: $(kubectl get networkpolicy -A --no-headers 2>/dev/null | wc -l)" >> /tmp/network_operation_report.txt cat /tmp/network_operation_report.txt ​

验证流程

# 1. 节点状态验证 kubectl get nodes -o wide # 预期:所有节点 Ready,网络 IP 正确 ​ # 2. 网络组件 Pod 验证 kubectl get pods -n kube-system | grep -E 'flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik' # 预期:所有网络组件 Pod Running,READY 正常 ​ # 3. Pod 网络连通性验证 kubectl run net-test --image=busybox --restart=Never --rm -it -- ping -c 3 kubernetes.default 2>/dev/null # 预期:ping 成功,无丢包 ​ # 4. DNS 解析验证 kubectl run dns-test --image=busybox --restart=Never --rm -it -- nslookup kubernetes.default.svc.cluster.local 2>/dev/null # 预期:DNS 解析成功 ​ # 5. Service 访问验证 kubectl get svc -A -o wide kubectl get endpoints -A # 预期:Service 正常,Endpoints 有后端 IP ​ # 6. 业务 Pod 状态验证 kubectl get pods -A | grep -v Running | grep -v NAME | head -10 # 预期:无因网络问题导致的异常 Pod ​ # 7. 网络策略验证(如果配置了) kubectl get networkpolicy -A 2>/dev/null # 预期:网络策略已应用 ​ # 8. 操作报告验证 cat /tmp/network_operation_report.txt # 预期:报告包含操作前后对比,无异常状态 ​

排错方案

  • Calico 节点 NotReady:检查 calico-node Pod 状态、BGP 邻居、felix 日志、etcd/数据存储连通性

  • BGP 邻居建立失败:检查节点间网络连通性、BGP 配置、AS 号、peer 配置、防火墙端口(179)

  • Pod 跨节点通信阻断:检查 Calico 路由、BGP 路由传播、iptables 规则、felix 配置、网络策略

  • 网络策略不生效:检查 NetworkPolicy 标签选择器、策略方向、端口协议、Calico 支持的策略类型、felix 日志

  • 策略冲突:检查多条 NetworkPolicy 的叠加效果、默认拒绝策略、命名空间隔离、优先级

  • IPAM 地址耗尽:检查 IP 池配置、已分配 IP 数量、闲置 IP 回收、IP 池扩容

  • Calico 隧道中断:检查 VXLAN/IPIP 隧道状态、隧道接口、MTU 配置、节点间网络

  • 多租户网络隔离失效:检查租户命名空间标签、网络策略、全局网络策略、Profile 配置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:50:35

RISC-V AI PC的工程化拐点:从流片验证到模块化量

摘要&#xff1a;2026年&#xff0c;RISC-V AI PC正在从概念验证走向工程化量产。国芯科技GPNPU SoC进入流片验证阶段&#xff0c;集成双核RISC-V CPU与32TOPS CNN300 NPU&#xff1b;DeepComputing DC-ROMA Mainboard III以699美元开售&#xff0c;搭载全球首颗RVA23量产芯片K…

作者头像 李华
网站建设 2026/9/30 2:50:24

K8s集群信创系统Calico权限适配整改实操

K8s集群信创系统Calico权限适配整改实操技术栈&#xff1a;Kubernetes v1.32.13 Rocky Linux 8.6 Calico网络组件 Containerd 1.7.x操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案K8s集群信创系统Calico权限适配整改实操K8s 集群 3 节点&…

作者头像 李华
网站建设 2026/9/30 2:49:09

乾坤一掷落到 ABAP,花掉的不是铜钱,而是事务预算

月末结算窗口只剩两小时,三万笔销售返利申请还停在待处理状态。业务部门希望一次执行,把符合条件的申请全部处理完。开发人员手里有数据库的更新语句,也有后台作业和并行处理能力,看起来只要把批量开大,就能赶上结算时间。真正需要算清楚的却是另一笔账,数据库负载、锁等…

作者头像 李华
网站建设 2026/9/30 2:48:54

从「山神」到受控批量业务操作,ABAP 如何调动整片数据

月末结算时,某个销售区域的一批订单突然需要暂停后续处理。业务人员看到的是一个动作,选定范围,确认执行,区域内符合条件的订单一起改变状态。开发人员面对的却不是一个简单的循环,订单各有状态、权限、锁和后续流程,漏改一张会留下隐患,多改一张也可能造成损失。 这个…

作者头像 李华
网站建设 2026/9/30 2:48:18

【嵌入式学习】嵌入式原理知识-定时器(六)

1. 时基单元 1.1 定时器简介 定时器也属于片上外设&#xff0c;具体最高频率为多少需要参考挂载的总线&#xff1a; 分为高级定时器&#xff0c;通用定时器和基本定时器。定时器内部结构图&#xff1a;可以将其分为如下的几个部分&#xff1a;1.2 时基单元的基本结构 时基单元主…

作者头像 李华