背景
在單個(gè)Kubernetes集群中,所有pod共用同一個(gè)網(wǎng)段且可以與其他pod通信,在網(wǎng)絡(luò)隔離和多租戶方面存在不足。Kubernetes提供了基于Network Policy的原生網(wǎng)絡(luò)隔離規(guī)則,但是沒(méi)有具體的實(shí)現(xiàn),并且這種原生的隔離存在局限性,租戶不能對(duì)網(wǎng)絡(luò)進(jìn)行單獨(dú)設(shè)置而是采用Kubernetes集群統(tǒng)一的配置,導(dǎo)致所有租戶共用一個(gè)網(wǎng)段、DNS、路由等。因此我們提供了一種能實(shí)現(xiàn)租戶間徹底的網(wǎng)絡(luò)隔離以及各租戶能夠獨(dú)立進(jìn)行網(wǎng)絡(luò)規(guī)劃和配置的華云SDN CNI的網(wǎng)絡(luò)隔離方法。
華云SDN CNI簡(jiǎn)介
本文的網(wǎng)絡(luò)隔離方法是基于華云SDN CNI的一種實(shí)現(xiàn)。華云SDN是安超云推出的一種高效、安全的網(wǎng)絡(luò)解決方案,華云SDN可以同時(shí)納管多個(gè)Kubernetes集群、多個(gè)安超集群、多個(gè)裸機(jī)和多個(gè)vmware集群,實(shí)現(xiàn)網(wǎng)絡(luò)互通。華云SDN CNI則是基于華云SDN的Kubernetes集群容器網(wǎng)絡(luò)解決方案,它實(shí)現(xiàn)了pod、service以及ingress等網(wǎng)絡(luò)資源的通信,以下是pod從創(chuàng)建到CNI分配網(wǎng)絡(luò)以及跨節(jié)點(diǎn)通信的網(wǎng)絡(luò)架構(gòu)圖:
華云SDN CNI網(wǎng)絡(luò)隔離方案
華云SDN CNI提供了四種網(wǎng)絡(luò)隔離模式:
默認(rèn)模式:這是基于華云SDN CNI的Kubernetes集群的默認(rèn)網(wǎng)絡(luò)模式,在該模式下,集群中所有的pod共用同一個(gè)網(wǎng)絡(luò),所有pod之間可以互相通信。不同Kubernetes集群之間相互隔離。
空間隔離模式:在該模式下,設(shè)置了隔離屬性的命名空間是孤立的,不能從其他命名空間訪問(wèn)該命名空間中的 pod,反之亦然。
租戶模式:在該模式下,通過(guò)在Kubernetes集群中創(chuàng)建network crd的方式,為某個(gè)namespace創(chuàng)建多個(gè)網(wǎng)絡(luò),并指定某個(gè)網(wǎng)絡(luò)為該namespace的默認(rèn)網(wǎng)絡(luò),此 namespace中創(chuàng)建的所有pod都默認(rèn)使用這個(gè)網(wǎng)絡(luò)。該模式與空間隔離模式區(qū)別在于空間隔離模式是基于集群名稱和命名空間名稱新建一個(gè)pod和service網(wǎng)絡(luò),但是共用集群默認(rèn)的ipam,為pod和service分配的網(wǎng)段與集群默認(rèn)的一致。而租戶模式是通過(guò)network crd 的方式,為某個(gè)namespace創(chuàng)建并指定了一個(gè)自定義網(wǎng)絡(luò),使用自定義創(chuàng)建的ipam,為pod分配自定義的網(wǎng)段。
自定義網(wǎng)絡(luò)模式:在該模式下,創(chuàng)建pod時(shí)可以指定任意一個(gè)pod網(wǎng)絡(luò),該網(wǎng)絡(luò)可以是其他集群的pod網(wǎng)絡(luò)。
默認(rèn)模式
當(dāng)Kubernetes集群完成華云SDN CNI部署后,CNI的控制器華云SDN-kube-manager根據(jù)配置的集群名稱和pod/service cidr創(chuàng)建一個(gè)由該集群所有命名空間共享的虛擬pod/service網(wǎng)絡(luò)和ipam。
集群中所有pod IP地址默認(rèn)通過(guò)該pod ipam分配,創(chuàng)建的所有命名空間的pod共用同一個(gè)網(wǎng)絡(luò)和網(wǎng)段,因此可以互相通信。
集群中所有service IP地址默認(rèn)通過(guò)service ipam分配。service網(wǎng)絡(luò)與pod網(wǎng)絡(luò)通過(guò)Network Policy打通,實(shí)現(xiàn)了pod與service的通信。
由于不同Kubernetes集群會(huì)創(chuàng)建不同的pod和service網(wǎng)絡(luò),因此不同集群之間pod和service相互隔離。
空間隔離模式
創(chuàng)建namespace時(shí),通過(guò)在namespace上添加注釋:華云SDN/isolation: true來(lái)實(shí)現(xiàn)命名空間的pod和service隔離。
CNI的控制器華云SDN-kube-manager在watch到namespace創(chuàng)建事件時(shí),當(dāng)獲取到華云SDN/isolation參數(shù)的值為true,就基于集群名稱和命名空間名稱新建一個(gè)pod和service網(wǎng)絡(luò),ipam共用集群默認(rèn)的。
隔離命名空間中所有pod IP地址通過(guò)上述新建的pod ipam分配,共用同一個(gè)網(wǎng)絡(luò)和網(wǎng)段,因此隔離命名空間中的pod可以互相通信。并且隔離命名空間的pod網(wǎng)絡(luò)和隔離命名空間的service網(wǎng)絡(luò)以及集群默認(rèn)service網(wǎng)絡(luò)通過(guò)Network Policy打通,實(shí)現(xiàn)了隔離命名空間的pod與隔離命名空間的service以及集群默認(rèn)service間的通信。
由于隔離命名空間的pod和service網(wǎng)絡(luò)是獨(dú)立的,隔離命名空間的pod與其他pod網(wǎng)絡(luò)沒(méi)有打通,其他pod網(wǎng)絡(luò)也沒(méi)有與隔離命名空間的service網(wǎng)絡(luò)打通,因此實(shí)現(xiàn)了隔離命名空間的pod與其他命名空間的pod相互隔離,其他命名空間的pod也不能訪問(wèn)隔離命名空間的service。
租戶模式
通過(guò)在Kubernetes中創(chuàng)建network crd的方式,為某個(gè)命名空間創(chuàng)建多個(gè)自定義的pod網(wǎng)絡(luò)和ipam,并指定某個(gè)網(wǎng)絡(luò)為該namespace的默認(rèn)網(wǎng)絡(luò)。在該命名空間內(nèi)創(chuàng)建pod會(huì)默認(rèn)使用該pod網(wǎng)絡(luò)和ipam來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)分配。創(chuàng)建自定義網(wǎng)絡(luò)的yaml如下:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: network-test
namespace: network-test
annotations:
"華云SDN/cidr": "81.244.0.0/16"
spec:
config: '{
"cniVersion": "0.3.0",
"type": "contrail-k8s-cni"
}'
租戶命名空間的pod共用同一個(gè)自定義網(wǎng)絡(luò)和ipam,它們之間可以相互通信。由于和其他pod網(wǎng)絡(luò)默認(rèn)不通,因此實(shí)現(xiàn)了租戶命名空間的pod和其他命名空間的pod間的隔離。
自定義網(wǎng)絡(luò)模式
創(chuàng)建pod時(shí),通過(guò)在pod上添加注釋:"華云SDN/network": "{'net_id':'xxx', 'subnet_id': 'xxx'}"來(lái)設(shè)置自定義網(wǎng)絡(luò),這里要求這個(gè)網(wǎng)絡(luò)必須是一個(gè)pod-network,可以是其他集群的pod網(wǎng)絡(luò)。
使用同一個(gè)自定義網(wǎng)絡(luò)的pod間可以互相通信,但是和其他網(wǎng)絡(luò)的pod之間相互隔離。可以通過(guò)Network Policy或添加路由器來(lái)實(shí)現(xiàn)打通。
總結(jié)
針對(duì)Kubernetes集群中的pod網(wǎng)絡(luò)隔離,華云SDN CNI提供了四種網(wǎng)絡(luò)隔離方法,實(shí)現(xiàn)了租戶間徹底的網(wǎng)絡(luò)隔離和各租戶能夠獨(dú)立進(jìn)行網(wǎng)絡(luò)規(guī)劃和配置,很大程度上滿足了不同場(chǎng)景下針對(duì)于pod網(wǎng)絡(luò)隔離的應(yīng)用。