話保持策略配置實(shí)操)
K8s集群Ingress會(huì)話保持策略配置實(shí)操技術(shù)棧Kubernetes v1.32.13 Rocky Linux 8.6 Ingress-Nginx Containerd 1.7.x操作環(huán)境 / 對(duì)接原理 / 詳細(xì)步驟 / 完整命令 / 配置文件 / 驗(yàn)證流程 / 排錯(cuò)方案K8s集群Ingress會(huì)話保持策略配置實(shí)操操作環(huán)境K8s 集群 3 節(jié)點(diǎn)k8s-master(192.168.1.10), k8s-node1(192.168.1.11), k8s-node2(192.168.1.12)K8s 版本 v1.32.13網(wǎng)絡(luò)組件Ingress-Nginx已部署對(duì)應(yīng)網(wǎng)絡(luò)組件 PodCNI 插件已配置容器運(yùn)行時(shí) Containerd 1.7.x操作系統(tǒng) Rocky Linux 8.6內(nèi)核版本已適配網(wǎng)絡(luò)需求已加載必要內(nèi)核模塊br_netfilter、vxlan、ip_tables 等集群網(wǎng)絡(luò)規(guī)劃Pod 網(wǎng)段、Service 網(wǎng)段、節(jié)點(diǎn)網(wǎng)絡(luò)已規(guī)劃完畢無(wú)網(wǎng)段沖突DNS 服務(wù)正常運(yùn)行已配置監(jiān)控告警體系Prometheus Grafana網(wǎng)絡(luò)指標(biāo)可采集具備日志歸集和故障排查能力對(duì)接原理K8s集群Ingress會(huì)話保持策略配置實(shí)操是 K8s 集群網(wǎng)絡(luò)系統(tǒng)運(yùn)維中的核心操作場(chǎng)景。K8s 網(wǎng)絡(luò)體系通過(guò) CNIContainer Network Interface插件實(shí)現(xiàn) Pod 網(wǎng)絡(luò)的創(chuàng)建和管理網(wǎng)絡(luò)組件負(fù)責(zé)集群內(nèi) Pod 間通信、Pod 與 Service 間通信、以及集群內(nèi)外網(wǎng)絡(luò)互通。Ingress-Nginx作為具體的網(wǎng)絡(luò)組件為集群提供網(wǎng)絡(luò)連通性、網(wǎng)絡(luò)策略、負(fù)載均衡或入口路由能力。運(yùn)維操作的核心目標(biāo)是確保網(wǎng)絡(luò)的可用性、性能、安全性和可管理性通過(guò)規(guī)范化的網(wǎng)絡(luò)配置確保 Pod 間通信正常通過(guò)網(wǎng)絡(luò)策略實(shí)現(xiàn)訪問(wèn)控制和安全隔離通過(guò)負(fù)載均衡和 Ingress 實(shí)現(xiàn)流量分發(fā)和外部訪問(wèn)通過(guò)監(jiān)控告警和日志分析實(shí)現(xiàn)故障快速定位通過(guò)自動(dòng)化腳本和 SOP 提升運(yùn)維效率。所有操作需遵循業(yè)務(wù)無(wú)感知原則對(duì)生產(chǎn)網(wǎng)絡(luò)的變更采用灰度和滾動(dòng)方式避免影響業(yè)務(wù)運(yùn)行。詳細(xì)步驟1. 網(wǎng)絡(luò)現(xiàn)狀盤(pán)點(diǎn)與連通性檢查# 1. 檢查集群節(jié)點(diǎn)狀態(tài) kubectl get nodes -o wide kubectl get pods -n kube-system -o wide ? # 2. 檢查網(wǎng)絡(luò)組件狀態(tài) 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. 檢查網(wǎng)絡(luò)連通性 # 節(jié)點(diǎn)間連通性 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 間連通性測(cè)試 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 網(wǎng)絡(luò) kubectl get svc -A kubectl get endpoints -A ? # 6. 導(dǎo)出網(wǎng)絡(luò)配置 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 網(wǎng)絡(luò)配置已備份到 /tmp/ ?2. 制定操作方案與備份防護(hù)# 1. 備份當(dāng)前網(wǎng)絡(luò)配置操作前必做 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. 記錄當(dāng)前網(wǎng)絡(luò)狀態(tài) echo 網(wǎng)絡(luò)狀態(tài)記錄 $(date) /tmp/network_status_$(date %Y%m%d).txt echo --- 節(jié)點(diǎn)狀態(tài) --- /tmp/network_status_$(date %Y%m%d).txt kubectl get nodes -o wide /tmp/network_status_$(date %Y%m%d).txt echo --- 網(wǎng)絡(luò)組件 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 # 網(wǎng)絡(luò)操作方案 ## 一、操作目標(biāo) ## 二、影響范圍評(píng)估 ## 三、操作步驟與時(shí)間窗口 ## 四、回滾方案 ## 五、驗(yàn)證標(biāo)準(zhǔn) ## 六、風(fēng)險(xiǎn)點(diǎn)與應(yīng)對(duì)措施 EOF echo 操作方案模板已創(chuàng)建 ? # 4. 確認(rèn)業(yè)務(wù)窗口 echo 當(dāng)前時(shí)間: $(date) echo 建議在業(yè)務(wù)低峰期執(zhí)行網(wǎng)絡(luò)操作避免影響業(yè)務(wù) ? # 5. 通知相關(guān)業(yè)務(wù)方 # echo 網(wǎng)絡(luò)運(yùn)維操作通知 | mail -s 網(wǎng)絡(luò)運(yùn)維通知 adminexample.com ?3. 執(zhí)行網(wǎng)絡(luò)組件配置操作# 1. 檢查網(wǎng)絡(luò)組件配置 # 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. 檢查網(wǎng)絡(luò)組件日志 # 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. 檢查網(wǎng)絡(luò)接口和路由 # 在節(jié)點(diǎn)上執(zhí)行通過(guò) kubectl debug 或 ssh # ip addr show | grep -E flannel|cali|weave|cni0|docker0 # ip route show # iptables -t nat -L -n | head -50 ? # 4. 執(zhí)行具體網(wǎng)絡(luò)配置操作根據(jù)標(biāo)題調(diào)整 echo 執(zhí)行網(wǎng)絡(luò)組件具體配置操作... echo 請(qǐng)根據(jù)操作方案執(zhí)行具體步驟 ? # 5. 應(yīng)用網(wǎng)絡(luò)配置變更 # 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. 等待網(wǎng)絡(luò)組件重啟完成 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 網(wǎng)絡(luò)組件重啟完成 ?4. 驗(yàn)證網(wǎng)絡(luò)連通性與業(yè)務(wù)無(wú)感知# 1. 驗(yàn)證節(jié)點(diǎn)網(wǎng)絡(luò)狀態(tài) kubectl get nodes -o wide # 預(yù)期所有節(jié)點(diǎn) Ready網(wǎng)絡(luò) IP 正確 ? # 2. 驗(yàn)證網(wǎng)絡(luò)組件 Pod 狀態(tài) kubectl get pods -n kube-system | grep -E flannel|calico|weave|kube-proxy|coredns # 預(yù)期所有網(wǎng)絡(luò)組件 Pod RunningREADY 1/1 ? # 3. 驗(yàn)證 Pod 網(wǎng)絡(luò)連通性 # 創(chuàng)建測(cè)試 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 ? # 同節(jié)點(diǎn) Pod 通信 kubectl exec net-test-a -- ping -c 3 $POD_B_IP 2/dev/null # 預(yù)期ping 成功無(wú)丟包 ? # 跨節(jié)點(diǎn) Pod 通信確保兩個(gè) Pod 在不同節(jié)點(diǎn) # kubectl exec net-test-a -- ping -c 3 其他節(jié)點(diǎn)Pod IP ? # 4. 驗(yàn)證 DNS 解析 kubectl exec net-test-a -- nslookup kubernetes.default.svc.cluster.local 2/dev/null # 預(yù)期DNS 解析成功返回 Service IP ? # 5. 驗(yàn)證 Service 訪問(wèn) kubectl exec net-test-a -- wget -q -O- http://kubernetes.default.svc.cluster.local 2/dev/null | head -5 # 預(yù)期Service 訪問(wèn)正常 ? # 6. 驗(yàn)證網(wǎng)絡(luò)策略如果配置了 kubectl get networkpolicy -A # 預(yù)期網(wǎng)絡(luò)策略已應(yīng)用符合預(yù)期 ? # 7. 清理測(cè)試 Pod kubectl delete pod net-test-a net-test-b --force --grace-period0 2/dev/null echo 測(cè)試 Pod 已清理 ?5. 網(wǎng)絡(luò)監(jiān)控告警與巡檢配置# 1. 配置網(wǎng)絡(luò)監(jiān)控指標(biāo) # 檢查 Prometheus 是否采集網(wǎng)絡(luò)指標(biāo) 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. 配置網(wǎng)絡(luò)告警規(guī)則 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: 網(wǎng)絡(luò)組件 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 解析延遲過(guò)高 - alert: NetworkPolicyDenyHigh expr: rate(calico_denied_packets_total[5m]) 100 for: 5m labels: severity: warning annotations: summary: 網(wǎng)絡(luò)策略拒絕包數(shù)過(guò)高 EOF echo 告警規(guī)則模板已創(chuàng)建 ? # 3. 配置網(wǎng)絡(luò)日志歸集 # 檢查日志采集配置 kubectl get configmap -n kube-system | grep -i log # 配置 Fluentd/Filebeat 采集網(wǎng)絡(luò)組件日志 ? # 4. 配置網(wǎng)絡(luò)巡檢腳本 cat /tmp/network_audit.sh SCRIPT #!/bin/bash echo 網(wǎng)絡(luò)巡檢 $(date) echo --- 節(jié)點(diǎn)狀態(tài) --- kubectl get nodes -o wide | grep -v Ready echo --- 網(wǎng)絡(luò)組件 Pod --- kubectl get pods -n kube-system | grep -v Running | grep -v NAME echo --- DNS 解析測(cè)試 --- 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. 設(shè)置定時(shí)巡檢 # crontab -e # 0 2 * * * /tmp/network_audit.sh /var/log/network_audit.log 21 ?6. 驗(yàn)證操作結(jié)果與生成報(bào)告# 1. 驗(yàn)證網(wǎng)絡(luò)組件狀態(tài) kubectl get pods -n kube-system | grep -E flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik # 預(yù)期所有網(wǎng)絡(luò)組件 Pod RunningREADY 正常 ? # 2. 驗(yàn)證網(wǎng)絡(luò)連通性 kubectl run net-verify --imagebusybox --restartNever --rm -it -- ping -c 3 kubernetes.default 2/dev/null # 預(yù)期網(wǎng)絡(luò)連通正常 ? # 3. 驗(yàn)證業(yè)務(wù) Pod 狀態(tài) kubectl get pods -A | grep -v Running | grep -v NAME | head -20 # 預(yù)期無(wú)因網(wǎng)絡(luò)問(wèn)題導(dǎo)致的異常 Pod ? # 4. 驗(yàn)證 Service 訪問(wèn) kubectl get svc -A -o wide | head -20 # 預(yù)期Service 正常Endpoints 有后端 IP ? # 5. 驗(yàn)證 Ingress 訪問(wèn)如果配置了 kubectl get ingress -A 2/dev/null # 預(yù)期Ingress 規(guī)則正常地址已分配 ? # 6. 驗(yàn)證網(wǎng)絡(luò)策略如果配置了 kubectl get networkpolicy -A 2/dev/null # 預(yù)期網(wǎng)絡(luò)策略已應(yīng)用 ? # 7. 生成操作報(bào)告 echo 網(wǎng)絡(luò)操作報(bào)告 /tmp/network_operation_report.txt echo 操作時(shí)間: $(date) /tmp/network_operation_report.txt echo 操作前網(wǎng)絡(luò)組件 Pod 數(shù): $(cat /tmp/network_pods_backup_*.yaml 2/dev/null | grep -c kind: Pod) /tmp/network_operation_report.txt echo 操作后網(wǎng)絡(luò)組件 Pod 數(shù): $(kubectl get pods -n kube-system --no-headers | wc -l) /tmp/network_operation_report.txt echo 異常節(jié)點(diǎn): $(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 數(shù): $(kubectl get svc -A --no-headers | wc -l) /tmp/network_operation_report.txt echo Ingress 數(shù): $(kubectl get ingress -A --no-headers 2/dev/null | wc -l) /tmp/network_operation_report.txt echo NetworkPolicy 數(shù): $(kubectl get networkpolicy -A --no-headers 2/dev/null | wc -l) /tmp/network_operation_report.txt cat /tmp/network_operation_report.txt ?驗(yàn)證流程# 1. 節(jié)點(diǎn)狀態(tài)驗(yàn)證 kubectl get nodes -o wide # 預(yù)期所有節(jié)點(diǎn) Ready網(wǎng)絡(luò) IP 正確 ? # 2. 網(wǎng)絡(luò)組件 Pod 驗(yàn)證 kubectl get pods -n kube-system | grep -E flannel|calico|weave|kube-proxy|coredns|ingress|metallb|traefik # 預(yù)期所有網(wǎng)絡(luò)組件 Pod RunningREADY 正常 ? # 3. Pod 網(wǎng)絡(luò)連通性驗(yàn)證 kubectl run net-test --imagebusybox --restartNever --rm -it -- ping -c 3 kubernetes.default 2/dev/null # 預(yù)期ping 成功無(wú)丟包 ? # 4. DNS 解析驗(yàn)證 kubectl run dns-test --imagebusybox --restartNever --rm -it -- nslookup kubernetes.default.svc.cluster.local 2/dev/null # 預(yù)期DNS 解析成功 ? # 5. Service 訪問(wèn)驗(yàn)證 kubectl get svc -A -o wide kubectl get endpoints -A # 預(yù)期Service 正常Endpoints 有后端 IP ? # 6. 業(yè)務(wù) Pod 狀態(tài)驗(yàn)證 kubectl get pods -A | grep -v Running | grep -v NAME | head -10 # 預(yù)期無(wú)因網(wǎng)絡(luò)問(wèn)題導(dǎo)致的異常 Pod ? # 7. 網(wǎng)絡(luò)策略驗(yàn)證如果配置了 kubectl get networkpolicy -A 2/dev/null # 預(yù)期網(wǎng)絡(luò)策略已應(yīng)用 ? # 8. 操作報(bào)告驗(yàn)證 cat /tmp/network_operation_report.txt # 預(yù)期報(bào)告包含操作前后對(duì)比無(wú)異常狀態(tài) ?排錯(cuò)方案Ingress 路由不生效檢查 Ingress 規(guī)則、annotations、ingress-controller 狀態(tài)、域名解析、Service 后端404 錯(cuò)誤檢查 Ingress 規(guī)則匹配、路徑配置、域名、default backend、ingress-controller 日志502/504 錯(cuò)誤檢查后端 Service 連通性、Pod 健康狀態(tài)、超時(shí)配置、upstream 配置、連接數(shù)HTTPS 證書(shū)問(wèn)題檢查 TLS Secret、證書(shū)有效期、域名匹配、證書(shū)鏈、ingress-controller 日志路由規(guī)則沖突檢查多個(gè) Ingress 規(guī)則、域名路徑重疊、優(yōu)先級(jí)、ingress-class限流防刷不生效檢查 annotations 配置、限流算法、參數(shù)值、ingress-controller 版本支持灰度流量分發(fā)異常檢查 canary 配置、權(quán)重、header/cookie 路由、ingress-controller 版本Ingress 高可用問(wèn)題檢查 controller 副本數(shù)、節(jié)點(diǎn)分布、反親和性、負(fù)載均衡、故障切換