k8s 網(wǎng)絡(luò)三

k8s網(wǎng)絡(luò)包括網(wǎng)絡(luò)模型、CNI、Service、Ingress、DNS。
k8s的容器網(wǎng)絡(luò)關(guān)注兩點(diǎn):IP地址分配,路由。

網(wǎng)絡(luò)

k8s的網(wǎng)絡(luò)依賴于docker,docker的網(wǎng)絡(luò)需要linux內(nèi)核特性的支持。

k8s的三種ip
  • node ip:node節(jié)點(diǎn)的ip地址。節(jié)點(diǎn)的物理網(wǎng)卡ip。從集群的VPC網(wǎng)絡(luò)為節(jié)點(diǎn)分配IP地址。
  • pod ip:pod的ip地址。是docker engine根據(jù)docker0網(wǎng)橋的ip地址段分配的,是虛擬的二層網(wǎng)絡(luò)??梢詫?shí)現(xiàn)不同node中pod之間的通信。通過(guò)--pod-cidr指定pod的可分配IP地址段。
  • cluster ip:service的ip地址。由k8s管理和分配,來(lái)源于cluster ip地址池。無(wú)法被ping,因?yàn)闆](méi)有“實(shí)體網(wǎng)絡(luò)對(duì)象”。只能結(jié)合service port組成具體的通信端口。從集群的VPC網(wǎng)絡(luò)為每項(xiàng)服務(wù)分配IP地址。
創(chuàng)建Pod的網(wǎng)絡(luò)流程

1 每個(gè)Pod除了創(chuàng)建時(shí)指定的容器外,都有一個(gè)kubelet啟動(dòng)時(shí)指定的基礎(chǔ)容器。
2 kubelet創(chuàng)建基礎(chǔ)容器,生成network namespace。
3 kubelet調(diào)用網(wǎng)絡(luò)CNI driver,由它根據(jù)配置調(diào)用具體的CNI 插件。
4 CNI 插件給基礎(chǔ)容器配置網(wǎng)絡(luò)。
5 Pod 中其他的容器共享使用基礎(chǔ)容器的網(wǎng)絡(luò)。

Ingress

Ingress是HTTP方式的路由轉(zhuǎn)發(fā)機(jī)制,即是7層負(fù)載均衡器,由Ingress Controller和HTTP代理服務(wù)器組成。Ingress Controller實(shí)時(shí)監(jiān)控k8s API,實(shí)時(shí)更新HTTP代理服務(wù)器的轉(zhuǎn)發(fā)規(guī)則。HTTP代理服務(wù)器有GCE Load-Balancer、HaProxy、Nginx等方案。ingress controller在轉(zhuǎn)發(fā)客戶端請(qǐng)求到后端服務(wù)時(shí),將跳過(guò)kube-proxy提供的4層負(fù)載均衡器的功能,直接轉(zhuǎn)發(fā)到service的后端pod(endpoint)。

對(duì)于需要為k8s集群外的客戶端提供服務(wù)的service,可以通過(guò)ingress將服務(wù)暴露出去。

Network Policy

網(wǎng)絡(luò)策略是基于pod源ip(因此k8s網(wǎng)絡(luò)不能隨便做SNAT)的訪問(wèn)控制列表,限制pod之間的訪問(wèn)。
網(wǎng)絡(luò)策略作為pod網(wǎng)絡(luò)隔離的一層抽象,用白名單實(shí)現(xiàn)了訪問(wèn)控制列表,從label selector、namespace selector、端口、CIDR這4個(gè)維度限制pod的流量進(jìn)出。

ingress限制進(jìn)入的流量,egress限制外出的流量。

集群DNS

完成從服務(wù)名到clusterIP的解析。
DNS服務(wù)經(jīng)歷從skyDNS到kubeDNS再到coreDNS的過(guò)程。k8s通過(guò)Add-On增值包的方式引入DNS系統(tǒng),把服務(wù)名作為dns域名。程序就可以直接使用服務(wù)名來(lái)建立通信連接。

容器中的數(shù)據(jù)到外網(wǎng)

從容器發(fā)出的數(shù)據(jù)包先到達(dá)br0,然后交給host機(jī)器的協(xié)議棧,由于目的IP是外網(wǎng),且host主機(jī)開(kāi)啟了IP forward功能,數(shù)據(jù)包會(huì)通過(guò)eth0發(fā)出。因容器分配的網(wǎng)段都不在物理網(wǎng)絡(luò)網(wǎng)段內(nèi),所以一般發(fā)出去之前先做NAT轉(zhuǎn)換。(可以用iptables進(jìn)行轉(zhuǎn)換)
當(dāng)涉及轉(zhuǎn)發(fā)的目的IP地址是其他機(jī)器時(shí),需要確保啟用ip forward功能,即把linux當(dāng)作交換機(jī)。

參考

  • 《Kubernetes 權(quán)威指南》
  • 《每天5分鐘玩轉(zhuǎn)kubernetes》
  • 《Kubernetes 權(quán)威指南-企業(yè)級(jí)容器云實(shí)踐》
  • 《Kubernetes 網(wǎng)絡(luò)權(quán)威指南》
  • k8s網(wǎng)絡(luò)--竹徑風(fēng)聲
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容