

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# Amazon EKS のノードクラスを作成する
<a name="create-node-class"></a>

Amazon EKS ノードクラスは、EKS Auto Mode マネージドノードの設定をきめ細かく制御できるテンプレートです。ノードクラスは、ネットワーク設定、ストレージ設定、リソースタグ付けなど、EKS クラスター内のノードのグループに適用されるインフラストラクチャレベルの設定を定義します。このトピックでは、特定の運用要件を満たすようにノードクラスを作成および設定する方法について説明します。

EKS Auto Mode がデフォルト設定を超えて EC2 インスタンスをプロビジョニングおよび設定する方法をカスタマイズする必要がある場合は、ノードクラスを作成すると、重要なインフラストラクチャパラメータを正確に制御できます。例えば、セキュリティを強化するためにプライベートサブネットの配置を指定したり、パフォーマンス重視のワークロード用にインスタンスエフェメラルストレージを設定したり、コスト配分のためにカスタムタグ付けを適用したりできます。

## ノードクラスを作成する
<a name="_create_a_node_class"></a>

`NodeClass` を作成するには、次の手順に従います。

1. 自分のノードクラス設定で YAML ファイル (`nodeclass.yaml` など) を作成します

1. `kubectl` を使用してこの設定をクラスターに適用します 

1. ノードプール設定でノードクラスを参照します。詳細については、「[EKS 自動モードl 用のノードプールを作成する](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 自動モードl 用のノードプールを作成する](create-node-pool.md)」を参照してください。

## ノードクラスのアクセスエントリを作成する
<a name="auto-node-access-entry"></a>

カスタムノードクラスを作成する場合は、ノードがクラスターに参加できるように EKS アクセスエントリを作成する必要があります。組み込みのノードクラスとノードプールを使用すると、EKS によってアクセスエントリが自動的に作成されます。

アクセスエントリがどのように機能するかについては、「[EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する](access-entries.md)」を参照してください。

EKS Auto Mode ノードクラスのアクセスエントリを作成するときは、`EC2` のアクセスエントリタイプを使用する必要があります。

### CLI でアクセスエントリを作成する
<a name="_create_access_entry_with_cli"></a>

 **EC2 ノードのアクセスエントリを作成して EKS Auto Node ポリシーを関連付けるには:** 

次の CLI コマンドを、使用するクラスター名とノードロール ARN で更新します。ノードロール 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 ポリシーを関連付けるには:** 

