

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

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

# Kubernetes ネットワークポリシーを使用して Pod ネットワークトラフィックを制限する
<a name="cni-network-policy-configure"></a>

Kubernetes ネットワークポリシーを使用して、自分の Pod 間で送受信されるネットワークトラフィックを制限できます。詳細については、Kubernetes ドキュメントの「[ネットワークポリシー](https://kubernetes.io/docs/concepts/services-networking/network-policies/)」を参照してください。

この機能を使用するには以下を設定する必要があります：

1. Pod 起動時のポリシーの適用を設定します。これは VPC CNI `DaemonSet` の `aws-node` コンテナでできます。

1. アドオンのネットワークポリシーパラメータを有効にします。

1. Kubernetes ネットワークポリシーを使用するようにクラスターを設定します。

開始する前に、考慮事項を確認してください。詳細については「[考慮事項](cni-network-policy.md#cni-network-policy-considerations)」を参照してください。

## 前提条件
<a name="cni-network-policy-prereqs"></a>

この機能の前提条件は次のとおりです。

### 最小クラスターバージョン
<a name="cni-network-policy-minimum"></a>

既存の Amazon EKS クラスター。デプロイするには「[Amazon EKS の使用を開始する](getting-started.md)」を参照してください。クラスターは、次の表に示す Kubernetes バージョンとプラットフォームバージョンのいずれかを実行している必要があります。一覧にあるバージョンより後の Kubernetes とプラットフォームのバージョンもサポートされることにご注意ください。現在の Kubernetes バージョンを確認するには、次のコマンドの *my-cluster* をクラスターの名前に置き換えて、変更したコマンドを実行します。

```
aws eks describe-cluster --name my-cluster --query cluster.version --output text
```


| Kubernetes バージョン | プラットフォームバージョン | 
| --- | --- | 
|   `1.27.4`   |   `eks.5`   | 
|   `1.26.7`   |   `eks.6`   | 

### 最小 VPC CNI バージョン
<a name="cni-network-policy-minimum-vpc"></a>

標準 Kubernetes ネットワークポリシーと管理者ネットワークポリシーの両方を作成するには、VPC CNI プラグインのバージョン `1.21` を実行する必要があります。現在のバージョンは、次のコマンドで確認できます。

```
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
```

バージョンが `1.21` より前の場合は、[Amazon VPC CNI を更新する (Amazon EKS アドオン)](vpc-add-on-update.md) を確認してバージョン `1.21` 以降にアップグレードしてください。

### 最小 Linux カーネルバージョン
<a name="cni-network-policy-minimum-linux"></a>

ノードにはバージョン `5.10` 以降の Linux カーネルが必要です。カーネルのバージョンは、`uname -r` で確認できます。Amazon EKS 最適化 Amazon Linux、Amazon EKS 最適化高速 Amazon Linux AMI、と Bottlerocket AMI の最新バージョンを使用している場合、既に必要なカーネルバージョンがインストールされています。

Amazon EKS 最適化高速 Amazon Linux AMI `v20231116` バージョン以降には、カーネルバージョン `5.10` があります。

## ステップ 1: Pod 起動時のポリシーの適用を設定する
<a name="cni-network-policy-configure-policy"></a>

Amazon VPC CNI plugin for Kubernetes はポッドのプロビジョニングと並行して、ポッドのネットワークポリシーを設定します。新しいポッドにすべてのポリシーが設定されるまで、新しいポッドのコンテナは*デフォルトの許可ポリシー*で起動します。これは*標準モード*と呼ばれます。デフォルトの許可ポリシーはすべての ingress トラフィックと egress トラフィックが新しいポッドとの間で許可されることを意味します。例えば、新しいポッドがアクティブなポリシーで更新されるまで、ポッドにはファイアウォールルールが適用されません (すべてのトラフィックが許可されます)。

変数 `NETWORK_POLICY_ENFORCING_MODE` を `strict` に設定すると、VPC CNI を使用するポッドは*デフォルトの拒否ポリシー*で起動し、その後ポリシーが設定されます。これは *Strict モード*と呼ばれます。Strict モードではポッドがクラスター内でアクセスする必要があるすべてのエンドポイントにネットワークポリシーが必要です。この要件は CoreDNS ポッドに適用されることに注意してください。デフォルトの拒否ポリシーはホストネットワークを使用するポッドには設定されていません。

このデフォルトのネットワークポリシーはVPC CNI `DaemonSet` の `aws-node` コンテナで環境変数 `NETWORK_POLICY_ENFORCING_MODE` を `strict` に設定することで変更できます。

```
env:
  - name: NETWORK_POLICY_ENFORCING_MODE
    value: "strict"
```

## ステップ 2: アドオンのネットワークポリシーパラメータを有効にする
<a name="enable-network-policy-parameter"></a>

ネットワークポリシー機能はデフォルトでノード上のポート `8162` をメトリクスに使用します。また、この機能はヘルスプローブにポート `8163` を使用します。そのノード上、またはこれらのポートを使用する必要があるポッド内で他のアプリケーションを実行すると、そのアプリは実行できません。VPC CNI バージョン `v1.14.1` 以降で、これらのポートを変更できます。

アドオンのネットワークポリシーパラメータを有効にするには次の手順に従います。

### AWS マネジメントコンソール
<a name="cni-network-policy-console"></a>

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで、**[クラスター]** を選択し、 Amazon VPC CNI アドオンを設定するクラスターの名前を選択してください。

1. **[アドオン]** タブを選択してください。

1. アドオンボックスの右上にあるボックスを選択し、次に **[編集]** を選択してください。

1. **[`Amazon VPC CNI` を設定]** ページで、次の操作を行います：

   1. **[バージョン]** リストで `v1.14.0-eksbuild.3` 以降のバージョンを選択してください。

   1. **[オプションの構成設定]** を展開します。

   1. **[設定値]** に JSON キー `"enableNetworkPolicy":` と値 `"true"` を入力します。結果のテキストは有効な JSON オブジェクトでなければなりません。このキーと値だけがテキストボックス内のデータである場合はキーと値を中括弧 `{ }` で囲みます。

      次の例ではネットワークポリシー機能が有効になっており、メトリクスとヘルスプローブがデフォルトのポート番号に設定されています：

      ```
      {
          "enableNetworkPolicy": "true",
          "nodeAgent": {
              "healthProbeBindAddr": "8163",
              "metricsBindAddr": "8162"
          }
      }
      ```

### Helm
<a name="cni-network-helm"></a>

`helm` を通して Amazon VPC CNI plugin for Kubernetes をインストールしている場合、設定を更新してポートを変更できます。

1. 次に、以下のコマンドを実行して、ポートを変更します。キー `nodeAgent.metricsBindAddr` または キー `nodeAgent.healthProbeBindAddr` の値にそれぞれポート番号を設定します。

   ```
   helm upgrade --set nodeAgent.metricsBindAddr=8162 --set nodeAgent.healthProbeBindAddr=8163 aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
   ```

### kubectl
<a name="cni-network-policy-kubectl"></a>

1. エディターで `aws-node``DaemonSet` を開きます。

   ```
   kubectl edit daemonset -n kube-system aws-node
   ```

1. VPC CNI `aws-node` デーモンセットマニフェストの `aws-network-policy-agent` コンテナで、以下の `args:` のコマンド引数でポート番号を置き換えます。

   ```
       - args:
               - --metrics-bind-addr=:8162
               - --health-probe-bind-addr=:8163
   ```

## ステップ 3: Kubernetes ネットワークポリシーを使用するようにクラスターを設定する
<a name="cni-network-policy-setup"></a>

これはAmazon EKS アドオンまたはセルフマネージドアドオンに対して設定できます。

### Amazon EKS アドオン
<a name="cni-network-policy-setup-procedure-add-on"></a>

AWS CLI を使用すると、次のコマンドを実行して、Kubernetes ネットワークポリシーを使用するようにクラスターを設定できます。`my-cluster` をクラスターの名前に置き換え、IAM ロール ARN を使用するロールに置き換えます。

```
aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.14.0-eksbuild.3 \
    --service-account-role-arn arn:aws:iam::123456789012:role/AmazonEKSVPCCNIRole \
    --resolve-conflicts PRESERVE --configuration-values '{"enableNetworkPolicy": "true"}'
```

AWS マネジメントコンソールを使用してこれを設定するには、以下の手順に従います。

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで、**[クラスター]** を選択し、 Amazon VPC CNI アドオンを設定するクラスターの名前を選択してください。

1. **[アドオン]** タブを選択してください。

1. アドオンボックスの右上にあるボックスを選択し、次に **[編集]** を選択してください。

1. **[`Amazon VPC CNI` を設定]** ページで、次の操作を行います：

   1. **[バージョン]** リストで `v1.14.0-eksbuild.3` 以降のバージョンを選択してください。

   1. **[オプションの構成設定]** を展開します。

   1. **[設定値]** に JSON キー `"enableNetworkPolicy":` と値 `"true"` を入力します。結果のテキストは有効な JSON オブジェクトでなければなりません。このキーと値だけがテキストボックス内のデータである場合はキーと値を中括弧 `{ }` で囲みます。次の例はネットワークポリシーが有効になっていることを示しています：

      ```
      { "enableNetworkPolicy": "true" }
      ```

      次のスクリーンショットはこのシナリオの例を示しています。  
![\[オプション設定でネットワークポリシーが設定されている VPC CNI アドオンを示す <shared id="consolelong"/>。\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/console-cni-config-network-policy.png)

### セルフマネージド型アドオン
<a name="cni-network-policy-setup-procedure-self-managed-add-on"></a>

`helm` を通して Amazon VPC CNI plugin for Kubernetes をインストールしている場合、設定を更新してネットワークポリシーを有効にできます。

1. 次のコマンドを実行してネットワークポリシーを有効にします。

   ```
   helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
   ```

1. エディターで `amazon-vpc-cni``ConfigMap` を開きます。

   ```
   kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
   ```

1. 次の行を `ConfigMap` の`data`に追加します。

   ```
   enable-network-policy-controller: "true"
   ```

   行を追加すると、`ConfigMap` は次の例のようになるはずです。

   ```
   apiVersion: v1
    kind: ConfigMap
    metadata:
     name: amazon-vpc-cni
     namespace: kube-system
    data:
     enable-network-policy-controller: "true"
   ```

1. エディターで `aws-node``DaemonSet` を開きます。

   ```
   kubectl edit daemonset -n kube-system aws-node
   ```

   1. VPC CNI `aws-node` デーモンセットマニフェストの `aws-network-policy-agent` コンテナで、`args:` のコマンド引数 `--enable-network-policy=false` の `false` を `true` に置き換えます。

      ```
           - args:
              - --enable-network-policy=true
      ```

## ステップ 4. 次のステップ
<a name="cni-network-policy-setup-procedure-confirm"></a>

設定が完了したら、`aws-node` ポッドがクラスターで実行されていることを確認します。

```
kubectl get pods -n kube-system | grep 'aws-node\|amazon'
```

出力例は次のとおりです。

```
aws-node-gmqp7                                          2/2     Running   1 (24h ago)   24h
aws-node-prnsh                                          2/2     Running   1 (24h ago)   24h
```

バージョン `1.14` 以降の `aws-node` ポッドには 2 つのコンテナがあります。以前のバージョンではネットワークポリシーが無効になっている場合、`aws-node` ポッドにコンテナは 1 つしか存在しません。

これで、Kubernetes ネットワークポリシーをクラスターにデプロイできます。

Kubernetes ネットワークポリシーを実装するために、Kubernetes の `NetworkPolicy` オブジェクトまたは `ClusterNetworkPolicy` オブジェクトを作成してクラスターにデプロイできます。`NetworkPolicy` オブジェクトの範囲は名前空間に限定されますが、`ClusterNetworkPolicy` オブジェクトの範囲はクラスター全体または複数の名前空間に限定できます。ラベルセレクター、名前空間、および IP アドレス範囲に基づいて、Pod 間のトラフィックを許可または拒否するポリシーを実装します。`NetworkPolicy` オブジェクトの作成の詳細については Kubernetes ドキュメントの「[ネットワークポリシー](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)」を参照してください。

Kubernetes `NetworkPolicy` オブジェクトの適用は、Extended Berkeley Packet Filter (eBPF) を使用して実装されます。`iptables` をベースにした実装に関連して、CPU 使用率の低下やシーケンシャルルックアップの回避など、低レイテンシーを実現し、パフォーマンス特性を発揮します。さらに、eBPF プローブは、複雑なカーネルレベルの問題のデバッグやオブザーバビリティの向上に役立つ、コンテキスト豊富なデータへのアクセスを提供します。Amazon EKS は、プローブを利用して各ノードのポリシー結果をログに記録し、そのデータを外部のログコレクターにエクスポートしてデバッグに役立てる eBPF ベースのエクスポーターをサポートしています。詳細については「[eBPFドキュメント](https://ebpf.io/what-is-ebpf/#what-is-ebpf)」を参照してください。