View a markdown version of this page

建立 Amazon EKS 的節點類別 - Amazon EKS

協助改進此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立 Amazon EKS 的節點類別

Amazon EKS 節點類別是範本,可讓您精細控制 EKS 自動模式受管節點的組態。節點類別定義套用至 EKS 叢集中節點群組的基礎結構層級設定,包括網路組態、儲存設定和資源標記。本主題闡釋如何建立和設定節點類別,以滿足您的特定操作需求。

當您需要自訂 EKS 自動模式在預設設定之外,佈建和設定 EC2 執行個體的方式時,建立節點類別可讓您精確控制關鍵基礎結構參數。例如,您可以指定私有子網路放置以增強安全性,為效能敏感的工作負載設定執行個體暫時性儲存,或套用自訂標記以進行成本分配。

建立節點類別

要建立 NodeClass,請執行下列步驟:

  1. 使用節點類別組態建立 YAML 檔案 (例如 nodeclass.yaml)

  2. 使用 kubectl 將組態套用至您的叢集

  3. 在節點集區組態中參考節點類別。如需詳細資訊,請參閱為 EKS 自動模式建立節點集區

您需要已安裝並設定 kubectl。如需詳細資訊,請參閱設定以使用 Amazon EKS

基本節點類別範例

以下是一個節點類別範例:

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: private-compute spec: subnetSelectorTerms: - tags: Name: "private-subnet" kubernetes.io/role/internal-elb: "1" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" ephemeralStorage: size: "160Gi"

此 NodeClass 會增加節點上的暫時性儲存量。

透過以下方式套用此組態:

kubectl apply -f nodeclass.yaml

接下來,在節點集區組態中參考節點類別。如需詳細資訊,請參閱為 EKS 自動模式建立節點集區

建立節點類別存取項目

如果您建立了自訂節點類別,則需要建立 EKS 存取項目以允許節點加入叢集。在當您使用內建節點類別和節點集區時,EKS 會自動建立存取項目。

如需項目存取方法的相關資訊,請參閱 使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權

為 EKS 自動模式節點類別建立存取項目時,您需要使用 EC2 存取項目類型。

使用 CLI 建立存取項目

要建立 EC2 節點的存取項目,並關聯 EKS Auto Node 政策:

使用您的叢集名稱和節點角色 ARN 更新以下 CLI 命令。節點角色 ARN 在節點類別 YAML 中指定。

# Create the access entry for EC2 nodes aws eks create-access-entry \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --type EC2 # Associate the auto node policy aws eks associate-access-policy \ --cluster-name <cluster-name> \ --principal-arn <node-role-arn> \ --policy-arn arn:aws: eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy \ --access-scope type=cluster

使用 CloudFormation 建立存取項目

要建立 EC2 節點的存取項目,並關聯 EKS Auto Node 政策:

使用您的叢集名稱和節點角色 ARN 更新以下 CloudFormation。節點角色 ARN 在節點類別 YAML 中指定。

EKSAutoNodeRoleAccessEntry: Type: AWS::EKS::AccessEntry Properties: ClusterName: <cluster-name> PrincipalArn: <node-role-arn> Type: "EC2" AccessPolicies: - AccessScope: Type: cluster PolicyArn: arn:aws: eks::aws:cluster-access-policy/AmazonEKSAutoNodePolicy DependsOn: [ <cluster-name> ] # previously defined in CloudFormation

有關部署 CloudFormation 堆疊的資訊,請參閱 CloudFormation 入門

