k8s網(wǎng)絡(luò)包括網(wǎng)絡(luò)模型、CNI、Service、Ingress、DNS。
k8s的容器網(wǎng)絡(luò)關(guān)注兩點:IP地址分配,路由。
網(wǎng)絡(luò)
k8s的網(wǎng)絡(luò)依賴于docker,docker的網(wǎng)絡(luò)需要linux內(nèi)核特性的支持。
k8s的三種ip
- node ip:node節(jié)點的ip地址。節(jié)點的物理網(wǎng)卡ip。從集群的VPC網(wǎng)絡(luò)為節(jié)點分配IP地址。
- pod ip:pod的ip地址。是docker engine根據(jù)docker0網(wǎng)橋的ip地址段分配的,是虛擬的二層網(wǎng)絡(luò)。可以實現(xiàn)不同node中pod之間的通信。通過--pod-cidr指定pod的可分配IP地址段。
- cluster ip:service的ip地址。由k8s管理和分配,來源于cluster ip地址池。無法被ping,因為沒有“實體網(wǎng)絡(luò)對象”。只能結(jié)合service port組成具體的通信端口。從集群的VPC網(wǎng)絡(luò)為每項服務(wù)分配IP地址。
創(chuàng)建Pod的網(wǎng)絡(luò)流程
1 每個Pod除了創(chuàng)建時指定的容器外,都有一個kubelet啟動時指定的基礎(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ā)機制,即是7層負載均衡器,由Ingress Controller和HTTP代理服務(wù)器組成。Ingress Controller實時監(jiān)控k8s API,實時更新HTTP代理服務(wù)器的轉(zhuǎn)發(fā)規(guī)則。HTTP代理服務(wù)器有GCE Load-Balancer、HaProxy、Nginx等方案。ingress controller在轉(zhuǎn)發(fā)客戶端請求到后端服務(wù)時,將跳過kube-proxy提供的4層負載均衡器的功能,直接轉(zhuǎn)發(fā)到service的后端pod(endpoint)。
對于需要為k8s集群外的客戶端提供服務(wù)的service,可以通過ingress將服務(wù)暴露出去。
Network Policy
網(wǎng)絡(luò)策略是基于pod源ip(因此k8s網(wǎng)絡(luò)不能隨便做SNAT)的訪問控制列表,限制pod之間的訪問。
網(wǎng)絡(luò)策略作為pod網(wǎng)絡(luò)隔離的一層抽象,用白名單實現(xiàn)了訪問控制列表,從label selector、namespace selector、端口、CIDR這4個維度限制pod的流量進出。
ingress限制進入的流量,egress限制外出的流量。
集群DNS
完成從服務(wù)名到clusterIP的解析。
DNS服務(wù)經(jīng)歷從skyDNS到kubeDNS再到coreDNS的過程。k8s通過Add-On增值包的方式引入DNS系統(tǒng),把服務(wù)名作為dns域名。程序就可以直接使用服務(wù)名來建立通信連接。
容器中的數(shù)據(jù)到外網(wǎng)
從容器發(fā)出的數(shù)據(jù)包先到達br0,然后交給host機器的協(xié)議棧,由于目的IP是外網(wǎng),且host主機開啟了IP forward功能,數(shù)據(jù)包會通過eth0發(fā)出。因容器分配的網(wǎng)段都不在物理網(wǎng)絡(luò)網(wǎng)段內(nèi),所以一般發(fā)出去之前先做NAT轉(zhuǎn)換。(可以用iptables進行轉(zhuǎn)換)
當(dāng)涉及轉(zhuǎn)發(fā)的目的IP地址是其他機器時,需要確保啟用ip forward功能,即把linux當(dāng)作交換機。
參考
- 《Kubernetes 權(quán)威指南》
- 《每天5分鐘玩轉(zhuǎn)kubernetes》
- 《Kubernetes 權(quán)威指南-企業(yè)級容器云實踐》
- 《Kubernetes 網(wǎng)絡(luò)權(quán)威指南》
- k8s網(wǎng)絡(luò)--竹徑風(fēng)聲