本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
自訂網路
根據預設,Amazon VPCCNI會為 Pod 指派從主要子網路選取的 IP 地址。主要子網路是CIDR主要 ENI連接的子網路,通常是節點/主機的子網路。
如果子網路CIDR太小, CNI可能無法取得足夠的次要 IP 地址來指派給您的 Pod。這是EKSIPv4叢集的常見挑戰。
自訂聯網是此問題的一個解決方案。
自訂網路透過IPs從次要VPC地址空間 () 指派節點和 Pod 來解決 IP 耗盡問題CIDR。自訂網路支援ENIConfig自訂資源。ENIConfig 包含替代子網路CIDR範圍 (從次要 VPC 切下CIDR),以及 Pod 所屬的安全群組 (這些)。啟用自訂聯網時, 會在 下定義的子網路ENIs中VPCCNI建立次要網路ENIConfig。會從 中定義的CIDR範圍CNI指派 IP 地址給 ENIConfig PodCRD。
由於自訂網路ENI不使用主要 ,因此您可以在節點上執行的 Pod 數量上限較低。主機網路 Pod 會繼續使用指派給主要 的 IP 地址ENI。此外,主要 ENI 用於處理來源網路轉譯,並將 Pod 流量路由至節點外部。
範例組態
雖然自訂聯網會接受次要VPC範圍的有效CIDR範圍,但建議您從 CG-NAT space 使用 CIDRs(/16),即 100.64.0.0/10 或 198.19.0.0/16,因為這些RFC1918範圍較不可能用於公司設定。如需有關可與 搭配使用的允許和限制CIDR區塊關聯的其他資訊VPC,請參閱 VPC 文件的 VPC和子網路大小調整區段中的IPv4CIDR區塊關聯限制。
如下圖所示,工作者節點的主要彈性網路介面 (ENI) 仍然使用主要VPCCIDR範圍 (在此案例中為 10.0.0.0/16),但次要ENIs使用次要VPCCIDR範圍 (在此案例中為 100.64.0.0/16)。現在,若要讓 Pod 使用 100.64.0.0/16 CIDR範圍,您必須將CNI外掛程式設定為使用自訂網路。您可以遵循此處所述的步驟。
如果您想要 CNI 使用自訂聯網,請將AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG
環境變數設定為 true
。
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
當 時AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
, CNI會從 中定義的子網路指派 Pod IP 地址ENIConfig
。ENIConfig
自訂資源用於定義將排程 Pod 的子網路。
apiVersion : crd.k8s.amazonaws.com/v1alpha1 kind : ENIConfig metadata: name: us-west-2a spec: securityGroups: - sg-0dff111a1d11c1c11 subnet: subnet-011b111c1f11fdf11
建立ENIconfig
自訂資源時,您需要建立新的工作者節點並耗盡現有的節點。現有的工作者節點和 Pod 將保持不變。
建議
使用自訂網路時
如果您正在處理IPv4耗盡問題且IPv6還無法使用,建議您考慮自訂聯網。Amazon RFC6598
如果您有在具有不同安全群組需求的不同網路上執行 Pod 的安全需求,您可以考慮自訂聯網。啟用自訂聯網時,Pod 會使用與節點主要網路介面ENIConfig不同的子網路或安全群組,如 中所定義。
自訂聯網確實是部署多個EKS叢集和應用程式以連接內部部署資料中心服務的理想選項。您可以增加 EKS中 可針對 Amazon Elastic Load Balancing 和 NAT-GW 等VPC服務存取的私有地址 (RFC1918) 數量,同時在多個叢集的 Pod 上使用無法路由的 CG-NAT 空間。使用傳輸閘道
避免自訂聯網時機
準備實作 IPv6
自訂聯網可以緩解 IP 耗盡問題,但需要額外的操作開銷。如果您目前正在部署雙堆疊 (IPv4/IPv6),VPC或您的計劃包含IPv6支援,建議您改為實作IPv6叢集。您可以設定IPv6EKS叢集並遷移您的應用程式。在IPv6EKS叢集中,Kubernetes 和 Pod 都會取得IPv6地址,並可以與 IPv4和IPv6端點進行傳入和傳出通訊。請檢閱執行IPv6EKS叢集 的最佳實務。
耗盡的 CG NAT空間
此外,如果您目前正在CIDRs從 CG-NAT space 使用次要 ,或無法將次要 CIDR與叢集 連結VPC,您可能需要探索其他選項,例如使用替代 CNI。我們強烈建議您取得商業支援或擁有內部知識,以偵錯並將修補程式提交至開放原始碼CNI外掛程式專案。如需詳細資訊,請參閱替代CNI外掛程式使用者指南。
使用私有NAT閘道
Amazon VPC 現在提供私有NAT閘道功能。Amazon 的私有NAT閘道可讓私有子網路中的執行個體連線至其他 VPCs和內部部署網路,並重疊 CIDRs。考慮使用此部落格文章
此部落格文章實作中使用的網路架構遵循 Amazon VPC 文件中啟用重疊網路之間的通訊建議。如本部落格文章所示,您可以結合RFC6598地址來擴展私有NAT閘道的使用,以管理客戶的私有 IP 耗盡問題。EKS 叢集、工作者節點部署在不可路由的 100.64.0.0/16 VPC次要CIDR範圍內,而私有NAT閘道、NAT閘道則部署在可路由RFC1918CIDR範圍內。部落格說明如何使用傳輸閘道進行連線,VPCs以便透過重疊的不可路由CIDR範圍VPCs促進通訊。對於在 VPC不可路由地址範圍內EKS的資源需要與沒有重疊地址範圍VPCs的其他 通訊的使用案例,客戶可以選擇使用VPC對等互連此類 VPCs。此方法可以節省潛在的成本,因為現在所有透過VPC對等連線在可用區域中傳輸的資料都是免費的。
節點和 Pod 的唯一網路
基於安全考量,如果您需要將節點和 Pod 隔離到特定網路,建議您從較大的次要CIDR區塊 (例如 100.64.0.0/8) 將節點和 Pod 部署到子網路。在 CIDR中安裝新的 之後VPC,您可以使用次要 來部署另一個節點群組,CIDR並耗盡原始節點,以自動將 Pod 重新部署到新的工作者節點。如需有關如何實作此項目的詳細資訊,請參閱此部落格
自訂聯網不會用於下圖所示的設定。相反地,Kubernetes 工作者節點部署在 次要VPCCIDR範圍VPC的子網路上,例如 100.64.0.0/10。您可以讓EKS叢集繼續執行 (控制平面將保留在原始 上subnet/s), but the nodes and Pods will be moved to a secondary subnet/s。這又是另一個,儘管是非常規的技術,以減輕 中 IP 耗盡的風險VPC。我們建議先耗盡舊節點,再將 Pod 重新部署到新的工作者節點。
使用可用區域標籤自動化組態
您可以讓 Kubernetes 自動套用ENIConfig對應至工作者節點可用區域 (AZ) 的 。
Kubernetes 會自動將標籤topology.kubernetes.io/zone
failure-domain.beta.kubernetes.io/zone
已棄用,並以標籤 取代topology.kubernetes.io/zone
。
-
將
name
欄位設定為 的可用區域VPC。 -
使用此命令啟用自動組態:
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
如果每個可用區域都有多個次要子網路,則需要建立特定 ENI_CONFIG_LABEL_DEF
。您可以考慮ENI_CONFIG_LABEL_DEF
將 設定為具有自訂 eniConfig 名稱的 k8s.amazonaws.com/eniConfig
k8s.amazonaws.com/eniConfig=us-west-2a-subnet-1
k8s.amazonaws.com/eniConfig=us-west-2a-subnet-2
設定次要網路時取代 Pod
啟用自訂聯網不會修改現有的節點。自訂聯網是一項破壞性動作。我們建議您AWS CloudFormation EKS使用呼叫 Lambda 函數的自訂資源來更新 aws-node
Daemonset 與環境變數,以便在佈建工作者節點之前啟用自訂聯網,而不是在啟用自訂聯網之後輪流取代叢集中的所有工作者節點。
如果您在切換到自訂CNI網路功能之前,叢集中有任何執行中的 Pod 節點,您應該封鎖並排放節點
計算每個節點的 Pod 上限
由於節點的主要 ENI 不再用於指派 Pod IP 地址,因此您可以在指定EC2執行個體類型上執行的 Pod 數量會減少。若要解決此限制,您可以將字首指派與自訂聯網搭配使用。透過字首指派,每個次要 IP 都會在次要 上取代為 /28 字首ENIs。
考慮具有自訂聯網的 m5.large 執行個體的 Pod 數量上限。
在沒有字首指派的情況下,您可以執行的 Pod 數目上限為 29
-
3 ENIs - 1) * (10 secondary IPs per ENI - 1 + 2 = 20
啟用字首附件會將 Pod 數量增加到 290。
-
(3 ENIs - 1) * ((10 secondary IPs per ENI - 1) * 16 + 2 = 290
不過,我們建議將 Pod 上限設定為 110,而不是 290,因為執行個體具有相當少量的虛擬 CPUs。在較大的執行個體上, EKS建議最大 Pod 值為 250。使用具有較小執行個體類型的字首附件 (例如 m5.large) 時,您可能會在其 IP 地址之前耗盡執行個體CPU和記憶體資源。
注意
當CNI字首將 /28 字首配置到 時ENI,它必須是 IP 地址的連續區塊。如果產生字首的子網路高度分散,字首連接可能會失敗。您可以建立叢集VPC專用的新 ,或保留CIDR一組字首附件專用子網路,以緩解這種情況。如需此主題的詳細資訊,請造訪子網路CIDR保留。
識別 CG-NAT Space 的現有使用
自訂聯網可讓您緩解 IP 耗盡問題,但無法解決所有挑戰。如果您已經使用叢集的 CG-NAT space,或只是無法將次要 CIDR與叢集 建立關聯VPC,建議您探索其他選項,例如使用替代CNI或移至IPv6叢集。