建立 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: 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 的個別子網路和安全群組

Pod 的個別子網路和安全群組

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

注意

此功能不同於 AWS VPC CNI 用於非EKS Auto Mode 運算的 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 輸出流量,提供增強的安全性,特別是在與網路政策搭配使用時。