

 **協助改進此頁面** 

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

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

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

# 建立 Amazon EKS 的節點類別
<a name="create-node-class"></a>

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

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

## 建立節點類別
<a name="_create_a_node_class"></a>

要建立 `NodeClass`，請執行下列步驟：

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

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

1. 在節點集區組態中參考節點類別。如需詳細資訊，請參閱[為 EKS 自動模式建立節點集區](create-node-pool.md)。

您需要已安裝並設定 `kubectl`。如需詳細資訊，請參閱[設定以使用 Amazon EKS](setting-up.md)。

### 基本節點類別範例
<a name="_basic_node_class_example"></a>

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

```
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 自動模式建立節點集區](create-node-pool.md)。

## 建立節點類別存取項目
<a name="auto-node-access-entry"></a>

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

如需項目存取方法的相關資訊，請參閱 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。

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

### 使用 CLI 建立存取項目
<a name="_create_access_entry_with_cli"></a>

 **要建立 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 建立存取項目
<a name="_create_access_entry_with_cloudformation"></a>

 **要建立 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 入門](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.html) 

## 節點類別規格
<a name="auto-node-class-spec"></a>

```
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
```

## 考量事項
<a name="_considerations"></a>
+ 如果您想要確認執行個體有多少本機儲存，可以描述節點以查看暫時性儲存資源。
+  **磁碟區加密** - EKS 使用設定的自訂 KMS 金鑰來加密執行個體的唯讀根磁碟區及讀取/寫入資料磁碟區。
+  **取代節點 IAM 角色** - 如果您變更與 `NodeClass` 相關聯的節點 IAM 角色，則需要建立新的存取項目。EKS 在叢集建立期間會自動為節點 IAM 角色建立存取項目。節點 IAM 角色需要 `AmazonEKSAutoNodePolicy` EKS 存取政策。如需詳細資訊，請參閱[使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。
+  **最大 Pod 密度** - EKS 會將節點上的最大 Pod 數量限制為 110。此限制是在現有的最大 Pod 計算之後套用的。如需詳細資訊，請參閱[選擇最佳的 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。
+  **標籤** - 如果您想要將標籤從 Kubernetes 傳播到 EC2，需要設定其他 IAM 許可。如需詳細資訊，請參閱[了解 EKS 自動模式中的身分和存取](auto-learn-iam.md)。
+  **預設節點類別** - 請勿將您的自訂節點類別命名為 `default`。這是因為 EKS 自動模式包含一個名為 `default` 的 `NodePool`，當您啟用至少一個內建 `NodeClass` 時會自動佈建該類別。如需啟用內建 `NodePools` 的詳細資訊，請參閱 [啟用或停用內建的 NodePool](set-builtin-node-pools.md)。
+  **具有多個子網路的 `subnetSelectorTerms` 行為** - 如果有多個子網路符合 `subnetSelectorTerms` 條件或您按 ID 提供的子網路，EKS 自動模式會建立分佈於各個子網路中的節點。
  + 如果子網路位於不同的可用區域 (AZ)，您可以使用 Kubernetes 功能，例如 [Pod 拓撲分散限制](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#pod-topology-spread-constraints)條件和[拓撲感知路由](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)，分別將 Pod 和流量分散到各個區域。
  + 如果*同一個 AZ 中*有多個子網路符合 `subnetSelectorTerms`，則 EKS 自動模式會在該可用區域中分散在各個子網路的每個節點上建立 Pod。EKS 自動模式會在相同 AZ 中其他子網路中的每個節點建立次要網路介面。它根據每個子網路中可用 IP 位址的數量進行選擇，以更高效地使用子網路。但是，您無法指定 EKS 自動模式為每個 Pod 使用的子網路；如果您需要 Pod 在特定子網路中執行，請改用 [Pod 的個別子網路和安全群組](#pod-subnet-selector)。

## Pod 的個別子網路和安全群組
<a name="pod-subnet-selector"></a>

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

**注意**  
此功能不同於 AWS VPC CNI 用於非EKS Auto Mode 運算的 [Pod 安全群組](security-groups-for-pods.md) (SGPP) 功能。EKS Auto 模式不支援 SGPP。反之，請在 `podSecurityGroupSelectorTerms`中使用 `NodeClass`，將個別的安全群組套用至 Pod 流量。安全群組適用於 `NodeClass`層級，這表示使用 `NodeClass`共用相同 Pod 安全群組之節點上的所有 Pod。

### 運作方式
<a name="_how_it_works"></a>

當您設定 `podSubnetSelectorTerms`和 時`podSecurityGroupSelectorTerms`：

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

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

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

### 使用案例
<a name="_use_cases"></a>

當您需要`podSecurityGroupSelectorTerms`時，請使用 `podSubnetSelectorTerms`和 ：
+ 套用不同的安全群組，分別控制節點和 Pod 的流量。
+ 將基礎設施流量 node-to-node通訊） 與應用程式流量 (Pod-to-Pod通訊） 分開。
+ 對節點子網路和 Pod 子網套用不同的聯網組態。
+ 專門為節點流量設定反向代理或網路篩選, 而不影響 Pod 流量。使用 `advancedNetworking` 和 `certificateBundles` 來定義您的反向代理，以及代理的任何自簽署或私有憑證。

### 範例組態
<a name="_example_configuration"></a>

```
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 子網路和安全群組的考量事項
<a name="_considerations_for_separate_pod_subnets_and_security_groups"></a>
+  **安全群組範圍**： 的安全群組`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 模式
<a name="secondary-IP-mode"></a>

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

### 使用案例
<a name="_use_cases_2"></a>

當您需要以下功能時，可使用 `ipv4PrefixSize`：
+  **降低 IP 使用率**：每個節點只會暖機一個 IP 地址。
+  **較低的 Pod 追逐率**：Pod 建立速度不是主要問題。
+  **無字首分割**：字首導致的分割是使用自動模式的主要考量或封鎖程式。

### 範例組態
<a name="_example_configuration_2"></a>

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

  advancedNetworking:
    ipv4PrefixSize: "32"
```

### 次要 IP 模式的考量事項
<a name="_considerations_for_secondary_ip_mode"></a>
+  **降低 Pod 建立速度**：由於只有一個次要 IP 已暖機，因此在建立更多 Pod 時，IPAM 服務需要更多時間來佈建 IPs。

## 在 IPv4IPv6 叢集中停用 IPv6 Pod 的 IPv6 輸出。
<a name="enableV4Egress"></a>

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

### 使用案例
<a name="_use_cases_3"></a>

當您需要以下功能時，可使用 `enableV4Egress`：
+  **使用 IPv6 叢集**：預設允許 IPv4 輸出流量。
+  **使用網路政策**：目前 EKS 網路政策不支援雙堆疊。停用`enableV4Egress`可防止 Pod 流量意外透過 IPv4 輸出。

### 範例組態
<a name="_example_configuration_3"></a>

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

  advancedNetworking:
    enableV4Egress: false
```

### 停用 enableV4Egress 的考量事項
<a name="_considerations_for_disabling_enablev4egress"></a>
+  **IPv6 叢集中的網路政策**：IPv6 叢集預設允許 IPv4 流量。設定 會`enableV4Egress: false`封鎖 IPv4 輸出流量，提供增強的安全性，特別是在與網路政策搭配使用時。