# AWS - EKS 使用 VPC CNI 將 IPs 指派給 Pod
# 前言
在 Amazon EKS 中,預設使用 Amazon VPC CNI(Container Network Interface)外掛程式來為 Pod 分配 IP 位址。這種整合讓 Pod 直接從你的 VPC 子網路獲得 IP 位址,使其成為 VPC 網路中的「一等公民」。
# 運作原理
- 彈性網路介面 (ENI) 和次要 IP 位址:
- VPC CNI 會在每個 EKS 工作節點(EC2 執行個體)上建立和管理彈性網路介面(ENI)。
- 每個 EC2 執行個體類型都有其支援的 ENI 數量和每個 ENI 可分配的 IP 位址數量限制。
- 節點本身的 IP 位址是主要 IP,而額外的 IP 位址則被保留用於 Pod。VPC CNI 負責將這些次要 IP 位址指派給 Pod。
- IP 位址管理常駐程式 (IPAMD):
- aws-node DaemonSet 在每個工作節點上運行,其中包含一個名為 ipamd 的常駐程式。
- 當 kubelet 需要為新的 Pod 分配 IP 位址時,它會呼叫 CNI 二進位檔,後者會請求 ipamd 提供 IP 位址。
- ipamd 負責維護一個「暖 IP 位址池」和「暖 ENI 池」,以確保有足夠的 IP 位址可供 Pod 隨時使用,從而加快 Pod 的啟動速度。
- 預先分配 (Warm Pool):
- 為了避免在 Pod 啟動時才動態分配 IP 造成延遲,ipamd 會預先分配 ENI 和 IP 位址。
- 你可以透過設定 aws-node DaemonSet 的環境變數來控制暖池的大小,例如 WARM_IP_TARGET、MINIMUM_IP_TARGET 和 WARM_ENI_TARGET。
- 當可用的 IP 位址少於 WARM_IP_TARGET 或 Pod 數量超過現有 ENI 可支援的容量時,ipamd 會向 EC2 服務請求新的 ENI 或 IP 位址。
# 解決 IP 位址耗盡問題
- 預設行為:VPC CNI 預設會從工作節點所在的主要子網路中分配 IP 位址給 Pod。如果子網路範圍太小,可能會導致 IP 位址耗盡。
- 自訂網路 (Custom Networking):
- 透過為 VPC 新增次要 CIDR 區塊,並設定 VPC CNI 從這些額外的 IP 範圍中分配 IP 給 Pod,可以解決 IP 耗盡問題。
- 這通常涉及啟用 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG 環境變數,並使用 ENIConfig 自訂資源來指定用於 Pod 的次要子網路。
- 前綴委派 (Prefix Delegation):
- 傳統上,ENI 分配個別 IP 位址給 Pod。前綴委派模式則將 IP 位址前綴(例如 /28)分配給 ENI。
- 這樣能大幅增加可用的 Pod IP 數量,因為每個前綴包含多個 IP 位址。
- 此功能並非預設啟用,且主要支援 Nitro 世代的 EC2 執行個體。
# 優勢
- 原生網路:Pod 在 VPC 中擁有自己的 IP 位址,可直接使用 VPC 的路由、安全群組等網路功能,無需複雜的網路轉換。
- 低延遲:Pod 間的通訊可直接在 VPC 內部路由,減少網路跳數和延遲。
- 易於除錯:由於 Pod IP 在 VPC 內可路由,可直接使用標準的網路工具進行除錯和監控。
總結來說,Amazon VPC CNI 透過整合 EC2 的 ENI 和 IP 位址管理,讓 EKS Pod 能夠像 VPC 內的普通 EC2 執行個體一樣獲得 IP 位址,實現高效且可擴展的網路通訊。
# Reference
- AWS - 使用 Amazon VPC CNI 將 IPs 指派給 Pod