節點類別規格

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: my-node-class spec: # Required fields # role and instanceProfile are mutually exclusive fields. role: MyNodeRole # IAM role for EC2 instances # instanceProfile: eks-MyNodeInstanceProfile # IAM instance-profile for EC2 instances subnetSelectorTerms: - tags: Name: "private-subnet" kubernetes.io/role/internal-elb: "1" # Alternative using direct subnet ID # - id: "subnet-0123456789abcdef0" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Alternative approaches: # - id: "sg-0123456789abcdef0" # - name: "eks-cluster-security-group" # Optional: Pod subnet selector for advanced networking podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" # Alternative using direct subnet ID # - id: "subnet-0987654321fedcba0" # must include Pod security group selector also podSecurityGroupSelectorTerms: - tags: Name: "eks-pod-sg" # Alternative using direct security group ID # - id: "sg-0123456789abcdef0" # Optional: Selects on-demand capacity reservations and capacity blocks # for EKS Auto Mode to prioritize. capacityReservationSelectorTerms: - id: cr-56fac701cc1951b03 # Alternative Approaches - tags: Name: "targeted-odcr" # Optional owning account ID filter owner: "012345678901" # Optional fields snatPolicy: Random # or Disabled networkPolicy: DefaultAllow # or DefaultDeny networkPolicyEventLogs: Disabled # or Enabled ephemeralStorage: size: "80Gi" # Range: 1-59000Gi or 1-64000G or 1-58Ti or 1-64T iops: 3000 # Range: 3000-16000 throughput: 125 # Range: 125-1000 # Optional KMS key for encryption kmsKeyID: "arn:aws: kms:region:account:key/key-id" # Accepted formats: # KMS Key ID # KMS Key ARN # Key Alias Name # Key Alias ARN advancedNetworking: # Optional: Controls whether public IP addresses are assigned to instances that are launched with the nodeclass. # If not set, defaults to the MapPublicIpOnLaunch setting on the subnet. associatePublicIPAddress: false # Optional: Forward proxy, commonly requires certificateBundles as well # for EC2, see https://repost.aws/knowledge-center/eks-http-proxy-containerd-automation httpsProxy: http://192.0.2.4:3128 #commonly port 3128 (Squid) or 8080 (NGINX) #Max 255 characters #httpsProxy: http://[2001:db8::4]:3128 # IPv6 address with port, use [] noProxy: #Max 50 entries - localhost #Max 255 characters each - 127.0.0.1 #- ::1 # IPv6 localhost #- 0:0:0:0:0:0:0:1 # IPv6 localhost - 169.254.169.254 # EC2 Instance Metadata Service #- [fd00:ec2::254] # IPv6 EC2 Instance Metadata Service # Domains to exclude, put all VPC endpoints here - .internal - .eks.amazonaws.com # ipv4PrefixSize is default to Auto which is prefix and fallback to secondary IP. "32" is the secondary IP mode. ipv4PrefixSize: Auto # or "32" # enableV4Egress is default to true. Setting it to false when using network policy or blocking IPv4 traffic in IPv6 clusters enableV4Egress: false advancedSecurity: # Optional, US regions only: Specifying `fips: true` will cause nodes in the nodeclass to run FIPS compatible AMIs. fips: false # Optional: Custom certificate bundles. certificateBundles: - name: "custom-cert" data: "base64-encoded-cert-data" # Optional: EC2 Placement Group placementGroupSelector: name: "targeted-pg" # Alternative use direct placement group ID # id: "pg-02465754522cda020" # Optional: Additional EC2 tags (with restrictions) tags: Environment: "production" Team: "platform" # Note: Cannot use restricted tags like: # - kubernetes.io/cluster/* # - karpenter.sh/provisioner-name # - karpenter.sh/nodepool # - karpenter.sh/nodeclaim # - karpenter.sh/managed-by # - eks.amazonaws.com/nodeclass

