跳至內容

如何為 Amazon EKS 叢集中的 Pod 選擇特定的 IP 位址子網路?

3 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中為 Pod 使用自訂子網路或 IP 位址範圍。

解決方法

若要從與工作節點子網路不同的子網路分配 Pod IP 位址,請使用自訂網路

啟動自訂網路

在設定自訂網路之前,請查看以下預設行為:

  • 節點和 Pod 在您的 Amazon 虛擬私有雲端 (VPC) 叢集內會使用相同 CIDR 範圍的 IP 位址。若要為您的 Amazon VPC 新增更多 IP 位址 CIDR 範圍,請參閱如何在 Amazon EKS 中使用多個 CIDR 範圍?
  • Amazon EKS 會從工作節點的子網路中指派 Pod IP 位址。
  • 您無法控制哪個子網路為 Pod 指派 IP 位址。
  • 當節點的子網路中沒有可用的 IP 位址時,即使其他子網路有可用的位址,新的 Pod 也無法啟動。
  • 所有從 Pods 到 Amazon EKS 叢集 CIDR 區塊外的 IP 位址的流量,都會使用節點的主要介面與 IP 位址。流量使用來自節點主要彈性網路介面的安全群組和子網路。它不使用您在 ENIConfig 物件中定義的子網路和安全群組。
  • 如果您對 Pod 使用安全群組,則 Pod 將使用您在 SecurityGroupPolicy 中指定的安全群組。Pod 不使用您在 ENIConfig 物件中指定的安全群組。
    **注意:**有關 Pod 流量路由的詳細資訊,請參閱啟用 Pod 的傳出網際網路存取

在 Kubernetes 的 Amazon VPC 容器網路介面 (Amazon VPC CNI) 外掛程式中啟動自訂網路。使用與您的 Kubernetes 版本相符的 Amazon VPC CNI 外掛程式版本。若要存取該外掛程式,請參閱 GitHub 網站上的 amazon-vpc-cni-k8s

執行以下命令,以驗證 Amazon EKS 叢集所使用的 Amazon VPC 版本:

kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

如果您沒有正確的外掛程式版本,請更新 Amazon VPC CNI

執行以下命令來啟動自訂網路:

kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true

VPC CNI v1.18 及更新版本支援自動子網路偵測,並根據可用子網路的 IP 位址使用情況動態分配位址。如需詳細資訊,請參閱 Amazon VPC CNI 推出增強型子網路偵測

您也可以使用 Amazon VPC CNI 外掛程式執行以下動作:

  • 指定用於 Pod 的 Amazon VPC 子網路。
  • 為您的 Pod 定義單獨的安全群組。

建立 ENIConfig 物件

在您建立 ENIConfig 物件之前,請先檢視以下預設行為:

  • 每個 ENIConfig 物件定義一個子網路和一個安全群組清單。
  • 每個節點只能指派一個 ENIConfig 物件。不過,您可以將同一個 ENIConfig 物件指派給多個節點。
  • 當您將 ENIConfig 物件指派給節點時,排程到該節點的 Pod 將使用 ENIConfig 物件中的子網路和安全群組。
  • ENIConfig 物件的名稱必須是您可用區域的名稱。

執行以下命令來建立您的 ENIConfig 物件:

cat EOF | kubectl apply -f -  
apiVersion: crd.k8s.amazonaws.com/v1alpha1  
kind: ENIConfig  
metadata:  
  name: example-availability-zone  
spec:  
  securityGroups:   
    - example-security-group-id  
  subnet: example-subnet-id  
EOF

**注意:**將 example-availability-zone 替換為您的可用區域。將 example-security-group-id 替換為您安全群組的 ID。將 example-subnet-id 替換為您的子網路 ID。

指派 ENIConfig 物件

若要為一個 ENIConfig 物件指派一個可用區域,請自動將 ENIConfig 物件指派給您的節點。若要將多個 ENIConfig 物件與相同可用區域建立關聯,請手動將 ENIConfig 物件指派給您的節點。

自動指派 ENIConfig 物件

執行以下命令:

kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

手動關聯 ENIConfig 物件

**重要:**請確保節點與其所關聯的 ENIConfig 物件中的子網路位於相同可用區域。

執行以下命令:

kubectl annotate node example-node-name k8s.amazonaws.com/eniConfig=example-availability-zone

**注意:**將 example-node-name 替換為您節點的完整識別碼。將 example-availability-zone 替換為您在建立 ENIConfig 物件時所使用的可用區域名稱。

啟動新節點

若要從 ENIConfig 子網路分配次要網路介面和 IP 位址,您必須啟動新節點。現有節點將繼續使用其原始網路組態,直到您替換它們為止。

請完成下列步驟:

  1. 檢查您是否將自訂 Amazon Machine Image (AMI) ID 與自我管理節點群組一起使用。
  2. 如果您使用自訂 AMI ID,請確定每個節點的最大 Pod 數量值。執行 max-pods-calculator.sh 指令碼時,必須加入 --cni-custom-networking-enabled 參數。
    **注意:**如果您未使用啟動範本或 AMI ID,則 Amazon EKS 會自動設定 Pod 的最大數量。
  3. 請根據您的作業系統 (OS),更新新節點上的使用者資料指令碼,以設定您所需的最大 Pod 數量:
    Amazon Linux 2、Bottlerocket、Ubuntu 20.04 及更新版本、Windows Server 2019 及更新版本
    #!/bin/bash  
    /etc/eks/bootstrap.sh example-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=example-max-pods'
    --user-data '#!/bin/bash /etc/eks/nodeadm init \ --container-runtime containerd \ --cluster-name example-cluster-name \ --max-pods example-max-pods'
    **注意:**在上述命令中,將 example-cluster-name 替換為您的 EKS 叢集的名稱。將 example-max-pods 替換為每個節點的最大 Pod 數。
    有關 bootstrap 的詳細資訊,請參閱 GitHub 網站上的 awslabs/amazon-eks-ami。有關 nodeadm 的資訊,請參閱從 Amazon Linux 2 升級到 Amazon Linux 2023
    Amazon Linux 2023 (AL2023)
  4. 重新建立您的 Pod,以使用新的自訂網路組態
AWS 官方已更新 4 個月前