協助改進此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立 Amazon EKS 的節點類別
Amazon EKS 節點類別是範本,可讓您精細控制 EKS 自動模式受管節點的組態。節點類別定義套用至 EKS 叢集中節點群組的基礎結構層級設定,包括網路組態、儲存設定和資源標記。本主題闡釋如何建立和設定節點類別,以滿足您的特定操作需求。
當您需要自訂 EKS 自動模式在預設設定之外,佈建和設定 EC2 執行個體的方式時,建立節點類別可讓您精確控制關鍵基礎結構參數。例如,您可以指定私有子網路放置以增強安全性,為效能敏感的工作負載設定執行個體暫時性儲存,或套用自訂標記以進行成本分配。
Pod 稀疏或大規模工作負載的考量事項
根據預設,EKS Auto Mode 會使用字首委派 (/28字首)。每個節點會保留 16 個 Pod IPs,這對於填滿這些插槽的 Pod 密集型工作負載很有效率。對於以每個可用區域超過數百個節點為目標的 Pod-sparse 工作負載 (每個節點有幾個 Pod,常見於 ML 或 GPU 工作負載,或anti-affinity-heavy工作負載),次要 IP 模式 ("32") 是更最佳化的組態。它為每個 Pod 配置一個 IP,而不是為每個節點預留 16 個 IP,這會擴展 Pod /20 子網路的有效容量。
如需詳細資訊,請參閱Pod 的次要 IP 模式。若要將 Pod 保留在與節點不同的子網路中 (獨立於配置模式),請參閱 分開 Pod 的子網路和安全群組。
建立節點類別
要建立 NodeClass,請執行下列步驟:
-
使用節點類別組態建立 YAML 檔案 (例如
nodeclass.yaml) -
使用
kubectl將組態套用至您的叢集 -
在節點集區組態中參考節點類別。如需詳細資訊,請參閱為 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 # Optional: Static network interface configuration for EFA workloads networkInterfaces: # The primary ENI (networkCardIndex 0, deviceIndex 0) must use interfaceType: interface # secondaryIPv4Count and secondaryIPv4PrefixCount are only supported on networkCardIndex 0 - deviceIndex: 0 interfaceType: interface networkCardIndex: 0 secondaryIPv4Count: 10 - deviceIndex: 1 interfaceType: interface networkCardIndex: 0 secondaryIPv4PrefixCount: 2 # Only one of secondaryIPv4Count or secondaryIPv4PrefixCount per ENI - deviceIndex: 0 interfaceType: efa-only networkCardIndex: 1 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 角色需要AmazonEKSAutoNodePolicyEKS 存取政策。如需詳細資訊,請參閱使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權。 -
最大 Pod 密度 - EKS 會將節點上的最大 Pod 數量限制為 110。此限制是在現有的最大 Pod 計算之後套用的。如需詳細資訊,請參閱選擇最佳的 Amazon EC2 節點執行個體類型。
-
標籤 - 如果您想要將標籤從 Kubernetes 傳播到 EC2,需要設定其他 IAM 許可。如需詳細資訊,請參閱了解 EKS 自動模式中的身分和存取。
-
預設節點類別 - 請勿將您的自訂節點類別命名為
default。這是因為 EKS 自動模式包含一個名為default的NodePool,當您啟用至少一個內建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 格式會在許可時驗證,但僅在啟動時檢查是否存在。如果在節點執行時刪除置放群組,現有的節點會標記為偏離,並無限期持續執行,因為偏離取代啟動也會遭到封鎖。 -
Hugepages — 如需在節點上設定巨型分頁的相關資訊,請參閱 在節點上設定巨型分頁。
-
Kubelet 設定 — 如需覆寫 Pod 密度、移出閾值和日誌輪換等 kubelet 設定的相關資訊,請參閱 在節點上設定 kubelet 設定。
-
核心 sysctls – 如需在節點上設定核心 sysctls 的相關資訊,請參閱 在節點上設定核心 sysctl。
分開 Pod 的子網路和安全群組
podSubnetSelectorTerms 和 podSecurityGroupSelectorTerms 欄位允許 Pod 使用與其節點不同的子網路和安全群組,以啟用進階聯網組態。兩個欄位必須一起指定。這種分離可增強對網路流量路由與安全政策的控制。
注意
此功能與用於非 EKS Auto Mode 運算的 VPC CNI 的 Pod 安全群組 (SGPP) 功能不同。EKS Auto 模式不支援 SGPP。反之,請在 podSecurityGroupSelectorTerms中使用 NodeClass,將個別的安全群組套用至 Pod 流量。安全群組適用於 NodeClass層級,這表示使用 NodeClass共用相同 Pod 安全群組之節點上的所有 Pod。
運作方式
當您設定 podSubnetSelectorTerms和 時podSecurityGroupSelectorTerms:
-
節點的主要 ENI 使用來自 和 的子網路
subnetSelectorTerms和安全群組securityGroupSelectorTerms。只有節點自己的 IP 地址才會指派給此界面。 -
EKS Auto Mode 會在符合 的子網路中建立次要 ENIs
podSubnetSelectorTerms,並podSecurityGroupSelectorTerms連接來自 的安全群組。根據預設,Pod IP 地址會使用 /28 字首從這些次要 ENIs 配置,並在連續字首區塊無法使用時自動回復到次要 IPs (/32)。如果在"32"中ipv4PrefixSize將 設定為advancedNetworking,則只會使用次要 IPs。 -
中指定的安全群組
podSecurityGroupSelectorTerms適用於 VPC 內的 Pod 流量。對於目的地在 VPC 之外的流量,Pod 會使用節點的主要 ENI (及其安全群組),因為來源網路位址轉譯 (SNAT) 會將 Pod IP 轉譯為節點 IP。您可以使用 中的snatPolicy欄位修改此行為NodeClass。
使用案例
當您需要podSecurityGroupSelectorTerms時,請使用 podSubnetSelectorTerms和 :
-
套用不同的安全群組,分別控制節點和 Pod 的流量。
-
將基礎設施流量 node-to-node通訊) 與應用程式流量 (Pod-to-Pod通訊) 分開。
-
對節點子網路和 Pod 子網套用不同的聯網組態。
-
專門為節點流量設定反向代理或網路篩選, 而不影響 Pod 流量。使用
advancedNetworking和certificateBundles來定義您的反向代理,以及代理的任何自簽署或私有憑證。
範例組態
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 安全群組適用於使用 排程在節點上的所有 Pod
NodeClass。若要將不同的安全群組套用至不同的工作負載,請建立個別NodeClass和NodePool資源,並使用污點、容錯或節點選擇器,將工作負載排程到適當的節點。 -
降低 Pod 密度:每個節點可以執行較少的 Pod,因為節點的主要網路介面預留給節點 IP,且無法用於 Pod。
-
子網路選擇器限制:標準
subnetSelectorTerms和securityGroupSelectorTerms組態不適用於 Pod 子網路或安全群組選擇。 -
網路規劃:確保節點和 Pod 子網路中有足夠的 IP 位址空間,以支援您的工作負載需求。
-
路由組態:確認已正確設定 Pod 子網路的路由表和網路存取控制清單 (ACL),以便在節點和 Pod 子網路之間進行通訊。
-
可用區域:確認您已在多個 AZ 中建立 Pod 子網路。如果您使用的是特定的 Pod 子網路,它必須與節點子網路 AZ 位於相同的 AZ 中。
Pod 的次要 IP 模式
ipv4PrefixSize 欄位透過僅將次要 IP 地址配置給節點來啟用進階聯網組態。此功能不會將字首 (/28) 配置給節點,而且只會維護一個次要 IP 做為 MinimalIPTarget。
advancedNetworking.ipv4PrefixSize 接受兩個值:Auto(預設;字首委派;較高的 Pod-creation 速度;每個節點保留至少 16 IPs) 和 "32"(次要 IP 模式;每個 Pod 1 個 IP;新增每個 Pod AssignPrivateIpAddresses呼叫;由執行個體類型的 ENI IP 限制限制限制限制pods-per-node)。
在 Auto模式下,EKS Auto Mode 會預先將/28字首 (16 IPs) 配置給每個節點,並在 Pod 需求超過目前區塊的容量/28時新增另一個節點,因此 16 是每個節點的最小值,而不是上限。
使用以下數字進行規劃;實際叢集會有所不同。當 Pod 子網路變得分段且沒有連續/28可用時,Auto模式會回到該節點上的每個 IP 配置。然後,每個節點 IP 計數會低於如下所示的 16 個字首模式。
範例 A — 節點上的 1 個 Pod
-
次要 IP 模式:1 個 Pod IP + 1 個節點 IP = 2 個使用中的 IPs。
-
字首模式:來自第一個
/28字首的 1 個節點 IP + 16 個 IPs (其中 1 個由 Pod 使用,15 個保留供未來 Pod 使用) = 配置 17 IPs,2 個在使用中。
範例 B — 節點上的 18 個 Pod
-
次要 IP 模式:18 個 Pod IPs + 1 個節點 IP = 使用中的 19 IPs。
-
字首模式:1 個節點 IP + 2 ×
/28字首 (總計 32 IPs,第一個/28滿載為 16 個 Pod,第二個/28保留 Pod 17-18,其中 14 個保留供未來 Pod 使用) = 配置 33 IPs,19 個在使用中。
若要切換到 Pod 稀疏工作負載的次要 IP 模式 (每個 Pod 1 個 IP,無字首保留),請使用 建立自訂NodeClassadvancedNetworking.ipv4PrefixSize: "32"並指向自訂NodePool。內建general-purpose和system節點集區使用自動佈建的 default NodeClass;覆寫ipv4PrefixSize需要搭配自訂 NodePool 的自訂 NodeClass。 NodePool
使用案例
-
更好的子網路 IP 地址使用率
-
無字首分割
範例組態
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 輸出流量,提供增強的安全性,特別是在與網路政策搭配使用時。
靜態網路界面組態
下的 networkInterfaces 欄位advancedNetworking可讓您靜態定義在啟動時連接到執行個體的網路介面。這主要用於為分散式訓練和推論工作負載中的高效能節點間通訊設定 Elastic Fabric Adapter (EFA) 裝置。此功能可與靜態容量節點集區配對,以維護預先暖機且 EFA 就緒的節點。如需 EKS 中 EFA 裝置管理的詳細資訊,請參閱 在 Amazon EKS 上管理 EFA 裝置。如需特定執行個體類型的建議 EFA 組態,請參閱《Amazon EC2 使用者指南》中的為啟用 EFA 的執行個體類型最大化網路頻寬。
運作方式
中的每個項目都會networkInterfaces定義在啟動期間連接至執行個體的網路界面。每個項目都會指定 networkCardIndex(網路卡,其中 0是主要)、 deviceIndex(該卡上的裝置位置) 和 interfaceType(interface適用於標準 IP 型流量,或efa-only適用於專用於無 IP 地址之 RDMA 流量的 EFA 介面)。主要 ENI (networkCardIndex: 0、deviceIndex: 0) 必須使用 interfaceType: interface 來支援 IP 型節點通訊。這些efa-only介面僅支援 RDMA 的 EFA 裝置功能,且無法使用 IP 地址設定。
您可以使用 (每個單位提供 1 個 IP 地址networkCardIndex: 0) 或 secondaryIPv4Count(每個單位提供具有 16 個 IP 地址的 /28 字首),將 IP 容量指派給主要網路卡 secondaryIPv4PrefixCount() 上的介面。每個界面只能使用其中一個,而且僅在 上支援。 networkCardIndex: 0它們無法在efa-only介面上使用。
重要
設定 networkInterfaces 時,EKS Auto Mode 不會在執行個體啟動後連接其他 IPs、字首或 ENIs。只有啟動時設定的介面和 IP 地址可供 Pod 使用。您必須根據設定的 IPs 數量來規劃 Pod 密度。
考量事項
靜態定義的網路介面不支援 IPv6。定義多個網路介面時, associatePublicIPAddress不相容,因此使用多個介面的節點無法擁有公IPs (僅限公有叢集或混合公有/私有叢集)。
podSecurityGroupSelectorTerms 搭配靜態網路介面使用 podSubnetSelectorTerms和 時,請使用 0 IPs 設定主要 ENI。主要 ENI 使用節點子網路和安全群組,而 Pod 流量則使用次要 ENIs 上的 Pod 子網路組態。
範例:僅限 EFA 的 GPU 訓練界面
下列範例顯示為分散式訓練中使用的 GPU 執行個體NodeClass設定了僅限 EFA 介面的 。主要介面具有 /28 字首 (16 個 Pod IPs) 和 4 個額外的僅限 EFA 介面,可提供 RDMA 連線能力。此組態可與靜態容量節點集區配對,以維護預先暖機的 EFA 就緒節點。
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: efa-training spec: role: MyNodeRole subnetSelectorTerms: - tags: Name: "private-subnet" securityGroupSelectorTerms: - tags: Name: "efa-security-group" placementGroupSelector: name: "ml-training-pg" advancedNetworking: networkInterfaces: - deviceIndex: 0 interfaceType: interface networkCardIndex: 0 secondaryIPv4PrefixCount: 1 - deviceIndex: 1 interfaceType: efa-only networkCardIndex: 0 - deviceIndex: 0 interfaceType: efa-only networkCardIndex: 1 - deviceIndex: 0 interfaceType: efa-only networkCardIndex: 2 - deviceIndex: 0 interfaceType: efa-only networkCardIndex: 3
在節點上設定巨型分頁
使用 advancedCompute.hugepages 欄位,您可以在 中的節點上設定巨型分頁NodeClass。Hugepage 可改善延遲敏感工作負載的記憶體存取效能,例如高效能運算 (HPC)、資料庫和網路密集型應用程式。您可以分別或一起使用兩個獨立的巨型分頁組態:
-
靜態巨型分頁 – 使用
pages欄位在每個節點上預先配置固定數量的2Mi或1Gi巨型分頁,或混合兩種大小。靜態巨型分頁是可排程的節點資源。若要使用這些資源,請將您的 Pod 設定為明確請求巨型資源,例如hugepages-2Mi或hugepages-1Gi。如需詳細資訊,請參閱 Kubernetes 文件中的管理 HugePages。 -
透明巨型 (THP) – 使用
transparent欄位來設定核心的 THP 政策。THP 是全核心的政策,而不是可配置的資源。它不會影響排程或節點容量,且 Pod 不會請求它。如需詳細資訊,請參閱 Linux 核心文件中的透明 Hugepage Support。
範例組態
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: hugepages-compute spec: role: MyNodeRole subnetSelectorTerms: - tags: Name: "private-subnet" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" advancedCompute: hugepages: # Static hugepage reservations: up to one entry for each size pages: - size: "2Mi" count: 512 - size: "1Gi" count: 2 # Transparent hugepages (THP) kernel policy transparent: enabled: always # or madvise, never defrag: defer # or always, defer+madvise, madvise, never
透明巨型分頁設定
這兩種transparent設定都是選用的。如果您省略設定,節點會使用核心預設值 (madvise)。
-
enabled– 使用enabled控制 THP 配置政策。將此設為always以在整個系統中套用 THP。將其設定為madvise,使其僅將 THP 套用至選擇使用 的記憶體區域madvise(MADV_HUGEPAGE)。將其設定為never以停用 THP。 -
defrag–defrag用來控制核心積極壓縮記憶體以滿足 THP 配置的程度。有效值為always、defer、defer+madvise、madvise、never。
若要停用 THP,例如,對於建議將其關閉的資料庫工作負載,請設定 enabled: never。當 enabled為 時never,請defrag保持取消設定或將其設定為 never;NodeClass 驗證會拒絕任何其他組合。
Hugepages 考量事項
在 NodeClass 上設定巨型分頁時,請考慮下列事項:
-
靜態巨型分頁大小 – 使用
pages欄位,為每個巨型分頁大小指定最多一個項目 (2Mi和1Gi)。您可以在相同的節點上保留這兩個大小。 -
記憶體保留 – 靜態巨型分頁會計入執行個體的總記憶體。當跨所有頁面大小的合併巨型分頁保留超過總記憶體的 80% 時,Amazon EKS 會將執行個體類型標記為與 NodeClass 不相容。
-
EFA 交互排除 – Elastic Fabric Adapter (EFA) 和靜態巨型分頁不能同時存在於同一個 NodeClass 上。如果您使用
interfaceType: efa-only設定pages,NodeClass 驗證會失敗。Amazon EKS 不會佈建vpc.amazonaws.com/efa從具有靜態巨型的 NodeClass 請求的 Pod。將單獨的 NodeClass 用於 EFA 工作負載。透明巨型分頁不會與 EFA 衝突;您可以在使用 EFA 介面的 NodeClasstransparent上設定 。
在節點上設定 kubelet 設定
使用 advancedCompute.kubelet 欄位覆寫 中節點上的 kubelet 設定NodeClass。透過這些覆寫,您可以調整 Pod 密度、資源壓力移出、容器日誌輪換和out-of-memory(OOM) 行為。Amazon EKS 會將預設 kubelet 設定套用至 Auto Mode 節點,因此只有當您的工作負載需要不同的行為時,才能設定此欄位。如需基礎設定的詳細資訊,請參閱 Kubernetes 文件中的 Kubelet 組態
下列 kubelet 設定可供使用:
-
maxPods:可在節點上執行的 Pod 數量上限。 -
podPidsLimit:每個 Pod 的處理程序 IDs (PIDs) 數目上限。 -
idsPerPod:kubelet 分配給每個 Pod 使用者命名空間的 UIDs 和 GIDs 數目。 -
singleProcessOOMKill:kubelet OOM 是否個別刪除容器中的程序,而不是以群組的形式終止。 -
eviction:資源壓力訊號的硬式和軟式移出閾值。 -
logging:容器日誌輪換大小和檔案計數。 -
allowedUnsafeSysctls:允許在節點上排程的 Pod 設定不安全的 sysctl*或結尾為 的命名空間模式清單。
範例組態
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: kubelet-compute spec: role: MyNodeRole subnetSelectorTerms: - tags: Name: "private-subnet" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" advancedCompute: kubelet: # Range: 1-110 maxPods: 60 # -1 disables the limit, or specify 100 or greater podPidsLimit: 4096 # Multiple of 65536, range: 65536-4294967295. Requires # advancedCompute.kernel.sysctl.user.max_user_namespaces > 0. idsPerPod: 65536 singleProcessOOMKill: false eviction: # Valid signals: memory.available, nodefs.available, nodefs.inodesFree, # imagefs.available, imagefs.inodesFree, pid.available hard: memory.available: "100Mi" nodefs.available: "10%" soft: memory.available: "500Mi" nodefs.available: "15%" # Required when soft thresholds are set softGracePeriod: memory.available: "1m30s" nodefs.available: "2m" # 0 uses each Pod's terminationGracePeriodSeconds maxPodGracePeriod: 60 logging: containerLogMaxSize: "10Mi" # Minimum: 2 containerLogMaxFiles: 5 # Up to 64 entries. Allowed patterns: kernel.shm*, kernel.msg*, # kernel.sem, fs.mqueue.*, net.* allowedUnsafeSysctls: - "net.core.somaxconn" - "kernel.shm*"
Kubelet 設定考量事項
在 NodeClass 上設定 kubelet 設定時,請考慮下列事項:
-
節點替換:變更現有 上的 kubelet 設定會將使用該設定的節點
NodeClass標記為偏離。Amazon EKS 會將這些節點取代為使用更新組態的新節點。Amazon EKS 不會將 kubelet 設定套用至已就地執行的節點。 -
maxPods綁定:您設定的值是上限,而不是保證。在執行時間,Amazon EKS 會套用三個值中最低的值。這些是您的maxPods值、執行個體類型可用的 IP 地址,以及每個節點 110 個 Pod 的自動模式限制。如需詳細資訊,請參閱選擇最佳的 Amazon EC2 節點執行個體類型。 -
podPidsLimit值:指定-1以停用限制,或100或更高的值。NodeClass驗證會拒絕介於0和 之間的值99。 -
idsPerPod需求: 值必須是介於65536和65536之間的倍數4294967295。設定advancedCompute.kernel.sysctl.user.max_user_namespacesidsPerPod需要在相同的 上設定為正值NodeClass;NodeClass許可會拒絕設定 的組態,idsPerPod而不user.max_user_namespaces同時將 設定為大於 的值0。如需user.max_user_namespaces的相關資訊,請參閱 支援的 sysctl。 -
軟移出閾值:軟閾值必須比相同訊號的硬閾值更不積極,這表示它會提早觸發。如果您設定軟閾值,您也必須
softGracePeriod為每個訊號設定 。軟閾值和硬閾值可以使用不同的單位,例如百分比和絕對數量。在這種情況下,Amazon EKS 會解析每個執行個體類型的兩個值。然後,Amazon EKS 會將違反比較的執行個體類型標記為與 不相容NodeClass。 -
singleProcessOOMKill版本需求:此設定需要 Kubernetes 1.32 版或更新版本。在舊版上,Amazon EKS 會在 上發出警告事件,NodeClass而且設定沒有效果。 -
allowedUnsafeSysctls限制:您最多可以指定 64 個項目,而且每個項目必須符合其中一個允許的模式:kernel.shm*、kernel.msg*、fs.mqueue.、kernel.sem或net.。允許節點上的不安全 sysctl 只允許 Pod 請求它。每個 Pod 仍必須在其 中列出 sysctlsecurityContext.sysctls。如需詳細資訊,請參閱 Kubernetes 文件中的在 Kubernetes 叢集中使用 sysctl。
在節點上設定核心 sysctl
使用 advancedCompute.kernel.sysctl 欄位在 中的節點上設定 Linux 核心 sysctlNodeClass。對於需要更高聯網限制、不同記憶體管理政策或特定 TCP 設定的工作負載,Sysctls 會調整執行時間核心行為。sysctl 欄位上的屬性名稱完全符合基礎核心 sysctl 名稱 (例如, vm.swappiness和 net.core.somaxconn)。Amazon EKS 會在節點開機時套用 sysctl 值。如果您在現有的 NodeClass 上變更 sysctl,Amazon EKS 會開始取代節點,讓新值生效。
範例組態
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: tuned-compute spec: role: MyNodeRole subnetSelectorTerms: - tags: Name: "private-subnet" securityGroupSelectorTerms: - tags: Name: "eks-cluster-sg" advancedCompute: kernel: sysctl: vm.swappiness: 30 net.core.somaxconn: 4096 net.ipv4.tcp_congestion_control: "cubic" vm.dirty_background_ratio: 10 vm.dirty_ratio: 20
支援的 sysctl
Amazon EKS 僅支援下表中的 sysctl。每個數值 sysctl 都會強制執行顯示的最小值和最大值,而 NodeClass 許可則會拒絕該範圍以外的值。字串 sysctls 僅接受列出的值。
| Sysctl | 說明 | 允許的值 |
|---|---|---|
|
|
非同步 I/O 請求的數量上限。 |
|
|
|
每個實際使用者 ID 的 Inotify 執行個體數量上限。 |
|
|
|
每個實際使用者 ID 的 inotify 監看數量上限。 |
|
|
|
程序可配置的檔案處理數目上限。 |
|
|
|
控制對效能事件系統的無權限存取。 |
|
|
|
每個 CPU 在 INPUT 端排入佇列的封包數量上限。 |
|
|
|
接收通訊端緩衝區大小上限,以位元組為單位。 |
|
|
|
接聽 syscall 中待處理項目引數的最大值。 |
|
|
|
傳送通訊端緩衝區大小上限,以位元組為單位。 |
|
|
|
垃圾回收可以執行之前的最低 ARP-cache 項目數。 |
|
|
|
ARP-cache 項目的軟性數量上限。 |
|
|
|
ARP-cache 項目的硬性上限數量。 |
|
|
|
新連線的 TCP 擁塞控制演算法。 |
|
|
|
孤立連線在本機端中止之前,會維持在 FIN_WAIT_2 狀態的時間長度,以秒為單位。 |
|
|
|
啟用保持連線時,TCP 傳送保持連線訊息的頻率,以秒為單位。 |
|
|
|
允許之未完成 SYN 請求的數量上限。核心會捨棄超過此值的請求。 |
|
|
|
當新連線在通訊協定觀點上是安全的時,啟用 TIME-WAIT 通訊端的重複使用。 會 |
|
|
|
使用者可建立的使用者名稱空間數目上限。的值會 |
|
|
|
核心排清程式執行緒開始將骯髒頁面寫回磁碟的可用記憶體百分比。 |
|
|
|
上百秒的頁面才符合回寫資格。 |
|
|
|
寫入程式被強制封鎖寫入的可用記憶體百分比。 |
|
|
|
排清器執行緒叫用之間的數百秒。 |
|
|
|
單一程序可能擁有的記憶體映射區域數目上限。 |
|
|
|
交換與檔案系統分頁的相對 IO 成本。 |
|
|
|
記憶體回收浮水印比例,以 10,000 為單位。 |
|
Sysctls 考量事項
在 NodeClass 上設定核心 sysctl 時,請考慮下列事項:
-
支援的 sysctl - 僅支援的 sysctl支援 中列出的 sysctl。每個欄位都會強制執行記錄的最小值和最大值,且 NodeClass 許可會拒絕該範圍以外的值。
-
在開機時套用 – Sysctls 會在節點開機
[settings.kernel.sysctl]時寫入 Bottlerocket 的 。執行時間會變更以將現有節點spec.advancedCompute.kernel.sysctl標記為偏離;新值只會在取代節點上生效。 -
vm.dirty_background_ratio和vm.dirty_ratio– 這兩個欄位必須同時設定或同時省略,且vm.dirty_background_ratio必須嚴格小於vm.dirty_ratio。NodeClass 許可會拒絕違反任一規則的組態。 -
net.ipv4.neigh.default.gc_thresh1、gc_thresh2和gc_thresh3– 三個 ARP-cache 閾值必須一起設定或全部省略,且其值必須符合gc_thresh1 < gc_thresh2 < gc_thresh3。NodeClass 許可會拒絕違反任一規則的組態。 -
net.ipv4.tcp_congestion_control– 僅接受renocubic和 。