

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

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

# Pod IP アドレスのサブネット選択を設定する
<a name="cni-subnet-selection"></a>

 **適用対象**: Amazon EC2 インスタンスを持つ Linux ノード

Amazon VPC CNI plugin for Kubernetes はセカンダリ Elastic Network Interface (ENI)をノード上に作成し、それらの ENI から Pod へ IP アドレスを割り当てます。デフォルトでは、VPC CNI はノードのプライマリネットワークインターフェイスと同じサブネットにセカンダリ ENI を作成します。VPC CNI が Pod IP アドレスに使用するサブネットは、次の方法で制御できます:
+  **拡張サブネット検出** – VPC CNI は、同じ VPC とアベイラビリティーゾーン内の `kubernetes.io/role/cni` でタグ付けされたサブネットを自動的に検出して使用します。VPC CNI バージョン 1.18.0 以降が必要です。ほとんどのユースケースでは、この方法をお勧めします。
+  **カスタムネットワーク** – `ENIConfig` カスタムリソースを使用して、アベイラビリティーゾーンごとにサブネットとセキュリティグループを手動で指定します。詳細については、「[カスタムネットワーキングを使用して代替サブネットに Pod をデプロイする](cni-custom-network.md)」を参照してください。

**注記**  
両方の機能が有効になっている場合は、カスタムネットワーキングが優先されます。

## 拡張サブネット検出
<a name="cni-subnet-selection-enhanced-discovery"></a>

VPC CNI バージョン 1.18.0 以降では、デフォルトで拡張サブネット検出が有効になります (`ENABLE_SUBNET_DISCOVERY=true`)。VPC CNI は、ノードと同じ VPC とアベイラビリティーゾーン内のサブネットを自動的に検出し、それらを使用してセカンダリ ENI を作成し、Pod IP アドレスを割り当てます。これにより、手動の `ENIConfig` 設定なしで使用可能な IP アドレス領域が拡張されます。

この機能が有効になっていることを確認するには:

```
kubectl describe ds aws-node -n kube-system | grep ENABLE_SUBNET_DISCOVERY
```

この機能を無効にするには、`aws-node` DaemonSet で `ENABLE_SUBNET_DISCOVERY=false` を設定します。

## サブネットタグの動作 (`kubernetes.io/role/cni`)
<a name="cni-subnet-selection-tag-behavior"></a>

`kubernetes.io/role/cni` タグは、VPC CNI が ENI オペレーションと Pod IP 割り当てのサブネットを処理する方法を制御します。タグの効果は、VPC CNI が新しい ENI を作成するか、既存の ENI を照合するかによって異なります。

**重要**  
クラスタースコープおよび除外タグ付けメカニズムは、VPC CNI のバージョン `v1.22.2` 以降でのみ使用できます。このバージョンより前のバージョンでは、標準のオプトイン動作のみがタグ `kubernetes.io/role/cni=1` を介して使用できます。

### タグ値
<a name="cni-subnet-selection-tag-values"></a>

次の表は、各タグ値がサブネットの動作にどのように影響するかをまとめたものです。


| タグ値 | 新しい ENI の作成 | 既存の ENI の調整 | 
| --- | --- | --- | 
|  `1`  |  **オプトイン**: VPC CNI はこのサブネットに新しい ENI を作成します。 | ENI は Pod IP 割り当てに引き続き使用できます。 | 
|  `0`  |  **除外**: VPC CNI は、このサブネットに新しい ENI を作成しません。 |  **除外**: VPC CNI は、このサブネット内の既存の ENI を Pod IP 割り当てから除外します。この ENI から新しい Pod IP は割り当てられません。 | 
| なし (タグなし) |  **新しい ENI には使用されない**: VPC CNI は、新しい ENI の作成用のタグのないセカンダリサブネットを選択しません。プライマリサブネット (ノードが起動したサブネット) は、下位互換性のために、タグがなくても新しい ENI の作成に使用されます。 |  **中断なし**: タグなしサブネットの既存の ENI は、Pod IP 割り当てに引き続き使用できます。VPC CNI は、これらの ENI を削除または除外しません。 | 

### 作成と調整の動作
<a name="cni-subnet-selection-creation-vs-reconciliation"></a>

VPC CNI は、新しい ENI を作成する場合と既存の ENI を調整する場合とで、意図的に異なるポリシーを適用します。
+  **作成 (セカンダリサブネットではフェイルクローズ)**: VPC CNI が新しいセカンダリ ENI を作成する必要がある場合、`kubernetes.io/role/cni=1` で明示的にタグ付けされたセカンダリサブネットのみを使用します。タグ付けされていないセカンダリサブネットは、新しい ENI の作成には選択されません。これにより、新しいネットワークインターフェイスは、管理者が明示的に承認したサブネットにのみ配置されます。
+  **調整 (タグのないサブネットの場合はフェイルオープン)**: VPC CNI がノードに既にアタッチされている既存の ENI を起動または調整するときに、サブネットに `kubernetes.io/role/cni` タグがないことを理由に ENI を除外しません。これにより、これらの ENI の IP アドレスを既に使用している実行中の Pod が中断されるのを防ぎます。

