在配置集群網絡插件或者實踐K8S 應用/服務部署請時刻想到這些原則:
- 1.每個Pod都擁有一個獨立IP地址,Pod內所有容器共享一個網絡命名空間
- 2.集群內所有Pod都在一個直接連通的扁平網絡中,可通過IP直接訪問
- 所有容器之間無需NAT就可以直接互相訪問
- 所有Node和所有容器之間無需NAT就可以直接互相訪問
- 容器自己看到的IP跟其他容器看到的一樣
- 3.Service cluster IP盡可在集群內部訪問,外部請求需要通過NodePort、LoadBalance或者Ingress來訪問
Container Network Interface (CNI)
是目前CNCF主推的網絡模型,它由兩部分組成:
- CNI Plugin負責給容器配置網絡,它包括兩個基本的接口
- 配置網絡: AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
- 清理網絡: DelNetwork(net *NetworkConfig, rt *RuntimeConf) error
- IPAM Plugin負責給容器分配IP地址
Kubernetes Pod的網絡是這樣創建的:
- 0.每個Pod除了創建時指定的容器外,都有一個kubelet啟動時指定的
基礎容器
,比如:mirrorgooglecontainers/pause-amd64
?registry.access.redhat.com/rhel7/pod-infrastructure
- 1.首先 kubelet創建
基礎容器
生成network namespace - 2.然后 kubelet調用網絡CNI driver,由它根據配置調用具體的CNI 插件
- 3.然后 CNI 插件給
基礎容器
配置網絡 - 4.最后 Pod 中其他的容器共享使用
基礎容器
的網絡
本項目基于CNI driver 調用各種網絡插件來配置kubernetes的網絡,常用CNI插件有?flannel
?calico
?weave
等等,這些插件各有優勢,也在互相借鑒學習優點,比如:在所有node節點都在一個二層網絡時候,flannel提供hostgw實現,避免vxlan實現的udp封裝開銷,估計是目前最高效的;calico也針對L3 Fabric,推出了IPinIP的選項,利用了GRE隧道封裝;因此這些插件都能適合很多實際應用場景。