K8s集群Ingress闲置路由规则清理规整实操
2026/9/8 2:42:53 网站建设 项目流程

K8s集群Ingress闲置路由规则清理规整实操

技术栈:Kubernetes v1.32.13 + Rocky Linux 8.6 + Ingress-Nginx + Containerd 1.7.x

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

K8s集群Ingress闲置路由规则清理规整实操

操作环境

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

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

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

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

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

对接原理

K8s集群Ingress闲置路由规则清理规整实操是 K8s 集群网络系统运维中的核心操作场景。K8s 网络体系通过 CNI(Container Network Interface)插件实现 Pod 网络的创建和管理,网络组件负责集群内 Pod 间通信、Pod 与 Service 间通信、以及集群内外网络互通。Ingress-Nginx作为具体的网络组件,为集群提供网络连通性、网络策略、负载均衡或入口路由能力。运维操作的核心目标是确保网络的可用性、性能、安全性和可管理性:通过规范化的网络配置确保 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 # 预期:报告包含操作前后对比,无异常状态 ​

排错方案

  • Ingress 路由不生效:检查 Ingress 规则、annotations、ingress-controller 状态、域名解析、Service 后端

  • 404 错误:检查 Ingress 规则匹配、路径配置、域名、default backend、ingress-controller 日志

  • 502/504 错误:检查后端 Service 连通性、Pod 健康状态、超时配置、upstream 配置、连接数

  • HTTPS 证书问题:检查 TLS Secret、证书有效期、域名匹配、证书链、ingress-controller 日志

  • 路由规则冲突:检查多个 Ingress 规则、域名路径重叠、优先级、ingress-class

  • 限流防刷不生效:检查 annotations 配置、限流算法、参数值、ingress-controller 版本支持

  • 灰度流量分发异常:检查 canary 配置、权重、header/cookie 路由、ingress-controller 版本

  • Ingress 高可用问题:检查 controller 副本数、节点分布、反亲和性、负载均衡

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询