考量事項

  • 如果您想要確認執行個體有多少本機儲存,可以描述節點以查看暫時性儲存資源。

  • 磁碟區加密 - EKS 使用設定的自訂 KMS 金鑰來加密執行個體的唯讀根磁碟區及讀取/寫入資料磁碟區。

  • 取代節點 IAM 角色 - 如果您變更與 NodeClass 相關聯的節點 IAM 角色,則需要建立新的存取項目。EKS 在叢集建立期間會自動為節點 IAM 角色建立存取項目。節點 IAM 角色需要 AmazonEKSAutoNodePolicy EKS 存取政策。如需詳細資訊,請參閱使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權

  • 最大 Pod 密度 - EKS 會將節點上的最大 Pod 數量限制為 110。此限制是在現有的最大 Pod 計算之後套用的。如需詳細資訊,請參閱選擇最佳的 Amazon EC2 節點執行個體類型

  • 標籤 - 如果您想要將標籤從 Kubernetes 傳播到 EC2,需要設定其他 IAM 許可。如需詳細資訊,請參閱了解 EKS 自動模式中的身分和存取

  • 預設節點類別 - 請勿將您的自訂節點類別命名為 default。這是因為 EKS 自動模式包含一個名為 defaultNodePool,當您啟用至少一個內建 NodeClass 時會自動佈建該類別。如需啟用內建 NodePools 的詳細資訊,請參閱 啟用或停用內建的 NodePool

  • 具有多個子網路的 subnetSelectorTerms 行為 - 如果有多個子網路符合 subnetSelectorTerms 條件或您按 ID 提供的子網路,EKS 自動模式會建立分佈於各個子網路中的節點。

    • 如果子網路位於不同的可用區域 (AZ),您可以使用 Kubernetes 功能,例如 Pod 拓撲分散限制條件和拓撲感知路由,分別將 Pod 和流量分散到各個區域。

    • 如果同一個 AZ 中有多個子網路符合 subnetSelectorTerms,則 EKS 自動模式會在該可用區域中分散在各個子網路的每個節點上建立 Pod。EKS 自動模式會在相同 AZ 中其他子網路中的每個節點建立次要網路介面。它根據每個子網路中可用 IP 位址的數量進行選擇,以更高效地使用子網路。但是,您無法指定 EKS 自動模式為每個 Pod 使用的子網路;如果您需要 Pod 在特定子網路中執行,請改用 分開 Pod 的子網路和安全群組

  • 置放群組策略限制 — 每個置放群組策略 (叢集、分割區、分散) 對於執行個體類型、AZs 和容量都有特定限制。如需詳細資訊,請參閱《Amazon EC2 使用者指南》中的置放群組策略

  • 分散置放群組 — 7 個執行個體限制 — 機架層級分散置放群組允許每個群組每個可用區域最多 7 個執行中的執行個體。這會建立下列邊緣案例:

    • 容量遭到封鎖的偏離替換 — EKS Auto Mode 會在終止舊節點之前啟動替換節點。當分散的 PG 在 AZ 中有 7 個執行個體時,取代啟動會失敗,而漂移的節點會持續執行,直到槽釋放為止。

    • 容量為 的所有 AZs — 如果分散 PG 中的每個 AZ 都在其 7 個執行個體限制內,則無法排程取代。漂移或合併候選節點會無限期持續執行。

    • 置放群組外部沒有備用 — EKS Auto Mode 不會嘗試在置放群組外部啟動替代執行個體。

    • 解決方法 — 使用WhenEmpty合併政策 (consolidationPolicy: WhenEmpty)。只有在所有非協助程式集 Pod 耗盡後,才會刪除節點,釋放 PG 插槽而不需要先替換啟動。請注意,無論合併政策為何,偏離一律使用 replace-then-delete,因此偏離會維持在容量封鎖狀態。

  • 叢集置放群組 AZ 鎖定 — 第一個執行個體啟動到叢集置放群組後,PG 會鎖定到該 AZ。如果您的 NodePool 允許多個 AZs,則在初始擴展期間平行啟動可能會競爭:一個成功並鎖定 AZ,其餘則失敗,並出現容量錯誤。在您的 NodePool 要求中釘選 AZ,以避免暫時性故障。

  • 分割區置放群組 — 支援分割區置放群組,沒有超出標準 EC2 限制的其他限制。

  • 合併可將 Pod 移出置放群組 — 如果 Pod 沒有置放群組排程限制 (例如 nodeSelector上的 eks.amazonaws.com/placement-group-id),合併可能會將其移動到 PG 外部的節點。需要置放群組成員資格的應用程式應該透過 Pod 層級限制來表達這一點。

  • 不存在或刪除的置放群組 — 如果 NodeClass參考不存在或已刪除的置放群組,則不會啟動任何執行個體。置放群組 ID 格式會在許可時驗證,但僅在啟動時檢查是否存在。如果在節點執行時刪除置放群組,現有的節點會標記為偏離,並無限期持續執行,因為偏離取代啟動也會遭到封鎖。

分開 Pod 的子網路和安全群組

podSubnetSelectorTermspodSecurityGroupSelectorTerms 欄位允許 Pod 使用與其節點不同的子網路和安全群組,以啟用進階聯網組態。這兩個欄位必須一起指定。這種分離可增強對網路流量路由與安全政策的控制。

注意

此功能與用於非 EKS Auto Mode 運算的 VPC CNI 的 Pod 安全群組 (SGPP) 功能不同。EKS Auto 模式不支援 SGPP。反之,請在 podSecurityGroupSelectorTerms中使用 NodeClass,將個別的安全群組套用至 Pod 流量。安全群組適用於 NodeClass層級,這表示使用 NodeClass共用相同 Pod 安全群組之節點上的所有 Pod。

運作方式

當您設定 podSubnetSelectorTerms和 時podSecurityGroupSelectorTerms

  1. 節點的主要 ENI 使用來自 和 的子網路subnetSelectorTerms和安全群組securityGroupSelectorTerms。只有節點自己的 IP 地址才會指派給此界面。

  2. EKS Auto Mode 會在符合 的子網路中建立次要 ENIspodSubnetSelectorTerms,並podSecurityGroupSelectorTerms連接來自 的安全群組。根據預設,Pod IP 地址會使用 /28 字首從這些次要 ENIs 配置,並在連續字首區塊無法使用時自動回復到次要 IPs (/32)。如果在 "32"ipv4PrefixSize將 設定為 advancedNetworking,則只會使用次要 IPs。

  3. 中指定的安全群組podSecurityGroupSelectorTerms適用於 VPC 內的 Pod 流量。對於目的地為 VPC 之外的流量,Pod 會使用節點的主要 ENI (及其安全群組),因為來源網路位址轉譯 (SNAT) 會將 Pod IP 轉譯為節點 IP。您可以使用 中的 snatPolicy 欄位修改此行為NodeClass

使用案例

