
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已部署對應網絡組件 PodCNI 插件已配置容器運行時 Containerd 1.7.x操作系統 Rocky Linux 8.6內核版本已適配網絡需求已加載必要內核模塊br_netfilter、vxlan、ip_tables 等集群網絡規劃Pod 網段、Service 網段、節點網絡已規劃完畢無網段沖突DNS 服務正常運行已配置監控告警體系Prometheus Grafana網絡指標可采集具備日志歸集和故障排查能力對接原理K8s集群Ingress會話保持策略配置實操是 K8s 集群網絡系統運維中的核心操作場景。K8s 網絡體系通過 CNIContainer 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[?(.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 # 預期報告包含操作前后對比無異常狀態 ?排錯方案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 副本數、節點分布、反親和性、負載均衡、故障切換