容器服務 Kubernetes 版 ACK(Container Service for Kubernetes)將Kubernetes網絡設計應用到了阿里云的資源上,提供了穩定高性能的容器網絡。本文介紹ACK中容器網絡的重要概念,例如容器網絡插件CNI、Service、Ingress、提供服務發現能力的DNS等。您可以通過了解這些概念,更合理地設計應用部署模型和網絡訪問的方式。
容器網絡插件(CNI Plugin)
Kubernetes本身并未實現容器間的網絡互聯能力,但是它通過容器網絡接口(CNI)對容器間的網絡做出了標準化的定義:
Pod在容器網絡中的狀態隨著Pod生命周期而變化。例如,Pod創建后需要加入網絡,銷毀后需要退出網絡。
Pod在容器網絡中擁有唯一的IP地址,以便于識別身份。
Pod可以與集群內的端點與集群外的端點互相訪問。
容器網絡插件(CNI Plugins)負責容器網絡的具體實現。容器網絡插件決定了Pod IP地址分配的機制、是否使用Overlay網絡、集群內流量的轉發鏈路、對Pod的訪問控制機制等容器網絡特性。目前已經有很多知名的開源容器網絡插件,如Calico、Flannel、Cilium等。
容器服務 Kubernetes 版支持兩種容器網絡插件:Terway與Flannel。這兩種插件擁有不同的特性,請參照下方的介紹以及Terway與Flannel的對比文檔,在創建集群前完成容器網絡插件的選型。
集群創建完成后,不支持Terway與Flannel之間的變更切換。
Terway容器網絡插件
Terway網絡插件是阿里云自研的容器網絡插件。在容器服務 Kubernetes 版中作為節點的ECS實例使用ENI(彈性網卡)進行網絡通信,Terway將節點的ENI分配給Pod,為Pod提供了網絡互聯能力。因此,在使用Terway時,Pod直接接入VPC網絡。由于不需要使用VXLAN等隧道技術封裝報文,Terway模式網絡具有較高的通信性能。Terway適用于大規模集群以及對網絡性能和訪問控制能力有較高需求的場景。
在創建集群并安裝Terway網絡插件時,可以為Terway配置不同的工作模式。這些工作模式的區別主要在以下三個維度:
Pod IP地址分配:Terway擁有兩種IP地址分配模式:獨占ENI模式與共享ENI模式。獨占ENI模式中,Pod獨占節點的ENI,擁有極致的網絡性能;而共享ENI模式中,Pod共享節點的ENI,擁有更高的部署密度。
網絡加速能力:共享ENI模式支持DataPathv2加速模式。選擇加速模式后,Terway會采取不同于共享ENI常規模式的流量轉發鏈路,實現更快的網絡通信。
訪問控制能力:共享ENI模式與獨占ENI模式都支持為Pod配置固定IP、獨立的安全組與虛擬交換機,獨占ENI模式支持通過Kubernetes原生的Network Policy進行訪問控制。
Flannel容器網絡插件
Flannel是一個經典的開源容器網絡插件,它使用VXLAN等虛擬化網絡技術為Pod構建了一個Overlay網絡。Flannel的配置簡單、易于使用,但是網絡性能會受到NAT損失的影響,訪問控制能力相較于Terway也更弱,并且集群的節點數量上限較低。Flannel適用于節點數量不超過1000的小規模集群,以及對網絡性能和訪問控制能力需求較低,希望快速搭建、使用集群的場景。
關于Terway和Flannel插件的詳細能力對比,請參見Terway與Flannel的對比。
服務(Service)
由于云原生應用通常需要敏捷的迭代和快速的彈性,Pod在Kubernetes中被認為是臨時性的、隨時可替換的資源。當Pod被銷毀、替換時,與其相關的網絡資源也會發生變化,因此需要為Pod提供固定的訪問方式。Kubernetes采用Service方式為一組擁有相同功能的容器提供固定的訪問入口,并對這一組容器進行負載均衡。實現原理如下:
通過Selector關聯一組容器,以將這個Service的IP地址和端口負載均衡到這一組容器IP和端口上。
在Pod發生變化時,Service會自動更新后端的轉發規則,以保證通過Service能訪問到最新的Pod。
ACK集群中的Service目前支持ClusterIP、NodePort、LoadBalancer、Headless Service、ExternalName模式,適用于集群內訪問、集群外訪問、公網訪問等場景,詳細信息請參見Service快速入門。
路由(Ingress)
在ACK集群中,與Service的4層負載均衡不同,Ingress是集群內Service對外暴露7層的訪問接入點,用于為集群中的多個Service提供統一的入口。您可以通過Ingress資源來配置不同的7層的轉發規則,例如通過域名或者訪問路徑來路由到不同的Service上,從而達到7層的負載均衡作用。更多信息,請參見Ingress概述。
服務發現DNS
ACK使用DNS來實現應用的服務發現能力,例如客戶端應用可以通過Service的服務名解析出它的ClusterIP訪問,再通過Service訪問后端Pod。采用DNS服務發現的能力讓集群中應用間的調用與IP地址和部署環境解耦。關于集群DNS組件的詳細信息,請參見DNS概述。