次の CloudFormation を、使用するクラスター名とノードロール ARN で更新します。ノードロール 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 スタックのデプロイの詳細については、「[Getting started with 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 アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する](access-entries.md)」を参照してください。
+  **最大 Pod 密度** - EKS では、ノード上の Pod の最大数が 110 に制限されています。この制限は、既存の最大 Pod を計算した後に適用されます。詳細については、「[最適な Amazon EC2 ノードインスタンスタイプを選択する](choosing-instance-type.md)」を参照してください。
+  **タグ** - Kubernetes から EC2 にタグを伝播させる場合は、追加の IAM アクセス許可を設定する必要があります。詳細については、「[EKS Auto Mode での ID とアクセスについての説明](auto-learn-iam.md)」を参照してください。
+  **デフォルトのノードクラス** - カスタムノードクラスに `default` という名前を付けないでください。これは、EKS Auto Mode には、少なくとも 1 つの組み込み `NodePool` を有効にすると自動的にプロビジョニングされる `default` と呼ばれる `NodeClass` が含まれるためです。組み込み `NodePools` を有効にする方法については、「[組み込み NodePool を有効または無効にする](set-builtin-node-pools.md)」を参照してください。
+  **複数のサブネットを使用した `subnetSelectorTerms` 動作** - `subnetSelectorTerms` 条件に一致するサブネットまたは ID で指定したサブネットが複数ある場合、EKS Auto Mode はサブネット全体に分散されたノードを作成します。
  + サブネットが異なるアベイラビリティーゾーン (AZ) にある場合、[Pod トポロジスプレッド制約](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#pod-topology-spread-constraints)や [Topology Aware Routing](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/) といった Kubernetes 機能を使用して、Pod とトラフィックをそれぞれゾーン間に分散できます。
  + *同じ AZ 内に* `subnetSelectorTerms` に一致するサブネットが複数ある場合、EKS Auto Mode はその AZ のサブネット全体に分散した各ノードに Pod を作成します。EKS Auto Mode は、同じ AZ 内の他のサブネットの各ノードにセカンダリネットワークインターフェイスを作成します。各サブネットで使用可能な IP アドレスの数に基づいて選択し、サブネットをより効率的に使用します。ただし、EKS Auto Mode が各 Pod に使用するサブネットを指定することはできません。特定のサブネットで Pod を実行する必要がある場合は、代わりに [ポッドのサブネットとセキュリティグループを分離する](#pod-subnet-selector) を使用してください。

## ポッドのサブネットとセキュリティグループを分離する
<a name="pod-subnet-selector"></a>

`podSubnetSelectorTerms` と `podSecurityGroupSelectorTerms` フィールドにより、ポッドがノードとは異なるサブネットとセキュリティグループを使用できるようになるため、高度なネットワーク設定が可能になります。両方のフィールドを一緒に指定する必要があります。この分離により、ネットワークトラフィックのルーティングとセキュリティポリシーの制御が強化されます。

**注記**  
この機能は、EKS Auto Mode 以外のコンピューティング用の AWS VPC CNI で使用される[ポッドのセキュリティグループ](security-groups-for-pods.md) (SGPP) 機能とは異なります。SGPP は EKS Auto Mode ではサポートされていません。代わりに、`NodeClass` で `podSecurityGroupSelectorTerms` を使用して、ポッドトラフィックに個別のセキュリティグループを適用します。セキュリティグループは `NodeClass` レベルで適用されます。つまり、その `NodeClass` を使用するノード上のすべてのポッドは、同じのポッドセキュリティグループを共有します。

### 仕組み
<a name="_how_it_works"></a>

`podSubnetSelectorTerms` と `podSecurityGroupSelectorTerms` を設定する場合:

1. ノードのプライマリ ENI は、`subnetSelectorTerms` および `securityGroupSelectorTerms` のサブネットとセキュリティグループを使用します。このインターフェイスには、ノード自身の IP アドレスのみが割り当てられます。

1. EKS Auto Mode では、`podSubnetSelectorTerms` に一致するサブネット内にセカンダリ ENI が作成され、`podSecurityGroupSelectorTerms` のセキュリティグループがそれらにアタッチされます。ポッド IP アドレスは、デフォルトで /28 プレフィックスを使用してこれらのセカンダリ ENI から割り当てられます。連続するプレフィックスブロックが使用できない場合、セカンダリ IP (/32) への自動フォールバックが行われます。`advancedNetworking` で `ipv4PrefixSize` が `"32"` に設定されている場合、セカンダリ IP のみが使用されます。

1. `podSecurityGroupSelectorTerms` で指定されたセキュリティグループは、VPC 内のポッドトラフィックに適用されます。VPC 外を送信先とするトラフィックの場合、ソースネットワークアドレス変換 (SNAT) はポッド IP をノード IP に変換するため、ポッドはノードのプライマリ ENI (およびそのセキュリティグループ) を使用します。この動作は、`NodeClass` の `snatPolicy` フィールドで変更できます。

### ユースケース
<a name="_use_cases"></a>

以下の場合に `podSubnetSelectorTerms` および `podSecurityGroupSelectorTerms` を使用します。
+ 異なるセキュリティグループを適用して、ノードとポッドのトラフィックを個別に制御する必要がある場合。
+ インフラストラクチャトラフィック (ノード間の通信) とアプリケーショントラフィック (ポッド間の通信) を分離する必要がある場合。
+ 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"
```

### 個別のポッドサブネットとセキュリティグループに関する考慮事項
<a name="_considerations_for_separate_pod_subnets_and_security_groups"></a>
+  **セキュリティグループの範囲**: `podSecurityGroupSelectorTerms` のセキュリティグループはセカンダリ ENI にアタッチされ、VPC 内のポッドトラフィックに適用されます。SNAT が有効になっている場合 (デフォルトの `snatPolicy: Random`)、VPC から出るトラフィックはノードのプライマリ ENI IP アドレスに変換されるため、`securityGroupSelectorTerms` からのノードのセキュリティグループは代わりにそのトラフィックに適用されます。`snatPolicy: Disabled` を設定すると、ポッドはすべてのトラフィックに独自の IP アドレスを使用するため、ルーティンググループとセキュリティグループが適切に設定されていることを確認する必要があります。
+  **NodeClass レベルの粒度**: ポッドセキュリティグループは、`NodeClass` を使用してノードでスケジュールされたすべてのポッドに適用されます。異なるセキュリティグループを異なるワークロードに適用するには、個別の `NodeClass` リソースと `NodePool` リソースを作成し、テイント、許容範囲、またはノードセレクターを使用してワークロードを適切なノードにスケジュールします。
+  **ポッド密度の低下**: ノードのプライマリネットワークインターフェイスはノード IP 用に予約されており、ポッドに使用できないため、各ノードで実行できるポッドの数が少なくなります。
+  **サブネットセレクターの制限**: 標準 `subnetSelectorTerms` および `securityGroupSelectorTerms` 設定は、ポッドサブネットまたはセキュリティグループの選択には適用されません。
+  **ネットワーク計画**: ワークロード要件をサポートするために、ノードサブネットと Pod サブネットの両方に十分な IP アドレススペースを確保します。
+  **ルーティング設定**: Pod サブネットのルートテーブルとネットワークアクセスコントロールリスト (ACL) が、ノードと Pod サブネット間の通信用に正しく設定されていることを確認します。
+  **アベイラビリティーゾーン**: 複数の AZ にわたって Pod サブネットを作成したことを確認します。特定のポッドサブネットを使用している場合、そのサブネットはノードサブネット AZ と同じ AZ に存在している必要があります。

## ポッドのセカンダリ IP モード
<a name="secondary-IP-mode"></a>

`ipv4PrefixSize` フィールドは、ノードへのセカンダリ IP アドレスのみを割り当てることで、高度なネットワーク設定を有効にします。この機能はノードにプレフィックス (/28) を割り当てず、1 つのセカンダリ IP のみを MinimalIPTarget として維持します。

### ユースケース
<a name="_use_cases_2"></a>

次の場合に `ipv4PrefixSize` を使用します:
+  **IP 使用率を抑えたい**: 各ノードでウォームアップされる IP アドレスが 1 つだけになります。
+  **ポッドの解約率を低下させたい**: ポッドの作成速度がそれほど重要ではない場合に適しています。
+  **プレフィックスのフラグメント化を回避したい**: プレフィックスによるフラグメント化が大きな懸念事項、または Auto Mode 使用の阻害要因となっている場合に適しています。

### 設定例
<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>
+  **ポッド作成速度の低下**: 1 つのセカンダリ IP のみがウォームアップされるため、より多くのポッドが作成された場合、IPAM サービスによる IP のプロビジョニングにより多くの時間がかかります。

## IPv6 クラスター内の IPv6 ポッドからの IPv4 egress を無効にする。
<a name="enableV4Egress"></a>

デフォルトでは、`enableV4Egress` フィールドは `true` です。Auto Mode IPv6 クラスターの場合、この機能を無効にすることで、Auto Mode が IPv6 ポッドに対して egress 専用 IPv4 インターフェイスを作成しないようにすることができます。IPv4 egress インターフェイスはネットワークポリシーの適用対象外であるため、これは重要です。ネットワークポリシーは、ポッドのプライマリインターフェイス (eth0) にのみ適用されます。

### ユースケース
<a name="_use_cases_3"></a>

次の場合に `enableV4Egress` を使用します:
+  **IPv6 クラスターを使用する**: IPv4 egress トラフィックはデフォルトで許可されています。
+  **ネットワークポリシーを使用する**: 現在、EKS ネットワークポリシーはデュアルスタックをサポートしていません。`enableV4Egress` を無効にすると、ポッドトラフィックが 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 egress トラフィックがブロックされ、特にネットワークポリシーで使用する場合にセキュリティが強化されます。