1.K8sçFlannelç½ç»
2.深入理解kubernetes(k8s)网络原理之五-flannel原理
3.《深入剖析Kubernetes》10. 跨主机容器网络-Flannel 与Calico解决方案
4.带你搞懂 Kubernetes Pod 如何获取 IP 地址
5.Kubernetes 如何为Pod分配地址
6.[知识讲解篇-166] 循序渐进理解CNI机制与Flannel工作原理
K8sçFlannelç½ç»
åæï¼ ä¸æçæk8sçFlannelç½ç» - ç¥ä¹ (zhihu.com)
æ们å æ¥çå¾ç¤ºä¾ï¼ä¸é¢å个æ¯k8sçç½ç»æ¨¡åå¾ã
k8sçç½ç»æ¨¡å
æ们ç¥éï¼å¨k8séé¢æå°ç管çåå æ¯podï¼ä¸ä¸ªä¸»æºå¯ä»¥è·å¤ä¸ªpodï¼ä¸ä¸ªpodéé¢å¯ä»¥è·å¤ä¸ªå®¹å¨ã
å¦ä¸é¢æ示ï¼ä¸ä¸ªpodéé¢ææç容å¨å ±äº«ä¸ä¸ªç½ç»å½å空é´(network namespace)ï¼æ以ï¼podéé¢ç容å¨ä¹é´éä¿¡ï¼å¯ä»¥ç´æ¥éè¿localhostæ¥å®æï¼podéé¢ç容å¨ä¹é´éè¿localhost+端å£çæ¹å¼æ¥éä¿¡ï¼è¿ååºç¨ç¨åºå¨å®¿ä¸»æºçéä¿¡æ¹å¼æ¯ä¸æ ·çï¼ã
é£ä¹podåpodä¹é´çéä¿¡å¢ï¼é常æ¥è¯´ï¼æ们ç»åºç¨ç¨åºå®æ»ç«¯å£ä¼ç»åºç¨ç¨åºæ°´å¹³æ©å±å¸¦æ¥å¾å¤ä¸ä¾¿ï¼æ以k8sä¸ä¼ä½¿ç¨å®æ»ç«¯å£è¿æ ·çæ¹æ³ï¼èæ¯éç¨å ¶ä»æ¹æ³æ¥è§£å³podä¹é´å¯»åçé®é¢
æ¯ä¸ªpodé½ä¼æä¸ä¸ªèªå·±çipï¼å¯ä»¥å°PodåVMæç©ç主æºä¸æ ·å¯¹å¾ ãè¿æ ·podåpodä¹é´çéä¿¡å°±ä¸éè¦å容å¨ä¸æ ·ï¼éè¿å å¤ç«¯å£æ å°æ¥éä¿¡äºï¼è¿æ ·å°±é¿å äºç«¯å£å²çªçé®é¢ã
ç¹æ®çæ åµä¸ï¼æ¯å¦è¿ç»´åç½ç»æ£æµæè ç¨åºè°è¯ï¼ï¼å¯ä»¥å¨podæå¨ç宿主æºæ³åpodçip+端å£å起请æ±ï¼è¿äºè¯·æ±ä¼è½¬åå°podç端å£ï¼ä½æ¯podæ¬èº«å®èªå·±æ¯ä¸ç¥é端å£çåå¨çã
å æ¤ï¼k8sçç½ç»éµå¾ªä»¥ä¸ååï¼
æä¸é¢è¿ä¸ªpodæ¿æ¢æ容å¨ä¹æ¯æç«çï¼å 为podéé¢ç容å¨åpodå ±äº«ç½ç»ã
åºæ¬ä¸çååå°±æ¯ï¼k8sçéé¢çpodå¯ä»¥èªç±çåé群éé¢çä»»ä½å ¶ä»podéä¿¡ï¼å³ä½¿ä»ä»¬æ¯é¨ç½²å¨ä¸åç宿主æºï¼ï¼èä¸podç´æ¥çéä¿¡æ¯ç´æ¥ä½¿ç¨podèªå·±çipæ¥éä¿¡ï¼ä»ä»¬ä¸ç¥é宿主æºçipï¼æ以ï¼å¯¹äºpodä¹é´æ¥è¯´ï¼å®¿ä¸»æºçç½ç»ä¿¡æ¯æ¯éæçï¼å¥½åä¸åå¨ä¸æ ·ã
ç¶åï¼å®äºè¿å 个ååä¹åï¼å ·ä½çå®ç°k8sçè¿ä¸ªç½ç»æ¨¡åæ好å¤ç§å®ç°ï¼æ们è¿éä»ç»çæ¯ Flannel ï¼æ¯å ¶ä¸æç®åçä¸ç§å®ç°ã
Flannelå®ç°podä¹é´çéä¿¡ï¼æ¯éè¿ä¸ç§è¦çç½ç»ï¼overlay networkï¼ï¼ææ°æ®å å°è£ å¨å¦å¤ä¸ä¸ªç½ç»æ¥å转åï¼è¿ä¸ªè¦çç½ç»å¯ä»¥ç»æ¯ä¸ä¸ªpodåé ä¸ä¸ªç¬ç«çipå°åï¼ä½¿ä»ä»¬çèµ·æ¥é½æ¯ä¸å°å ·æç¬ç«ipçç©ç主æºä¸æ ·ã
ä¸é¢è¿ä¸ªå°±æ¯k8sç¨è¦çç½ç»æ¥å®ç°çä¸ä¸ªä¾åï¼
flannelè¦çç½ç»
å¯ä»¥çå°æ3个nodeï¼å¨å¤ä¸ªnodeä¸å»ºç«ä¸ä¸ªè¦çç½ç»ï¼åç½ç½æ®µæ¯..0.0/,源码ç¶åï¼æç»å°å®¹å¨çº§å«ï¼æ¯ä¸ªå®¹å¨å¨è¿ä¸ªç½æ®µéé¢è·åå°ä¸ä¸ªç¬ç«çipãè宿主æºæå¨çå±åç½ç»çç½æ®µæ¯...0/
çè¿ä¸¤ä¸ªç½æ®µï¼å°±ç¥éï¼fannelç»è¿ä¸ªé群å建äºä¸ä¸ªæ´å¤§çç½ç»ç»pod使ç¨ï¼å¯ä»¥å®¹çº³ç主æºæ°éè¾¾å°ï¼2^ï¼ä¸ªã
对äºæ¯ä¸ªå®¿ä¸»æºï¼fannelç»æ¯ä¸ªäºä¸ä¸ªå°ä¸ç¹çç½ç»..x.0/ï¼æä¾ç»æ¯ä¸ªè¿ä¸ªå®¿ä¸»æºçæ¯ä¸ä¸ªpod使ç¨ï¼ä¹å°±æ¯è¯´ï¼æ¯ä¸ä¸ªå®¿ä¸»æºå¯ä»¥æ(2^8)个podãdockeré»è®¤çç½æ¡¥docker0ç¨çå°±æ¯è¿ä¸ªç½ç»ï¼ä¹å°±æ¯ææçdockeréè¿docker0æ¥ä½¿ç¨è¿ä¸ªç½ç»ãå³æ¯è¯´ï¼å¯¹äºå®¹å¨æ¥è¯´ï¼é½æ¯éè¿docker0è¿ä¸ªæ¡¥æ¥éä¿¡ï¼åæ们平常åæºç容å¨æ¯ä¸æ ·çï¼å¦æä½ ä¸ç»å建ç容å¨æå®ç½ç»çè¯ï¼é»è®¤ç¨çæ¯docker0ï¼åèè¿ç¯ docker bridge çæç« ï¼
é£ä¹ï¼å¯¹äºåä¸ä¸ªhostéé¢ç容å¨éä¿¡ï¼æ们ä¸é¢è¯´äºæ¯éè¿è¿ä¸ªå°å®¿ä¸»æºçéé¢çdocker0è¿ä¸ªç½æ¡¥æ¥éä¿¡ãé£å¯¹äºè·¨å®¿ä¸»æºï¼ä¹å³æ¯ä¸¤ä¸ªå®¿ä¸»æºä¹é´ç容å¨æ¯æä¹éä¿¡çå¢ï¼fannel使ç¨äºå®¿ä¸»æºæä½ç³»ç»çkernel routeåUDPï¼è¿æ¯å ¶ä¸ä¸ç§å®ç°ï¼å å°è£ æ¥å®æãä¸å¾æ¼ç¤ºäºè¿ä¸ªéä¿¡è¿ç¨ï¼
fannelç½ç»ä¸è·¨å®¿ä¸»æºç容å¨éä¿¡
å¦å¾æ示ï¼..1.2(container-1) è¦å..2.3(container-2)éä¿¡ï¼ä¸¤ä¸ªå®¹å¨åå«å¤äºä¸åç宿主æºã
å设æä¸ä¸ªå æ¯ä»..1.2ååºå»ç»..2.3ï¼å®ä¼å ç»è¿docker0ï¼å 为docker0è¿ä¸ªæ¡¥æ¯ææ容å¨çç½å ³ã ç¶åè¿ä¸ªå ä¼ç»è¿route tableå¤çï¼è½¬ååºå»å°å±åç½...0/. èè¿ä¸ªroute tableç对åºå¤çè¿ç±»å çè§ååæ¯ä»åªéæ¥çå¢ï¼å®ä»¬æ¯ç±fannelçä¸ä¸ªå®æ¤ç¨åºflanneldå建çã
æ¯ä¸å°å®¿ä¸»æºé½ä¼è·ä¸ä¸ªflannelçdeamonçè¿ç¨ï¼è¿ä¸ªè¿ç¨çç¨åºä¼å¾å®¿ä¸»æºçroute tableéé¢åå ¥ç¹å®çè·¯ç±è§åï¼è¿ä¸ªè§å大æ¦æ¯è¿æ ·çã
Node1çroute table
å¾ä¾çæ°æ®å ååºå»çç®æ å°åæ¯..2.3,å®å±äºç½æ®µ..0.0/,è¿ä¸ªç®æ å°åå½ä¸ç¬¬äºæ¡è§åï¼ä¹å°±æ¯è¿ä¸ªå ä¼åå°flannel0è¿ä¸ªè®¾å¤ï¼devï¼ï¼è¿ flannel0 æ¯ä¸ä¸ªTUN设å¤ãæ¯å¨å æ ¸éé¢çä¸ä¸ª èæç½ç»è®¾å¤ï¼èæç½å¡ï¼ ã
å¨å æ ¸ï¼kernelï¼éé¢ï¼æ两ç§èæç½å¡è®¾å¤ï¼åå«æ¯TUNåTAP,å ¶ä¸TAPå¤ççæ¯ç¬¬äºå±ï¼æ°æ®é¾è·¯å±ï¼ç帧ï¼èTUNå¤ççæ¯ç¬¬ä¸å±ï¼ç½ç»å±ï¼çipå ã
åºç¨ç¨åºå¯ä»¥ç»å®å°TUNåTAP设å¤ï¼å æ ¸ä¼ææ°æ®éè¿TUNæè TAP设å¤åéç»è¿äºç¨åºï¼åè¿æ¥ï¼åºç¨ç¨åºä¹å¯ä»¥éè¿TUNåTAPåå æ ¸åå ¥æ°æ®ï¼è¿èç±å æ ¸çè·¯ç±å¤çè¿äºååºå»çæ°æ®å ã
é£ä¹ä¸é¢è¿ä¸ª flannel0 å°±æ¯ä¸ä¸ªè¿æ ·çTUN设å¤ãè¿ä¸ªè®¾å¤è¿å°çæ¯ä¸ä¸ªflannelçå®æ¤è¿ç¨ç¨åº flanneld
èè¿ä¸ª flanneld æ¯å¹²åçå¢ï¼å®å¯ä»¥æ¥åææåå¾ flannel0 è¿ä¸ªè®¾å¤çæ°æ®å ï¼ç¶ååæ°æ®å°è£ å¤çï¼å®çå°è£ çé»è¾ä¹å¾ç®åï¼å°±æ¯æ ¹æ® ç®æ å°å ï¼æ¾å°è¿ä¸ªè¿å°å对åºçå¨æ´ä¸ªflannelç½ç»éé¢å¯¹åº ç©çipåç«¯å£ ï¼è¿éæ¯Node2对åºçç©çipï¼ï¼ç¶åå¢å ä¸ä¸ªå 头ï¼å¢å çå 头éé¢ ç®æ å°å 为è¿ä¸ª å®é çç©çipåç«¯å£ ï¼å½ç¶æºå°åä¹æ¹æäºå±åç½ç»çipï¼ï¼å°åæ¥çæ°æ®å åµå ¥å¨æ°çæ°æ®å ä¸ï¼ç¶ååæè¿ä¸ªå°è£ åçå æåå»ç»å æ ¸ï¼å æ ¸æ ¹æ®ç®æ å°åå»è·¯ç±è§åå¹é è§åï¼åç°ç®æ å°åipæ¯...,端å£æ¯. æ ¹æ®ipå¹é ä¸å°ä»»ä½ç¹å®çè§åï¼å°±ç¨ç¬¬ä¸æ¡defaultï¼é»è®¤ï¼çè§åï¼éè¿eth0è¿ä¸ªç©çç½å¡ï¼ææ°æ®å åç»å±åç½ï¼è¿éæ¯UDP广æåºå»ï¼
å½Node2çæ¶å°è¿ä¸ªå åï¼ç¶åæ ¹æ® ç«¯å£ åç°ä»çç®æ å°ååæ¥æ¯åç»flanneldçï¼ç¶åå°±ç´æ¥äº¤ç»flanneldè¿ç¨åºï¼flanneldæ¶å°å åï¼æå 头å»æï¼åç°åæ¥ç®æ å°åæ¯..2.3ï¼ç¶å就交æ¢flannel0ï¼flannel0æè¿ä¸ªè§£å¼åçåå 交ç»å æ ¸ï¼å æ ¸åç°å®çç®æ å°åæ¯..2.3ï¼åºè¯¥äº¤ç»docker0æ¥å¤çãï¼å¾ä¾éé¢ç»çæ¯ç´æ¥ç±flannel0交ç»docker0ï¼æ²¡æå¾ç¤ºåºå æ ¸ï¼å®é ä¸flannel0æ¯ä¸ä¸ªTUN设å¤ï¼æ¯è·å¨å æ ¸çï¼æ°æ®ç»è¿å®åå¯ä»¥äº¤ç»å æ ¸ï¼ç±å æ ¸æ ¹æ®è·¯ç±å³å®è¿ä¸æ¥æä¹forwardï¼
以ä¸å°±æ¯è¿ä¸ªéä¿¡çè¿ç¨ï¼é£ä¹è¿éæä¸ä¸ªé®é¢ï¼ flanneldæ¯æä¹ç¥é..2.3对åºçç®æ å°åæ¯...:çå¢ï¼
è¿æ¯å 为flanneldç»´æ¤äºä¸ä¸ªæ å°å ³ç³»ï¼æ¯åé ä¸ä¸ªèæç容å¨ipï¼åé ç»å®¹å¨æ°ipçæ¶åï¼ï¼å®å°±ç¥éè¿ä¸ªå®¹å¨çipå®é ä¸æ¯å¨åªå°å®¿ä¸»æºä¸ï¼ç¶åæè¿ä¸ªæ å°å ³ç³»åå¨èµ·æ¥ï¼å¨k8séé¢flanneldåå¨çè¿ä¸ªæ å°å ³ç³»æ¾å¨etdä¸ï¼è¿å°±æ¯ä¸ºä»ä¹flanneld为ä»ä¹ç¥éè¿ä¸ªæä¹å»å°è£ è¿äºå äºï¼ä¸é¢å°±æ¯etcdéé¢çæ°æ®çï¼
çä¸é¢è¿ä¸ªæ°æ®ï¼etcdéé¢åå¨ç..2.0-è¿ä¸ªç½æ®µç容å¨æ¯æ¾å¨...è¿å°å®¿ä¸»æºä¸çã
é£ä¹è¿æä¸ä¸ªé®é¢ï¼ç«¯å£åæ¯æä¹ç¥éç?
è¿ä¸ªå¾ç®åï¼flanneldçé»è®¤çå¬ç端å£å°±æ¯è¿ä¸ªç«¯å£ï¼flanneldå¯å¨çæ¶åï¼å°±çå¬äºUDP端å£. æ以åç»Node2ï¼çææUDPæ°æ®å ï¼flanneldè¿ä¸ªè¿ç¨ä¼ç´æ¥å¤çï¼ç¶åå»æå 头就è¿ååºæ¥åæ¥çå äºï¼è¿åå交ç»TUN设å¤flannel0,ç±flannel0交ç»å æ ¸ï¼å æ ¸æ ¹æ®Node2çè·¯ç±è§å交ç»docker0ï¼Node2çè·¯ç±è§åånode1æ¯åºæ¬ä¸ä¸æ ·çï¼é¤äºç¬¬ä¸ä½çç½æ®µæ è¯ä¸ä¸æ ·ï¼ä¸ä¸ªæ¯..1ä¸ä¸ªæ¯..2ï¼ï¼
çNode2çè¿ä¸ªè§åï¼flannldå»æå 头解åºæ¥çåå çç®æ ipæ¯..2.3,ç±flannel0交åå»ç»kennelï¼kennelåç°å½ä¸ç¬¬ä¸æ¡è§åï¼æ以ä¼æè¿ä¸ªå å«ç»docker0,继èå°±è¿å ¥äºdocker0è¿ä¸ªæ¡¥çåç½äºï¼æ¥ä¸å»å°±æ¯dockerçäºæ äºï¼ åè以ååçæç« ã
æåä¸ä¸ªé®é¢ï¼æä¹é ç½®dockerå»ä½¿ç¨..x.0/è¿ä¸ªåç½å¢ï¼å¦ææ¯æå·¥å建容å¨çè¯ï¼è¿ä¸ªä¹æ¯é常ç®åçï¼ åè以ååçå ³äºdocker bridgeçè¿ç¯æç« ï¼ä½æ¯å¨k8séé¢ï¼æ¯éè¿é ç½®æ¥å®ç°çï¼
flanneldä¼æåç½ä¿¡æ¯åå°ä¸ä¸ªé ç½®æ件 /run/flannel/subnet.env é
dockerä¼ä½¿ç¨è¿ä¸ªé ç½®çç¯å¢åäºæ¥ä½ä¸ºå®çbridgeçé ç½®
深入理解kubernetes(k8s)网络原理之五-flannel原理
flannel在Kubernetes(k8s)网络架构中扮演着关键角色,其提供多种网络模式,源码其中最为广泛应用的源码是VXLAN模式。本文旨在深入探讨VXLAN模式下flannel的源码运作原理,同时对UDP模式进行简要介绍。源码
VXLAN模式下的源码化妆品小程序源码flannel依赖于VXLAN协议,实现跨主机Pod间的源码通信。这种模式下,源码flannel的源码组件工作流程涉及多个关键步骤。首先,源码flannel-cni文件作为CNI规范下的源码二进制文件,负责生成配置文件并调用其它CNI插件(如bridge和host-local),源码从而实现主机到主机的源码网络互通。flannel-cni文件并非flannel项目源码,源码而是源码位于CNI的plugins中。
在flannel-cni工作流程中,kubelet在创建Pod时,会启动一个pause容器,并获取网络命名空间。随后,它调用配置文件指定的CNI插件(即flannel),以加载相关参数。flannel读取从/subnet.env文件获取的节点子网信息,生成符合CNI标准的配置文件。接着,flannel利用此配置文件调用bridge插件,完成Pod到主机、同主机Pod间的数据通信。
kube-flannel作为Kubernetes的daemonset运行,主要负责跨节点Pod通信的编织工作。它完成的iosvlc源码下载主要任务包括为每个节点创建VXLAN设备,并更新主机路由。当节点添加或移除时,kube-flannel会相应地调整网络配置。在VXLAN模式下,每个节点上的kube-flannel会与flanneld守护进程进行通信,以同步路由信息。
在UDP模式下,每个节点运行flanneld守护进程,参与数据包转发。flanneld通过Unix域套接字与本地flanneld通信,而非通过fdb表和邻居表同步路由信息。当节点新增时,kube-flannel会在节点间建立路由条目,并调整网络配置以确保通信的连续性。
flannel在0.9.0版本前,使用不同策略处理VXLAN封包过程中可能缺少的ARP记录和fdb记录。从0.9.0版本开始,flannel不再监听netlink消息,优化了内核态与用户态的交互,从而提升性能。
通过理解flannel的运行机制,可以发现它在VXLAN模式下实现了高效的跨节点Pod通信。flannel挂载情况不影响现有Pod的通信,但新节点或新Pod的加入需flannel参与网络配置。本文最后提示读者,了解flannel原理后,可尝试自行开发CNI插件。
《深入剖析Kubernetes》. 跨主机容器网络-Flannel 与Calico解决方案
跨主机容器通信的关键在于创建集群级别的网络连接,以实现容器间的直接通信。在 Docker 默认配置下,魂斗罗的源码不同宿主机的 docker0 网桥是孤立的,为此,Overlay Network技术应运而生。它通过软件创建一个集群共享的网桥,使所有容器都能连接并通信。 四种主要的Overlay解决方案包括Flannel和Calico,下面逐一介绍:Flannel网络解决方案
Flannel通过UDP模式实现,每个宿主机的flanneld客户端监听 UDP报文,作为容器通信的载体。它在宿主机间建立隧道,使用三层的TUN设备flannel0进行IP包转发,前提是docker0网桥的地址范围需包含Flannel分配的子网。VXLAN模式
VXLAN则是在三层网络上添加一层虚拟二层网络,通过VTEP设备作为隧道端点,提供高性能的二层通信。VNI(VXLAN网络标识符)是区分数据帧的关键标识,宿主机上的VTEP设备名称通常包含VNI值。Host-gw模式
Host-gw模式是纯三层解决方案,通过配置宿主机路由表实现,无需额外的封装和解封装,性能损失相对较低,但要求宿主机之间有二层连通性。Calico网络解决方案(IPIP模式)
Calico的IPIP模式更轻量级,它通过IPinIP隧道将容器间的通信伪装成宿主机间的通信,通过Linux的tunl0隧道接口进行封装和解封装,实现容器之间的直接通信。 以上这些解决方案都是为了克服单机容器通信的局限性,提供分布式集群中的高效通信。带你搞懂 Kubernetes Pod 如何获取 IP 地址
Kubernetes 的核心网络要求每个 Pod 都拥有独立的 IP 地址,以支持通信。vmp源码授权本文将解释网络组件如何协作,以及在 Flannel 作为网络提供商和 Containered 作为 container runtime 的场景下,Pod 如何获取 IP 地址。
首先,了解背景:Kubernetes 提供多种网络设置,其中 Flannel 通过 vxlan 在节点间封装数据包,而 CNI 插件(如Flannel CNI)负责配置 Pod 网络。在每个节点,Flanneld 与apiserver通信获取网络元数据,Flannel CNI 则与Bridge CNI 交互,为Pod配置 veth pair,连接到 Linux Bridge。
对于同一主机上的容器,通过 Linux Bridge 和 veth pair 实现通信。对于不同主机上的容器,Flannel 使用 vxlan 将数据包封装并发送到目标节点,然后在目标节点解封装并路由到相应 Pod。
节点 IPAM 控制器分配 podCIDR,确保每个 Pod 有唯一的 IP。kubelet 调用 CRI 插件,如containerd,后者再调用 CNI 插件来配置 Pod 的网络。CNI 插件交互包括调用 Bridge CNI 设置 veth pair,并使用主机本地 IPAM 插件为Pod分配 IP 地址。
总结来说,Kubernetes 的网络配置涉及节点分配的 podCIDR,CNI 插件的交互,以及如何在container runtime 和网络提供商之间协调,共同确保每个 Pod 都能获得其专属的 IP 地址,以便进行有效通信。实时查询源码
Kubernetes 如何为Pod分配地址
Kubernetes为每个Pod分配IP地址的核心网络要求,由网络提供者如flannel、calico、canal等实现。
在开始使用Kubernetes时,不清楚如何为Pod分配IP地址。了解组件独立工作,但不清楚组件组合方式。例如,了解CNI插件,但不清楚其调用机制。因此,撰写本文分享对网络组件的理解,如何将它们集成到Kubernetes集群中,使每个Pod获得IP地址。Kubernetes有多种网络设置方法和容器运行时选项。本文使用Flannel作为网络提供者,Containerd作为容器运行时。假设熟悉容器网络原理,并在上下文中简要介绍。
容器网络概述涉及Linux网桥网络和数据包封装。同一主机上的容器通过Linux桥相互通信,使用veth设备连接容器网络命名空间与主机网络上的Linux桥。不同主机上的容器通过数据包封装相互通信,Flannel通过VXLAN支持此功能,封装数据包在UDP数据包中传输。Kubernetes集群中,Flannel在每个节点上创建VXLAN设备和路由表条目,封装数据包后通过VXLAN设备传输,在目标位置检索并路由至目的地Pod。
容器运行时接口(CRI)允许kubelet使用不同容器运行时,各种运行时实现CRI API,支持在Kubernetes安装中使用首选运行时。容器网络接口(CNI)项目提供通用插件联网解决方案规范,包含各种插件执行网络配置功能。CNI插件遵循规范,是可执行文件,本文将讨论一些插件。
为每个节点分配Pod IP地址的子网确保集群中所有Pod具有唯一IP地址。使用Node IPAM控制器分配专用子网,确保不相交子网允许为每个Pod分配唯一IP地址。当Kubernetes节点首次向集群注册时,分配专用子网。更改节点分配的Pod子网需要先注销节点,使用Kubernetes控制平面的配置更改重新注册节点。列出节点Pod子网的命令。
在节点上调度Pod时,启动Pod引发网络配置和应用程序容器启动。容器运行时与CNI插件交互,为Pod配置网络。使用Containerd作为运行时,Containered CRI插件调用CNI插件。网络提供商CNI插件配置并调用基本CNI插件。Flannel作为网络提供者时,Flanneld守护程序配置pod网络。Flanneld初始化容器install-cni在每个节点创建CNI配置文件,并将podCIDR和其他网络元数据存储在文件中。创建Pod时,Flanneld配置路由允许Pod通过IP地址相互连接。
Containered CRI插件调用CNI插件配置网络,CNI插件间交互如下。Flannel CNI插件与Flanneld结合,从apiserver获取podCIDR等信息。Bridge CNI插件创建Linux桥,为每个Pod创建veth对,主机上所有容器连接至Linux桥。配置完成后,Bridge插件调用主机本地IPAM插件,配置并存储分配给容器的IP地址。
总结,Kube-controller-manager为每个节点分配podCIDR,为节点上的Pod分配唯一IP地址。Kubernetes集群管理员配置、安装kubelet、容器运行时、网络提供商代理,并在每个节点分发CNI插件。网络提供商代理启动生成CNI配置,节点上调度Pod后,kubelet调用CRI插件创建Pod。如果是Containerd,则调用CNI插件配置Pod网络,确保Pod获得IP地址。
[知识讲解篇-] 循序渐进理解CNI机制与Flannel工作原理
CNI(Container Network Interface)是kubernetes网络集成的解决方案,专注于容器网络连接和容器销毁时的资源释放,支持多种网络模式,易于实现。常见的CNI实现有Flannel、Calico、Weave等。CNI插件有三种实现模式:UDP、VxLAN、host-gw。
Flannel采用Overlay网络模式,将TCP数据包装在另一种网络包中进行路由转发和通信。它会在每一个宿主机上运行名为flanneld的代理,为宿主机预先分配一个子网,并为Pod分配IP地址。数据包通过VXLAN、UDP或host-gw后端机制进行转发。不同宿主机下的Pod属于不同的子网,通过Etcd存储网络配置、子网和主机公共IP信息。
Flannel支持三种实现:UDP、VxLAN、host-gw。host-gw模式性能最高,但要求节点处于同一网段。VxLAN模式使用内核VxLAN模块维护二层网络,构建Overlay网络,源VTEP设备通过二层数据帧进行通信,将原始IP包封装并发送给目的VTEP设备。在Linux内核中,网络设备进行转发的依据来自FDB转发数据库。UDP模式下,数据包从容器经过docker0出现在宿主机,根据路由表进入flannel0设备后,宿主机上的flanneld进程收到IP包。flanneld根据目的IP地址匹配到对应的子网,从Etcd中找到宿主机的IP地址。然后将UDP封装的IP包发送给Node2。
VxLAN模式下,flannel.1设备作为VTEP,封装原始IP包,并通过二层数据帧发送给目的VTEP设备。封装过程只是在原始IP包前面加上一个VxLAN头,包含VNI标识。Linux内核会对数据桢进行拆包,根据VNI值交给flanneld处理。最终数据包通过宿主机网络传输到目的Node。
在host-gw模式下,每个Flannel子网的下一跳设置为对应宿主机的IP地址,宿主机充当容器通信路径的网关。数据包封装成三层IP包,使用路由表的下一跳设置MAC地址,通过二层网络传输到目的宿主机。如果两个Pod所在节点在同一网段,可以配置VxLAN支持host-gw功能,直接通过物理网卡的网关路由转发,提高VxLAN性能。
0-overlay和underlay,这两种容器网络你分得清吗
本文主要探讨了容器网络中的两种模式:0-overlay和underlay。在理解云容器网络时,它们的区别至关重要。首先,让我们来看underlay网络,它指的是容器运行在底层虚拟机或物理机的网络环境中,这个环境可以直接识别和转发容器的IP地址。具体来说,有两种实现方式:一是通过将每个节点的容器子网注入到VPC的路由表中,使内部ECS和容器可以直接访问容器IP;二是直接从VPC分配IP给容器,提供直接的网络连接。
相比之下,overlay网络则更为复杂。在这种模式下,底层网络环境本身无法识别或转发容器IP,需要通过每个节点上的封装和解封装过程来处理网络流量。例如,Flannel的vxlan模式和Calico的ipip模式,通过隧道封装技术,仅要求kubernetes管理的节点间三层网络可达。以Flannel的vxlan为例,客户端容器的请求会被物理机上的flanneld进程封装成vxlan报文,然后通过三层网络发送到对端,服务端收到后由flanneld解封装并传递给容器。
关键的区别在于,overlay网络虽然灵活性高,但因为涉及到封装和解封装,可能导致性能损耗。相比之下,云厂商倾向于发展underlay网络,以实现更低延迟的直通能力,如ELB直接连接容器或者容器直接绑定EIP,以提高网络效率。