哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Kubernete網(wǎng)絡(luò)模型的原理和故障排查實(shí)踐

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2026-03-31 14:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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)證。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 網(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)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Kubernetes 網(wǎng)絡(luò)模型如何實(shí)現(xiàn)常見網(wǎng)絡(luò)任務(wù)

    Kubernetes 是為運(yùn)行分布式集群而建立的,分布式系統(tǒng)的本質(zhì)使得網(wǎng)絡(luò)成為 Kubernetes 的核心和必要組成部分,了解 Kubernetes 網(wǎng)絡(luò)模型可以使你能夠正確運(yùn)行、監(jiān)控和排查
    的頭像 發(fā)表于 10-08 11:32 ?1776次閱讀

    5G網(wǎng)絡(luò)優(yōu)化中,信令測試儀如何幫助故障排查

    在5G網(wǎng)絡(luò)優(yōu)化中,信令測試儀扮演著至關(guān)重要的角色,特別是在故障排查方面。以下詳細(xì)分析信令測試儀如何幫助進(jìn)行5G網(wǎng)絡(luò)中的故障
    發(fā)表于 03-20 14:18

    Linux SSH遠(yuǎn)程管理故障如何排查?

    SSH遠(yuǎn)程管理故障排查方案:1、檢測兩個(gè)機(jī)器是否暢通  兩個(gè)機(jī)器之間是否暢通,查看物理鏈路是否有問題(網(wǎng)線網(wǎng)卡、IP是否正確)  第1步:物理鏈路是否暢通,比喻為“高速公路是否暢通”  ping
    發(fā)表于 07-25 16:45

    Linux SSH遠(yuǎn)程管理故障如何排查?

    SSH遠(yuǎn)程管理故障排查方案:1、檢測兩個(gè)機(jī)器是否暢通  兩個(gè)機(jī)器之間是否暢通,查看物理鏈路是否有問題(網(wǎng)線網(wǎng)卡、IP是否正確)  第1步:物理鏈路是否暢通,比喻為“高速公路是否暢通”  ping
    發(fā)表于 11-30 17:40

    電腦故障分析排查

    電腦系統(tǒng)硬件故障分析,排查維護(hù)實(shí)用工具資料
    發(fā)表于 12-30 14:54 ?4次下載

    直放站干擾排查實(shí)錄分析

    干擾的排查表面上是一項(xiàng)技術(shù)工作,實(shí)際情況卻并不完全是這樣,還有許多技術(shù)外的東西起著主導(dǎo)性的作用。精細(xì)的管理、完善的臺站資料數(shù)據(jù)庫,可以使根據(jù)現(xiàn)象結(jié)合資料線索從理論上推斷干擾源地點(diǎn)成為可能。技術(shù)上
    發(fā)表于 12-13 05:47 ?2858次閱讀

    Kubernetes網(wǎng)絡(luò)模型的基礎(chǔ)知識

    Kubernetes 是為運(yùn)行分布式集群而建立的,分布式系統(tǒng)的本質(zhì)使得網(wǎng)絡(luò)成為 Kubernetes 的核心和必要組成部分,了解 Kubernetes 網(wǎng)絡(luò)模型可以使你能夠正確運(yùn)行、監(jiān)控和排查
    的頭像 發(fā)表于 07-20 09:46 ?2010次閱讀

    網(wǎng)絡(luò)故障排查思路和處理方法

    網(wǎng)絡(luò)故障是最容易出現(xiàn)的,且難以解決的問題。本文提供的網(wǎng)絡(luò)故障排查思路和處理方法,可解決日常工作中大部分網(wǎng)絡(luò)問題。
    發(fā)表于 10-31 09:14 ?1.3w次閱讀

    Linux服務(wù)器常見的網(wǎng)絡(luò)故障排查方法

    日常工作中我們有時(shí)會遇到服務(wù)器網(wǎng)絡(luò)不通問題,導(dǎo)致服務(wù)器無法正常運(yùn)行。要想解決服務(wù)器網(wǎng)絡(luò)故障問題,通常要先進(jìn)行網(wǎng)絡(luò)故障排查,這里以Linux服務(wù)器為例來看下常用的
    的頭像 發(fā)表于 04-14 15:47 ?4072次閱讀

    PLC故障排查步驟

    故障排查對于PLC非常重要,下面是一般的PLC故障排查步驟: (1)收集信息:首先,收集有關(guān)故障的詳細(xì)信息,包括
    的頭像 發(fā)表于 11-17 09:01 ?3766次閱讀

    Altium Designer故障原因排查

    本文將介紹當(dāng)您遇到凍結(jié)或長時(shí)間延遲以及Altium Designer死機(jī)等故障時(shí)如何進(jìn)行故障原因排查。上述故障通常由網(wǎng)絡(luò)流量通信問題造成的。
    的頭像 發(fā)表于 12-29 16:06 ?4825次閱讀
    Altium Designer<b class='flag-5'>故障</b>原因<b class='flag-5'>排查</b>

    電纜故障排查技術(shù)案例筆記

    電纜故障排查技術(shù)案例筆記
    的頭像 發(fā)表于 05-20 17:03 ?1646次閱讀
    電纜<b class='flag-5'>故障</b><b class='flag-5'>排查</b>技術(shù)案例筆記

    OSI七層模型網(wǎng)絡(luò)故障排查中的應(yīng)用

    OSI(Open Systems Interconnection)七層模型網(wǎng)絡(luò)故障排查中扮演著至關(guān)重要的角色。它提供了一個(gè)系統(tǒng)的框架,使得網(wǎng)絡(luò)技術(shù)人員可以逐層分析并定位
    的頭像 發(fā)表于 11-24 11:01 ?2814次閱讀

    利用Last Log(Ramoops)排查系統(tǒng)問題:配置與實(shí)踐指南

    Linux 內(nèi)核的ramoops機(jī)制實(shí)現(xiàn))可在系統(tǒng)異常時(shí)保存核心日志,為事后故障分析提供關(guān)鍵依據(jù)。本文將詳細(xì)介紹其配置方法與問題排查實(shí)踐,并通過具體案例演示實(shí)戰(zhàn)流程。
    的頭像 發(fā)表于 02-05 13:54 ?442次閱讀
    利用Last Log(Ramoops)<b class='flag-5'>排查</b>系統(tǒng)問題:配置與<b class='flag-5'>實(shí)踐</b>指南

    壓力傳感器故障排查實(shí)戰(zhàn)指南

    不及時(shí)或方法不當(dāng),易延誤項(xiàng)目進(jìn)度、引發(fā)客戶投訴。本文結(jié)合一線實(shí)操經(jīng)驗(yàn),梳理壓力傳感器常見故障類型,拆解故障成因與排查流程,提供針對性解決方案及安裝規(guī)避技巧,幫助安裝人員快速定位問題、高效解決
    的頭像 發(fā)表于 01-14 15:52 ?1589次閱讀
    深圳市| 青铜峡市| 遂宁市| 滨州市| 阳泉市| 西充县| 闸北区| 绥阳县| 连云港市| 罗城| 武平县| 勐海县| 阳曲县| 田东县| 大厂| 连江县| 九寨沟县| 拜泉县| 南阳市| 遵义县| 景泰县| 和顺县| 云霄县| 东莞市| 竹北市| 文安县| 五大连池市| 南康市| 长宁县| 正宁县| 正镶白旗| 温州市| 汝南县| 浠水县| 靖西县| 南江县| 兴文县| 双桥区| 巫溪县| 广州市| 鲁山县|