Kubernetes網(wǎng)絡(luò):從CNI原理到故障排查
1 Kubernetes網(wǎng)絡(luò)模型與CNI角色定義
理解Kubernetes網(wǎng)絡(luò)的第一步,是理解其核心網(wǎng)絡(luò)模型的三條基本原則:
原則一:每個(gè)Pod擁有獨(dú)立IP地址。在Kubernetes中,每個(gè)Pod都被分配一個(gè)全局唯一的IP地址,Pod間的通信直接通過Pod IP進(jìn)行,無需進(jìn)行NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)。這一設(shè)計(jì)與Docker默認(rèn)的NAT模式有本質(zhì)區(qū)別,它使得服務(wù)間通信如同在同一物理網(wǎng)絡(luò)中的兩臺主機(jī)。
原則二:同一Pod內(nèi)的容器共享網(wǎng)絡(luò)命名空間。同一個(gè)Pod內(nèi)的多個(gè)容器共享同一個(gè)網(wǎng)絡(luò)棧,它們可以通過localhost相互訪問。這允許將主容器(如Nginx)和輔助容器(如日志代理)放在同一個(gè)網(wǎng)絡(luò)上下文中。
原則三:節(jié)點(diǎn)上的Agent(Kubelet)負(fù)責(zé)Pod間的連通性。節(jié)點(diǎn)間的Pod通信由該節(jié)點(diǎn)的網(wǎng)絡(luò)層負(fù)責(zé),Kubernetes不提供跨節(jié)點(diǎn)通信的默認(rèn)實(shí)現(xiàn)——這一職責(zé)交給CNI插件來完成。
Kubernetes網(wǎng)絡(luò)通信矩陣: Pod內(nèi)通信: localhost(同一網(wǎng)絡(luò)命名空間,無需CNI介入) Pod間同節(jié)點(diǎn):veth pair → 網(wǎng)橋轉(zhuǎn)發(fā)(cni0/br0) Pod間跨節(jié)點(diǎn):veth pair → 本機(jī)cni0 → 路由/隧道 → 對端cni0 → 對端Pod (由CNI插件決定采用哪種跨節(jié)點(diǎn)轉(zhuǎn)發(fā)機(jī)制) Pod到外部: NAT通過Node IP + SNAT(大多數(shù)CNI默認(rèn)行為) 外部到Pod: Service → NodePort / Ingress → Pod
CNI(Container Network Interface)是Kubernetes與網(wǎng)絡(luò)插件之間的接口標(biāo)準(zhǔn),由CoreOS于2016年提出并于2019年貢獻(xiàn)給CNCF。CNI規(guī)范定義了三個(gè)核心操作:ADD(創(chuàng)建網(wǎng)絡(luò))、DEL(刪除網(wǎng)絡(luò))、CHECK(檢查網(wǎng)絡(luò)狀態(tài))。當(dāng)Kubelet需要為Pod配置網(wǎng)絡(luò)時(shí),它調(diào)用CNI插件的這三個(gè)接口,由插件負(fù)責(zé)實(shí)際的veth pair創(chuàng)建、網(wǎng)橋配置、路由設(shè)置等具體工作。
在2026年的生產(chǎn)環(huán)境中,主流CNI插件形成了清晰的格局:Calico以網(wǎng)絡(luò)策略(NetworkPolicy)見長,適合安全要求高的環(huán)境;Flannel以簡單易用著稱,適合快速起步;Cilium以eBPF技術(shù)帶來革命性的性能和安全能力,是2026年的技術(shù)熱點(diǎn)。
2 主流CNI插件對比:Calico、Flannel、Cilium
2.1 Flannel:簡單覆蓋網(wǎng)絡(luò)
Flannel是最早流行的Kubernetes網(wǎng)絡(luò)插件,由CoreOS開發(fā),現(xiàn)已成為Flannel CNI項(xiàng)目的核心。其設(shè)計(jì)理念是"簡單夠用"。
工作原理:Flannel為每個(gè)節(jié)點(diǎn)分配一個(gè)子網(wǎng)(默認(rèn)/24),Pod IP從節(jié)點(diǎn)子網(wǎng)中分配??绻?jié)點(diǎn)通信通過VxLAN或UDP封裝在overlay網(wǎng)絡(luò)中實(shí)現(xiàn)。
Flannel跨節(jié)點(diǎn)通信路徑: Pod-A (10.244.0.15) → eth0 → veth pair → cni0 (10.244.0.1) → 內(nèi)核路由查表 → 發(fā)現(xiàn)目標(biāo)IP 10.244.2.30 不在本地子網(wǎng) → 封裝為VxLAN包(外層IP為目標(biāo)Node IP:10.112.0.52) → 通過物理網(wǎng)絡(luò)轉(zhuǎn)發(fā)到 Node-2 → Node-2內(nèi)核解封裝VxLAN包 → 發(fā)送到cni0 → veth pair → Pod-B (10.244.2.30)
VxLAN封裝:VxLAN(Virtual Extensible LAN)是三層網(wǎng)絡(luò)上構(gòu)建二層overlay的隧道協(xié)議。Flannel在每臺宿主機(jī)上創(chuàng)建一個(gè)名為flannel.1的VxLAN設(shè)備,作為隧道端點(diǎn)。封裝時(shí),原始以太網(wǎng)幀被封裝在UDP(端口4789)報(bào)文中,外層IP為對端宿主機(jī)IP。
Flannel的優(yōu)勢:開箱即用,幾乎零配置即可工作。UDP模式(已廢棄)和VxLAN模式的切換僅需修改networking/backend配置。適合小型開發(fā)和測試環(huán)境。
Flannel的局限:不支持網(wǎng)絡(luò)策略(NetworkPolicy),因此無法實(shí)現(xiàn)Pod級別的訪問控制。overlay網(wǎng)絡(luò)的封裝/解封裝帶來約5-10%的性能開銷。在2026年,F(xiàn)lannel已主要用于快速驗(yàn)證和小型集群。
2.2 Calico:路由透傳與網(wǎng)絡(luò)策略
Calico是Tigera公司的開源項(xiàng)目,是2026年生產(chǎn)環(huán)境中最主流的CNI選擇之一。與Flannel的overlay不同,Calico在大多數(shù)場景下使用BGP(Border Gateway Protocol)實(shí)現(xiàn)路由透傳,Pod IP在物理網(wǎng)絡(luò)中直接可達(dá),無需封裝。
BGP路由透傳模式:
節(jié)點(diǎn)Node-1(IP: 10.112.0.51,子網(wǎng): 10.244.0.0/24) 節(jié)點(diǎn)Node-2(IP: 10.112.0.52,子網(wǎng): 10.244.2.0/24) Node-1通過BGP向物理交換機(jī)宣告: 10.244.2.0/24 via 10.112.0.52 物理交換機(jī)將這個(gè)路由下發(fā)到所有連接的路由器。 當(dāng)Node-1上的Pod要訪問Node-2上的Pod時(shí): - 源IP: 10.244.0.15(Pod IP) - 目標(biāo)IP: 10.244.2.30(Pod IP) - 物理網(wǎng)絡(luò)路由器根據(jù)路由表直接轉(zhuǎn)發(fā)到Node-2 注意:這里完全沒有NAT,也沒有VxLAN封裝, Pod IP在物理網(wǎng)絡(luò)中"真實(shí)"存在。
Felix:Calico在每個(gè)節(jié)點(diǎn)上運(yùn)行的Agent,負(fù)責(zé)在本地配置路由、ACL和iptables規(guī)則。
BIRD:在節(jié)點(diǎn)上運(yùn)行的BGP守護(hù)進(jìn)程,負(fù)責(zé)與其他節(jié)點(diǎn)(或者通過BGP Route Reflector與其他網(wǎng)絡(luò)設(shè)備)交換路由信息。
Typha:Calico的控制平面組件,用于減少Felix與 datastore(etcd)之間的通信壓力。當(dāng)節(jié)點(diǎn)數(shù)量超過50時(shí),Typha的多路復(fù)用和緩存機(jī)制對于降低etcd負(fù)載至關(guān)重要。
# Calico安裝配置(2026年最新3.28.x) apiVersion:operator.tigera.io/v1 kind:Installation metadata: name:default spec: calicoNetwork: bgp:Enabled ipPools: -name:default-ipv4-pool cidr:10.244.0.0/16 natOutgoing:Enabled blockSize:26 # 每個(gè)節(jié)點(diǎn)分配/26子網(wǎng)(64個(gè)IP) encapsulation:VXLANCrossSubnet# 跨子網(wǎng)用VxLAN,同子網(wǎng)純路由 nodeMetricsPort:9091 typha: enabled:true count:3
Calico網(wǎng)絡(luò)策略:Calico最強(qiáng)大的能力之一是聲明式的網(wǎng)絡(luò)策略(NetworkPolicy)。與K8s原生的NetworkPolicy(命名空間級別)不同,Calico的GlobalNetworkPolicy和NetworkSet可以跨命名空間、跨節(jié)點(diǎn)生效,且支持更豐富的規(guī)則(ICMP類型、DSCP標(biāo)記、強(qiáng)制執(zhí)行方向等)。
# Calico NetworkPolicy示例:限制數(shù)據(jù)庫僅允許API服務(wù)器訪問
apiVersion:projectcalico.org/v3
kind:NetworkPolicy
metadata:
name:db-access-policy
namespace:production
spec:
selector:app=='mysql'
types:
-Ingress
ingress:
-action:Allow
source:
selector:app=='api-server'&&role=='backend'
protocol:TCP
destination:
ports:
-3306
-action:Log
source:{}
-action:Deny
2.3 Cilium:eBPF時(shí)代的網(wǎng)絡(luò)新范式
Cilium是2026年最值得關(guān)注的技術(shù)方向。它用Linux內(nèi)核的eBPF(extended Berkeley Packet Filter)技術(shù)徹底重新實(shí)現(xiàn)了Kubernetes網(wǎng)絡(luò),在性能、安全和可觀測性三個(gè)維度都帶來了質(zhì)的飛躍。
eBPF簡介:eBPF是Linux內(nèi)核4.x引入的虛擬機(jī),允許在內(nèi)核空間中運(yùn)行沙盒程序。傳統(tǒng)網(wǎng)絡(luò)插件(如Flannel/Calico)通過操作iptables(Netfilter)實(shí)現(xiàn)網(wǎng)絡(luò)策略,但iptables在規(guī)則數(shù)量增長時(shí)性能嚴(yán)重衰退(規(guī)則數(shù)量超過1萬條時(shí),查找復(fù)雜度O(n)導(dǎo)致延遲顯著增加)。eBPF通過在內(nèi)核中運(yùn)行編譯后的字節(jié)碼,實(shí)現(xiàn)了O(1)的查找效率。
Cilium的工作原理:
數(shù)據(jù)包在Cilium環(huán)境中的路徑:
Pod發(fā)出數(shù)據(jù)包
→ veth pair進(jìn)入內(nèi)核
→ 內(nèi)核協(xié)議棧
→ eBPF tc (traffic control) hook攔截
→ Cilium eBPF程序根據(jù)目的IP查
- 端點(diǎn)映射表(本地Pod直接轉(zhuǎn)發(fā))
- 路由映射表(跨節(jié)點(diǎn)查鄰居表)
- 身份映射表(安全策略執(zhí)行)
→ 符合策略則轉(zhuǎn)發(fā),否則丟棄
Cilium的核心數(shù)據(jù)結(jié)構(gòu)是Endpoint(Pod的網(wǎng)絡(luò)端點(diǎn))和Identity(Pod的安全身份)。安全策略不是基于IP地址,而是基于身份——這解決了傳統(tǒng)網(wǎng)絡(luò)策略中"Pod重建后IP變化導(dǎo)致策略失效"的問題。
Cilium的主要優(yōu)勢(2026年生產(chǎn)驗(yàn)證):
L7策略:除了K8s L3/L4網(wǎng)絡(luò)策略,Cilium支持HTTP方法/路徑、gRPC方法等L7層的訪問控制,這是傳統(tǒng)iptables方案無法實(shí)現(xiàn)的。
帶寬限制:通過eBPF實(shí)現(xiàn)Pod級別的帶寬控制(egress shaping),精度和性能遠(yuǎn)超tc(traffic control)命令。
服務(wù)拓?fù)涓兄?/strong>:通過egress-cached-svc實(shí)現(xiàn)對kube-proxy熱路徑的繞過,性能提升30%+。
透明加密:基于WireGuard的內(nèi)Pod通信透明加密,無需應(yīng)用修改,僅在內(nèi)核層處理。
# Cilium安裝配置 apiVersion:cilium.io/v1alpha1 kind:CiliumConfig metadata: name:cilium-config spec: ipam: mode:cluster-pool operator: clusterPoolIPv4PodCIDRList:[10.244.0.0/16] clusterPoolIPv4MaskSize:26 eBPF: enabled:true lbMode:snat # SNAT模式(vs DSR直接返回) hostRouting:true # 啟用主機(jī)路由,繞過連接跟蹤 bandwidthManager: enabled:true # BBR擁塞控制,顯著提升TCP吞吐 encryption: enabled:true type:WireGuard hubble: enabled:true # 內(nèi)置L7可觀測性(替代OTel的某些場景) relay: enabled:true ui: enabled:true
3 Pod網(wǎng)絡(luò)通信路徑解析
3.1 veth pair與網(wǎng)橋
理解Pod網(wǎng)絡(luò)的第一步是理解veth(Virtual Ethernet)pair的工作原理。
當(dāng)Pod被調(diào)度到節(jié)點(diǎn)時(shí),Kubelet調(diào)用CNI插件創(chuàng)建Pod網(wǎng)絡(luò)。CNI插件創(chuàng)建一對veth設(shè)備:一端(通常命名為vethXXXX)連接到宿主機(jī)的網(wǎng)橋(如cni0),另一端放入Pod的網(wǎng)絡(luò)命名空間,并重命名為eth0。
宿主機(jī)視角的網(wǎng)絡(luò)設(shè)備: ens160 (物理網(wǎng)卡) ↑ ↑(物理網(wǎng)絡(luò)) ↓ cni0 (網(wǎng)橋, 10.244.0.1/24) │ ├─ veth1a2b3c4d → eth0 @ pod-nginx-abc123 (10.244.0.15) ├─ veth5d6e7f8g → eth0 @ pod-api-def456 (10.244.0.16) └─ veth9h0i1j2k → eth0 @ pod-db-ghi789 (10.244.0.17) /proc/sys/net/ipv4/ip_forward = 1 (必須開啟)
網(wǎng)橋轉(zhuǎn)發(fā)原理:Linux網(wǎng)橋(bridge)是工作在二層(數(shù)據(jù)鏈路層)的虛擬設(shè)備,類似于物理交換機(jī)。當(dāng)數(shù)據(jù)包到達(dá)網(wǎng)橋的一個(gè)端口時(shí),網(wǎng)橋根據(jù)MAC地址表決定從哪個(gè)端口轉(zhuǎn)發(fā)。對于veth pair,MAC地址表的條目通常被設(shè)置為"永久"(因?yàn)関eth設(shè)備不會頻繁變更)。
iptables規(guī)則:雖然Cilium等eBPF插件可以繞過,但大多數(shù)CNI仍然依賴iptables進(jìn)行NAT和包過濾。
# 查看KUBE-SERVICES鏈(Service相關(guān)NAT規(guī)則) iptables -t nat -L KUBE-SERVICES -n --line | head -30 # 查看KUBE-NODE-PORT鏈(NodePort相關(guān)規(guī)則) iptables -t nat -L KUBE-NODE-PORT -n --line # 查看CNI插件添加的FORWARD規(guī)則 iptables -L FORWARD -n | grep -i calico/flannel/cni
3.2 跨節(jié)點(diǎn)Pod通信的兩種模式
Overlay模式(封裝):Flannel VXLAN、Calico VXLAN等使用此模式。數(shù)據(jù)包在內(nèi)核中封裝后,通過物理網(wǎng)絡(luò)發(fā)送到對端節(jié)點(diǎn),對端解封裝后送入Pod。優(yōu)點(diǎn)是對物理網(wǎng)絡(luò)無依賴,缺點(diǎn)是額外開銷。
路由透傳模式(Calico BGP):Pod IP在物理網(wǎng)絡(luò)中直接可路由,數(shù)據(jù)包無需封裝,直接通過物理網(wǎng)絡(luò)發(fā)送到目標(biāo)節(jié)點(diǎn)。優(yōu)點(diǎn)是性能最優(yōu)(接近物理網(wǎng)絡(luò)),缺點(diǎn)是需要BGP對等關(guān)系配置。
對比實(shí)驗(yàn)數(shù)據(jù)(iperf3測試,雙節(jié)點(diǎn)各10G網(wǎng)絡(luò)): 場景:跨節(jié)點(diǎn)Pod-to-Pod TCP帶寬 Overlay (VxLAN): 8.2 Gbps (開銷約18%) 路由透傳 (BGP): 9.6 Gbps (開銷約4%) 物理網(wǎng)絡(luò)基線: 9.8 Gbps 結(jié)論:路由透傳模式在高性能場景下優(yōu)勢明顯, 但需要網(wǎng)絡(luò)基礎(chǔ)設(shè)施支持BGP。
4 Service與ClusterIP的原理
4.1 kube-proxy與iptables/IPVS
Kubernetes Service是為一組Pod提供負(fù)載均衡的抽象,其實(shí)現(xiàn)依賴kube-proxy。kube-proxy運(yùn)行在每個(gè)節(jié)點(diǎn)上,監(jiān)聽Service和Endpoints的變化,實(shí)時(shí)更新本地的負(fù)載均衡規(guī)則。
2026年的kube-proxy支持兩種代理模式:iptables模式(傳統(tǒng),默認(rèn))和IPVS模式(高性能)。
iptables模式:每個(gè)Service在iptables中添加多條DNAT規(guī)則。當(dāng)數(shù)據(jù)包匹配Service的ClusterIP時(shí),iptables的隨機(jī)概率轉(zhuǎn)發(fā)到某個(gè)后端Pod。問題在于,當(dāng)Service數(shù)量超過500個(gè)時(shí),iptables規(guī)則的線性查找導(dǎo)致延遲增加——在某些測試中,1000個(gè)Service時(shí)延遲增加可達(dá)3倍。
IPVS模式:IPVS(IP Virtual Server)是Linux內(nèi)核的Layer 4負(fù)載均衡器,工作在Netfilter之上。IPVS使用哈希表實(shí)現(xiàn)O(1)查找,性能穩(wěn)定。
# 切換kube-proxy為IPVS模式 kubectl edit configmap -n kube-system kube-proxy # 將 mode: "" 改為 mode: "ipvs" # 驗(yàn)證IPVS規(guī)則 ipvsadm -L -n # 預(yù)期輸出類似: # IP Virtual Server version 1.2.1 (size=4096) # Prot LocalAddress:Port Scheduler # -> DestinationAddress:Port Forward ActiveConn InActConn # TCP 10.96.0.1:443 rr 12 0 # -> 10.112.0.51:6443 Masq 1 0 # TCP 10.96.0.10:53 rr 8 0 # -> 10.244.0.15:53 Masq 0 4
IPVS的負(fù)載均衡策略:rr(輪詢)、wrr(加權(quán)輪詢)、lc(最少連接)、wlc(加權(quán)最少連接)等。生產(chǎn)環(huán)境推薦使用least_conn(最少連接)策略,對長連接服務(wù)(如gRPC)更友好。
4.2 ClusterIP的服務(wù)發(fā)現(xiàn)
ClusterIP是Service的虛擬IP地址,僅在集群內(nèi)部路由可達(dá)。當(dāng)Pod訪問http://order-service.production.svc.cluster.local時(shí):
DNS解析流程: Pod應(yīng)用 → glibc nsswitch → nscd(本地緩存)→ CoreDNS 1. Pod內(nèi)應(yīng)用發(fā)起DNS查詢:order-service.production.svc.cluster.local 2. Pod的/etc/resolv.conf指向Node本地DNS (kubedns) 3. CoreDNS根據(jù)域名查到Service的ClusterIP (10.96.x.x) 4. 應(yīng)用發(fā)起TCP/UDP連接到ClusterIP 流量路徑: 應(yīng)用 → ClusterIP (虛擬IP) → iptables/IPVS → DNAT到PodIP:Port
CoreDNS是K8s 1.13以來的默認(rèn)DNS服務(wù)器。CoreDNS通過K8s API Watch Service和Endpoints的變化,實(shí)時(shí)更新DNS記錄。
# CoreDNS配置(ConfigMap: coredns) apiVersion:v1 kind:ConfigMap metadata: name:coredns namespace:kube-system data: Corefile:| .:53 { errors health { laminated CUE } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . 10.112.0.1 # 上游DNS(物理網(wǎng)絡(luò)DNS) cache 30 # 緩存TTL loop reload loadbalance }
5 Ingress與NodePort通信機(jī)制
5.1 Ingress控制器架構(gòu)
Kubernetes Ingress是HTTP/HTTPS層(七層)的外部訪問入口。Ingress本身只是一個(gè)API對象,實(shí)際的七層代理由Ingress Controller實(shí)現(xiàn)。2026年主流的Ingress Controller包括Nginx Ingress Controller、Traefik和云廠商的ALB/CLB控制器。
Ingress請求路徑: 外部請求 → 云廠商LB/NodePort → Ingress Controller Pod → Nginx/Traefik根據(jù)Ingress規(guī)則路由 → Service (ClusterIP) → kube-proxy → Pod → 應(yīng)用容器
Nginx Ingress Controller是最成熟的方案。其配置熱更新機(jī)制值得深入理解:Nginx配置變更時(shí),Controller不會重啟Nginx進(jìn)程,而是通過nginx -s reload優(yōu)雅加載配置,避免連接中斷。配置通過ConfigMap管理,存儲在nginx.conf格式的配置文件中。
5.2 NodePort與HostNetwork
# NodePort Service示例 apiVersion:v1 kind:Service metadata: name:api-service namespace:production spec: type:NodePort selector: app:api ports: -name:http port:80 # ClusterIP端口 targetPort:8080# Pod端口 nodePort:30080 # NodePort(范圍30000-32767) -name:grpc port:9090 targetPort:9090 nodePort:30090
HostNetwork模式:某些高性能場景下,Pod直接綁定宿主機(jī)的網(wǎng)絡(luò)命名空間(hostNetwork: true),此時(shí)Pod的網(wǎng)絡(luò)接口與宿主機(jī)共享,不經(jīng)過CNI插件。代價(jià)是端口沖突風(fēng)險(xiǎn)增加,且Pod間隔離性降低。
6 網(wǎng)絡(luò)策略(NetworkPolicy)實(shí)戰(zhàn)
6.1 命名空間級別隔離
最基本的網(wǎng)絡(luò)策略是按命名空間進(jìn)行隔離。
# 默認(rèn)拒絕所有入站流量(除系統(tǒng)組件)
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:default-deny-ingress
namespace:production
spec:
podSelector:{}
policyTypes:
-Ingress
---
# 允許同一命名空間內(nèi)同標(biāo)簽Pod通信
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:allow-same-namespace
namespace:production
spec:
podSelector:
matchLabels:
role:backend
policyTypes:
-Ingress
ingress:
-from:
-podSelector:
matchLabels:
role:backend
6.2 Calico GlobalNetworkPolicy跨命名空間策略
# 跨命名空間策略:允許monitoring命名空間訪問所有命名空間的/prometheus端點(diǎn)
apiVersion:projectcalico.org/v3
kind:GlobalNetworkPolicy
metadata:
name:allow-prometheus-scraping
spec:
namespaceSelector:has(projectcalico.org/name)
order:50
ingress:
-action:Allow
protocol:TCP
destination:
ports:
-9090
-9100
source:
namespaceSelector:name=="monitoring"
selector:app=='prometheus'
egress:
-action:Allow
7 DNS解析問題排障
DNS是K8s網(wǎng)絡(luò)中出問題頻率最高的模塊之一。Pod無法解析Service域名、CoreDNS響應(yīng)慢等問題幾乎每個(gè)運(yùn)維工程師都遇到過。
7.1 DNS排障命令鏈
# 1. 在Pod內(nèi)測試DNS解析
kubectlexec-it pod-test -- /bin/sh
# 使用nslookup(舊版)或dig/host
nslookup kubernetes.default
# 預(yù)期輸出:Name: kubernetes.default Address: 10.96.0.1
# 使用dig(需要安裝)
dig +short kubernetes.default.svc.cluster.local
# 2. 查看Pod的DNS配置
cat /etc/resolv.conf
# 預(yù)期:
# nameserver 10.96.0.10
# search production.svc.cluster.local svc.cluster.local cluster.local
# options ndots:5
# 3. 檢查CoreDNS日志
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=200
# 查找ERROR或timeout關(guān)鍵詞
# 4. CoreDNS Pod健康檢查
kubectlexec-it -n kube-system
$(kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[0].metadata.name}')
-- /coredns -plugins
7.2 ndots配置問題
/etc/resolv.conf中的ndots選項(xiàng)是DNS解析行為的關(guān)鍵控制參數(shù)。
ndots的含義: 當(dāng)查詢的域名中包含的"."數(shù)量少于ndots時(shí), 優(yōu)先使用search路徑進(jìn)行查找。 例如ndots=5,查詢"prometheus-server": 1. prometheus-server.production.svc.cluster.local (失?。? 2. prometheus-server.svc.cluster.local (失?。? 3. prometheus-server.cluster.local (失?。? 4. prometheus-server (成功) 每次都需要遍歷所有search路徑才能查詢到結(jié)果, 這對內(nèi)部Service查詢性能有顯著影響。
解決方案:對于已知是集群內(nèi)部Service的訪問,應(yīng)使用完整域名(避免search路徑查找),或在Pod的DNS配置中調(diào)整ndots值。
# Pod DNS配置 spec: dnsPolicy:ClusterFirstWithHostNet dnsConfig: nameservers: -10.96.0.10 searches: -production.svc.cluster.local -svc.cluster.local -cluster.local options: -name:ndots value:"2" # 降低ndots,內(nèi)網(wǎng)Service查找優(yōu)先 -name:timeout value:"2" -name:attempts value:"2"
8 跨節(jié)點(diǎn)Pod通信故障案例
8.1 案例一:Calico BGP鄰居建立失敗
癥狀:跨節(jié)點(diǎn)Pod無法通信,同節(jié)點(diǎn)Pod通信正常。curl到同節(jié)點(diǎn)Pod IP正常,curl到跨節(jié)點(diǎn)Pod IP超時(shí)。
排查流程:
# Step 1: 檢查Calico節(jié)點(diǎn)狀態(tài) calicoctl node status # 預(yù)期:顯示每個(gè)節(jié)點(diǎn)的BGP狀態(tài)為Established # 如果顯示非Established,說明BGP鄰居有問題 # Step 2: 檢查路由表 ip route | grep 10.244 # 預(yù)期輸出: # 10.244.0.0/24 via 10.112.0.51 dev eth0 proto bird # 10.244.2.0/24 via 10.112.0.52 dev eth0 proto bird # 如果缺少某條路由,說明該方向的BGP宣告失敗 # Step 3: 查看BIRD日志 kubectl logs -n calico-system -l k8s-app=calico-node --tail=50 | grep -i bgp # Step 4: 測試網(wǎng)絡(luò)連通性 # 從Node-1上ping對端Node-2的Pod子網(wǎng)網(wǎng)關(guān) ping -I 10.244.0.1 10.244.2.1
根因:物理網(wǎng)絡(luò)防火墻未放開BGP端口(TCP 179),導(dǎo)致兩個(gè)節(jié)點(diǎn)間的BGP會話無法建立。
修復(fù):在物理網(wǎng)絡(luò)設(shè)備上放行TCP 179端口,并配置net.ipv4.ip_forward=1。
8.2 案例二:Flannel VxLAN包丟失
癥狀:同節(jié)點(diǎn)Pod通信正常,跨節(jié)點(diǎn)通信部分丟包,延遲忽高忽低。
# Step 1: 檢查VxLAN設(shè)備狀態(tài) ip -d link show flannel.1 # 預(yù)期:flannel.1: flags=# vxlan id 1 local 10.112.0.51 dev ens160 srcport 0 0 dstport 8472 # Step 2: 檢查FDB(轉(zhuǎn)發(fā)數(shù)據(jù)庫) bridge fdb show | grep flannel.1 # 預(yù)期:顯示每個(gè)遠(yuǎn)端節(jié)點(diǎn)MAC地址和外層IP映射 # Step 3: 檢查MTU # VxLAN頭部開銷:50字節(jié)(外層IP+UDP+VXLAN+內(nèi)層ETH) # 如果物理網(wǎng)絡(luò)MTU=1500,則VxLAN設(shè)備的MTU應(yīng)設(shè)為1450 ip linksetflannel.1 mtu 1450 # Step 4: 丟包統(tǒng)計(jì) cat /sys/class/net/flannel.1/statistics/rx_errors cat /sys/class/net/flannel.1/statistics/tx_dropped
根因:物理網(wǎng)絡(luò)MTU設(shè)置為9000(Jumbo Frame),但VxLAN設(shè)備MTU未做對應(yīng)調(diào)整,導(dǎo)致分片丟包。
9 Cilium eBPF時(shí)代的網(wǎng)絡(luò)新特性
9.1 kube-proxy替換
Cilium最革命性的特性之一是可以完全替換kube-proxy。在eBPF模式下,Service的負(fù)載均衡由eBPF程序在內(nèi)核中直接完成,無需經(jīng)過iptables或IPVS。
# 檢查Cilium是否替換了kube-proxy kubectlexec-it -n kube-system ds/cilium -- cilium-dbg status | grep KubeProxyReplacement # 預(yù)期輸出: # Kube-proxy replacement: enabled # Revision: 5 # eBPF IPv4 masquerade: enabled # 驗(yàn)證:查看iptables中是否已無KUBE-SERVICES鏈 iptables -t nat -L | grep KUBE # 如果Cilium完全接管,輸出應(yīng)為空或僅有極少規(guī)則
性能對比數(shù)據(jù)(Cilium官方benchmark):
| 指標(biāo) | kube-proxy (iptables) | Cilium eBPF |
|---|---|---|
| Service連接建立延遲 | 15μs | 8μs |
| 最大Service數(shù)量(無性能衰退) | ~500 | ~10000 |
| 1000 Services時(shí)P99延遲 | 3ms | 0.5ms |
9.2 Hubble:內(nèi)置服務(wù)觀測性
Hubble是Cilium內(nèi)置的L7可觀測性工具,提供實(shí)時(shí)的Service依賴圖和流量可視化。
# 啟用Hubble UI cilium hubbleenable--ui # 查看實(shí)時(shí)流量 cilium hubble observe --from-label app=api-server # 預(yù)期輸出: # TIMESTAMP SOURCE DESTINATION TYPE VERDICT # 1045 api-server:8080 order-svc:80 HTTP/GET FORWARDED # 1046 order-svc:80 mysql:3306 L4/TCP FORWARDED # 1047 api-server:8080 redis:6379 HTTP/GET DENIED
Hubble UI提供了Service依賴的可視化拓?fù)鋱D,節(jié)點(diǎn)間的連線顏色表示流量方向(請求/響應(yīng))和狀態(tài)(成功/失敗),無需額外部署Jaeger或Zipkin即可獲得Service級別的可觀測性。
10 結(jié)論
本文從網(wǎng)絡(luò)模型出發(fā),系統(tǒng)闡述了Kubernetes網(wǎng)絡(luò)的原理與實(shí)踐。核心證據(jù)鏈如下:
CNI插件選型的證據(jù)鏈:Flannel適合快速起步但缺乏網(wǎng)絡(luò)策略能力;Calico的BGP路由透傳在同子網(wǎng)環(huán)境下提供接近物理網(wǎng)絡(luò)的性能(9.6Gbps vs 9.8Gbps基線),網(wǎng)絡(luò)策略能力業(yè)界領(lǐng)先;Cilium的eBPF實(shí)現(xiàn)在10000+ Service規(guī)模下仍能保持O(1)查找性能,是2026年大規(guī)模集群的首選。
DNS問題根因的證據(jù)鏈:生產(chǎn)環(huán)境中DNS問題的70%以上源于ndots配置不當(dāng)導(dǎo)致查詢路徑過長,20%源于CoreDNS資源不足(OOM),10%源于上游DNS不可達(dá)。調(diào)整ndots到合理值(建議2-3)是立竿見影的優(yōu)化手段。
跨節(jié)點(diǎn)通信問題的證據(jù)鏈:在BGP模式下,物理網(wǎng)絡(luò)防火墻未放行BGP端口(TCP 179)是跨節(jié)點(diǎn)通信故障的首要原因;在VxLAN模式下,MTU配置不一致(VxLAN需要50字節(jié)開銷)是丟包的主要原因。
Cilium eBPF優(yōu)勢的證據(jù)鏈:eBPF在內(nèi)核空間直接完成負(fù)載均衡,繞過iptables/IPVS的Netfilter hook,Service連接建立延遲從15μs降低到8μs,1000 Service規(guī)模下P99延遲從3ms降低到0.5ms。這些數(shù)據(jù)來自Cilium官方benchmark,在2026年的生產(chǎn)環(huán)境中已被廣泛驗(yàn)證。
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
8323瀏覽量
95510 -
模型
+關(guān)注
關(guān)注
1文章
3808瀏覽量
52239 -
kubernetes
+關(guān)注
關(guān)注
0文章
273瀏覽量
9526
原文標(biāo)題:Kubernetes網(wǎng)絡(luò):從CNI原理到故障排查
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Kubernetes 網(wǎng)絡(luò)模型如何實(shí)現(xiàn)常見網(wǎng)絡(luò)任務(wù)
5G網(wǎng)絡(luò)優(yōu)化中,信令測試儀如何幫助故障排查?
Linux SSH遠(yuǎn)程管理故障如何排查?
Linux SSH遠(yuǎn)程管理故障如何排查?
直放站干擾排查實(shí)錄分析
Kubernetes網(wǎng)絡(luò)模型的基礎(chǔ)知識
網(wǎng)絡(luò)故障排查思路和處理方法
Linux服務(wù)器常見的網(wǎng)絡(luò)故障排查方法
PLC故障排查步驟
Altium Designer故障原因排查
OSI七層模型在網(wǎng)絡(luò)故障排查中的應(yīng)用
利用Last Log(Ramoops)排查系統(tǒng)問題:配置與實(shí)踐指南
Kubernete網(wǎng)絡(luò)模型的原理和故障排查實(shí)踐
評論