當您需要podSecurityGroupSelectorTerms時,請使用 podSubnetSelectorTerms和 :

  • 套用不同的安全群組,分別控制節點和 Pod 的流量。

  • 將基礎設施流量 node-to-node通訊) 與應用程式流量 (Pod-to-Pod通訊) 分開。

  • 對節點子網路和 Pod 子網套用不同的聯網組態。

  • 專門為節點流量設定反向代理或網路篩選, 而不影響 Pod 流量。使用 advancedNetworkingcertificateBundles 來定義您的反向代理,以及代理的任何自簽署或私有憑證。

範例組態

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: advanced-networking spec: role: MyNodeRole # Subnets and security groups for EC2 instances (nodes) subnetSelectorTerms: - tags: Name: "node-subnet" kubernetes.io/role/internal-elb: "1" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" # Separate subnets and security groups for Pods podSubnetSelectorTerms: - tags: Name: "pod-subnet" kubernetes.io/role/pod: "1" podSecurityGroupSelectorTerms: - tags: Name: "eks-pod-sg"

個別 Pod 子網路和安全群組的考量事項

  • 安全群組範圍: 的安全群組podSecurityGroupSelectorTerms會連接至次要 ENIs,並套用至 VPC 內的 Pod 流量。啟用 SNAT 時 (預設 snatPolicy: Random),離開 VPC 的流量會轉譯為節點的主要 ENI IP 地址,因此節點的安全群組securityGroupSelectorTerms會套用至該流量。如果您設定 snatPolicy: Disabled,Pod 會針對所有流量使用自己的 IP 地址,而且您必須確保相應地設定路由和安全群組。

  • NodeClass 層級精細程度:Pod 安全群組適用於使用 排程在節點上的所有 PodNodeClass。若要將不同的安全群組套用至不同的工作負載,請建立個別 NodeClassNodePool 資源,並使用污點、容錯或節點選擇器,將工作負載排程到適當的節點。

  • 降低 Pod 密度:每個節點上執行的 Pod 較少,因為節點的主要網路界面預留給節點 IP,且無法用於 Pod。

  • 子網路選擇器限制:標準subnetSelectorTermssecurityGroupSelectorTerms組態不適用於 Pod 子網路或安全群組選擇。

  • 網路規劃:確保節點和 Pod 子網路中有足夠的 IP 位址空間,以支援您的工作負載需求。

  • 路由組態:確認 Pod 子網路的路由表和網路存取控制清單 (ACL) 已正確設定,以便在節點和 Pod 子網路之間進行通訊。

  • 可用區域:確認您已在多個 AZ 中建立 Pod 子網路。如果您使用的是特定的 Pod 子網路,它必須與節點子網路 AZ 位於相同的 AZ 中。

Pod 的次要 IP 模式

ipv4PrefixSize 欄位透過僅將次要 IP 地址配置給節點來啟用進階聯網組態。此功能不會將字首 (/28) 配置給節點,而且只會維護一個次要 IP 做為 MinimalIPTarget。

使用案例

當您需要以下功能時,可使用 ipv4PrefixSize

  • 降低 IP 使用率:每個節點只會暖機一個 IP 地址。

  • 較低的 Pod 追逐率:Pod 建立速度不是主要問題。

  • 無字首分割:字首導致的分割是使用自動模式的主要考量或封鎖程式。

範例組態

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: advanced-networking spec: role: MyNodeRole advancedNetworking: ipv4PrefixSize: "32"

次要 IP 模式的考量事項

  • 降低 Pod 建立速度:由於只有一個次要 IP 已暖機,因此當建立更多 Pod 時,IPAM 服務需要更多時間來佈建 IPs。

在 IPv4IPv6 叢集中停用 IPv6 Pod 的 IPv6 輸出。

enableV4Egress 欄位true預設為 。對於自動模式 IPv6 叢集,此功能可以停用,因此自動模式不會為 IPv6 Pod 建立僅輸出 IPv4 界面。這很重要,因為 IPv4 輸出界面不受網路政策強制執行的約束。網路政策僅在 Pod 的主要界面 (eth0) 上強制執行。

使用案例

當您需要以下功能時,可使用 enableV4Egress

  • 使用 IPv6 叢集:預設允許 IPv4 輸出流量。

  • 使用網路政策:目前 EKS 網路政策不支援雙堆疊。停用enableV4Egress可防止 Pod 流量意外透過 IPv4 輸出。

範例組態

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: advanced-networking spec: role: MyNodeRole advancedNetworking: enableV4Egress: false

停用 enableV4Egress 的考量事項

  • IPv6 叢集中的網路政策:IPv6 叢集預設允許 IPv4 流量。設定 會enableV4Egress: false封鎖 IPv4 輸出流量,提供增強的安全性,特別是在與網路政策搭配使用時。