一、網絡模型概述
k8s的網絡中主要存在四種類型的通信:同一pod內的容器間通信、各pod彼此之間的通信、pod與service間的通信、以及集群外部的流量同service之間的通信。
k8s為pod和service資源對象分別使用了各自的專用網絡,pod網絡由k8s的網絡插件配置實現,而service的網絡則由k8s集群予以指定。k8s的網絡模型需要借助於外部插件實現,它要求任何實現機制都必須滿足以下需求:
1、所有pod間均可不經NAT機制直接通信;
2、所有節點均可不經NAT機制而直接與所有容器通信。
3、容器自己使用的IP也是其他容器或節點直接看到的地址,即,所有pod對象都位於同一平面網絡中,而且可以使用pod自身的地址直接通信。
k8s使用的網絡插件需要為每個pod配置至少一個特定的地址,即podIP。podIP地址實際存在於某個網卡(可以是虛擬設備)上,而service地址卻是一個虛擬IP地址,沒有任何網絡接口配置此地址,它由kube-proxy借助iptables規則或ipvs規則重新定向到本地端口,再將其調度至后端pod對象。service的IP地址是集群提供服務的接口,也稱為clusterIP。
pod網絡及其IP由k8s的網絡插件負責配置和管理,具體使用的網絡地址可在管理配置網絡插件時指定,如10.96.0.0/16網絡。而cluster網絡和IP則是由k8s集群負責配置和管理,如10.96.0.0/12網絡。
總結起來,k8s集群至少應該包含三個網絡,一個是各主機(master、node、etcd等)自身所屬的網絡,其地址配置於主機的網絡接口,用於各主機之間的通信;第二個是k8s集群上專用於pod資源對象的網絡,它是一個虛擬網絡,用於為各pod對象設定IP地址等網絡參數,其地址配置於pod中容器的網絡接口之上。pod網絡為各pod對象設定IP地址等網絡參數,其地址配置於pod中容器的網絡接口之上。pod網絡需要借助kubenet插件或CNI插件實現,該插件獨立部署於k8s集群之外,也可托關於k8s之上;第三個時專用於service資源對象的網絡,它也是一個虛擬網絡,用於為k8s集群之中的service配置IP地址,但此地址並不配置於任何主機或容器的網絡接口之上,而是通過node之上的kube-proxy配置為iptables或ipvs規則,從而將發往此地址的所有流量調度至其后端的各pod對象之上。service網絡再k8s集群創建時予以指定,而各service的地址則在用戶創建service時予以動態配置。
二、集群上的網絡通信
k8s集群的客戶端大體分為兩類:apiserver客戶端和應用程序(運行為pod中的容器)客戶端。apiserver客戶端通常包含人類用戶和pod對象兩種,它們通過apiserver訪問k8s集群完成管理任務,應用程序客戶端一般也包含人類用戶和pod對象兩種,它們的訪問目標時pod上運行於容器中的應用程序提供的各種具體的服務,如redis或nginx等。不過,這些訪問請求通常要經由service或ingress資源對象進行。另外,應用程序客戶端的訪問目標對象的操作要經由apiserver客戶端創建和配置完成后才能進行。
名詞解釋:
CNI:容器網絡接口(Container Network Interface),由CNCF(Cloud Native Computing Foundation)維護的項目,其由一系列的用於編寫配置容器網絡插件的規范和庫接口組成,支持眾多插件項目。