VPC CNI はこの設計を意図的に使用します。タグ付けされていないサブネットから既にアタッチされている ENI を強制的に除外すると、その ENI から現在 IP アドレスを使用している Pod が破壊されます。

**重要**  
サブネットが既存の ENI を含む新しい Pod IP を提供できないようにするには、`kubernetes.io/role/cni=0` でサブネットにタグ付けします。タグがないと、そのサブネットへの**新しい** ENI の作成のみが防止されます。既存の ENI を割り当てから除外しません。

### プライマリサブネットの処理
<a name="cni-subnet-selection-primary-subnet"></a>

VPC CNI には、`kubernetes.io/role/cni` タグがない場合でも、ENI 作成用のノードのプライマリサブネット (ノードが起動したサブネット) が常に含まれます。これにより、既存のクラスターとの下位互換性が維持されます。プライマリサブネットの動作:
+ タグの有無に関係なく、ENI 作成に含まれます (`0` がタグ付けされている場合を除く)。
+ `kubernetes.io/role/cni=0` でタグ付けされている場合、VPC CNI は新しい ENI 作成と既存の ENI 割り当ての両方からプライマリサブネットを除外します。

### クラスタースコープのサブネットフィルタリング
<a name="cni-subnet-selection-cluster-tags"></a>

`kubernetes.io/role/cni=1` でサブネットにタグ付けされている場合、VPC CNI はさらにキー形式 `cni.networking.k8s.aws/cluster/<cluster-name>` を使用してクラスター固有のタグをチェックします。サブネットにこの形式のクラスタータグがある場合、名前が一致するクラスターのみがそのサブネットを使用します。`kubernetes.io/role/cni=1` を持ち、クラスター固有のタグを持たないサブネットは、VPC 内のすべてのクラスターで使用できます。

例えば、サブネットを特定のクラスターに制限するには:

```
aws ec2 create-tags --resources subnet-example \
  --tags Key=kubernetes.io/role/cni,Value=1 Key=cni.networking.k8s.aws/cluster/my-cluster,Value=shared
```

これは、複数の EKS クラスターが VPC を共有し、各クラスターで Pod IP アドレスに異なるサブネットを使用する場合に便利です。

## 推奨されるワークフロー
<a name="cni-subnet-selection-workflow"></a>

Pod IP アドレスに新しいサブネットを追加するには:

1. ノードと同じ VPC とアベイラビリティーゾーンに新しいサブネットを作成します。

1. `kubernetes.io/role/cni=1` でサブネットにタグ付けします。

1. サブネットに適切なルートテーブルとネットワーク ACL があることを確認します。

1. VPC CNI が新しいサブネットを検出し、使用を開始することを確認します。

Pod IP 割り当てからサブネットを削除するには:

1. `kubernetes.io/role/cni=0` でサブネットにタグ付けします。

1. そのサブネットの IP を使用しているポッドが自然に終了または再スケジュールされるまで待ちます。

1. VPC CNI がそのサブネット内の ENI からの新しい Pod IP の割り当てを停止することを確認します。

**重要**  
サブネットの使用を停止するには、`kubernetes.io/role/cni` タグを削除しないでください。タグを削除すると新しい ENI は作成されなくなりますが、既存の ENI は割り当てから除外**されません**。サブネットをアクティブに除外するには、`kubernetes.io/role/cni=0` でタグ付けします。

## 考慮事項
<a name="cni-subnet-selection-considerations"></a>
+ 拡張サブネット検出には、Amazon VPC CNI バージョン 1.18.0 以降が必要です。
+ この機能には、VPC CNI IAM ロールの `ec2:DescribeSubnets` アクセス許可が必要です。`AmazonEKS_CNI_Policy` マネージドポリシーにそのアクセス許可が含まれています。IPv6 セルフマネージド IAM ポリシーにはそれは含まれて**いません**。セルフマネージド IAM ポリシー (IPv6 クラスターなど) を使用する場合は、`ec2:DescribeSubnets` を手動で追加してサブネット検出を有効にします。
+ この機能は、セカンダリ IP アドレスモードとプレフィックス委任モードの両方で機能します。
+ 検出されたすべてのサブネットは、ノードと同じ VPC にある必要があります。
+ VPC CNI は、ノードと同じアベイラビリティーゾーンにあるサブネットにのみ ENI を作成します。
+ VPC CNI は、タグの変更に関係なく、Pod に割り当てられた IP アドレスがまだある ENI の割り当てを解除しません。
+ 共有 VPC (クロスアカウントサブネット) を使用する場合は、クラスターが起動される参加者アカウントのサブネットにタグ付けします。
+ 拡張サブネット検出は、Pod のセキュリティグループ、ネットワークポリシー、プレフィックス委任、および SNAT とともに使用できます。