恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
K8s集群Calico与Flannel网络平滑迁移实操
首页
资讯中心
/
K8s集群Calico与Flannel网络平滑迁移实操
K8s集群Calico与Flannel网络平滑迁移实操
发布时间:2026/9/30 2:50:31
K8s集群Calico与Flannel网络平滑迁移实操技术栈Kubernetes v1.32.13 Rocky Linux 8.6 Flannel网络组件 Containerd 1.7.x操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案K8s集群Calico与Flannel网络平滑迁移实操操作环境K8s 集群 3 节点k8s-master(192.168.1.10), k8s-node1(192.168.1.11), k8s-node2(192.168.1.12)K8s 版本 v1.32.13网络组件Flannel基础网络已部署对应网络组件 PodCNI 插件已配置容器运行时 Containerd 1.7.x操作系统 Rocky Linux 8.6内核版本已适配网络需求已加载必要内核模块br_netfilter、vxlan、ip_tables 等集群网络规划Pod 网段、Service 网段、节点网络已规划完毕无网段冲突DNS 服务正常运行已配置监控告警体系Prometheus Grafana网络指标可采集具备日志归集和故障排查能力对接原理K8s集群Calico与Flannel网络平滑迁移实操是 K8s 集群网络系统运维中的核心操作场景。K8s 网络体系通过 CNIContainer Network Interface插件实现 Pod 网络的创建和管理网络组件负责集群内 Pod 间通信、Pod 与 Service 间通信、以及集群内外网络互通。Flannel基础网络作为具体的网络组件为集群提供网络连通性、网络策略、负载均衡或入口路由能力。运维操作的核心目标是确保网络的可用性、性能、安全性和可管理性通过规范化的网络配置确保 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[?(.typeInternalIP)].address} echo done # Pod 间连通性测试 kubectl run net-test-1 --imagebusybox --restartNever -- sleep 3600 kubectl run net-test-2 --imagebusybox --restartNever -- 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 网络运维通知 adminexample.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 appflannel --tail50 2/dev/null # Calico 日志 kubectl logs -n kube-system -l k8s-appcalico-node --tail50 2/dev/null # kube-proxy 日志 kubectl logs -n kube-system -l k8s-appkube-proxy --tail50 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 --timeout120s 2/dev/null kubectl rollout status daemonset/calico-node -n kube-system --timeout120s 2/dev/null kubectl rollout status daemonset/kube-proxy -n kube-system --timeout120s 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 RunningREADY 1/1 # 3. 验证 Pod 网络连通性 # 创建测试 Pod kubectl run net-test-a --imagebusybox --restartNever -- sleep 3600 2/dev/null kubectl run net-test-b --imagebusybox --restartNever -- 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-period0 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{namespacekube-system,phaseRunning,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 --imagebusybox --restartNever --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 21 6. 验证操作结果与生成报告# 1. 验证网络组件状态 kubectl get pods -n kube-system | grep -E flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik # 预期所有网络组件 Pod RunningREADY 正常 # 2. 验证网络连通性 kubectl run net-verify --imagebusybox --restartNever --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 RunningREADY 正常 # 3. Pod 网络连通性验证 kubectl run net-test --imagebusybox --restartNever --rm -it -- ping -c 3 kubernetes.default 2/dev/null # 预期ping 成功无丢包 # 4. DNS 解析验证 kubectl run dns-test --imagebusybox --restartNever --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 # 预期报告包含操作前后对比无异常状态 排错方案Flannel 网络初始化失败检查 etcd 连通性、flanneld 服务状态、子网配置、网卡绑定、内核模块vxlan/ip_tablesPod 跨节点通信异常检查 VXLAN 隧道状态、flannel.1 接口、路由表、iptables 规则、节点间网络连通性同节点 Pod 互通故障检查 cni0 网桥、Pod 网卡、iptables FORWARD 规则、网络命名空间VXLAN 隧道异常断开检查 flanneld 日志、隧道接口状态、MTU 配置、网络抖动、内核 VXLAN 模块网段冲突检查 flannel 子网配置与集群其他网络是否重叠、etcd 中存储的子网分配、Pod IP 范围MTU 参数不匹配检查 flannel MTU 配置、物理网卡 MTU、VXLAN 封装开销、大报文传输卡顿Flannel 版本升级后网络异常检查版本兼容性、配置文件变更、etcd 数据迁移、Pod 网络重建容器运行时变更网络适配检查 CNI 插件配置、Containerd 网络配置、cni0 网桥、Pod 网卡创建