このページの改善にご協力ください
このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。
Kubernetes ネットワークポリシーを使用して Pod ネットワークトラフィックを制限する
Kubernetes ネットワークポリシーを使用して、自分の Pod 間で送受信されるネットワークトラフィックを制限できます。詳細については、Kubernetes ドキュメントの「ネットワークポリシー
この機能を使用するには以下を設定する必要があります:
-
Pod 起動時のポリシーの適用を設定します。これは VPC CNI
DaemonSetのaws-nodeコンテナでできます。 -
アドオンのネットワークポリシーパラメータを有効にします。
-
Kubernetes ネットワークポリシーを使用するようにクラスターを設定します。
開始する前に、考慮事項を確認してください。詳細については「考慮事項」を参照してください。
前提条件
この機能の前提条件は次のとおりです。
最小クラスターバージョン
既存の Amazon EKS クラスター。デプロイするには「Amazon EKS の使用を開始する」を参照してください。クラスターは、次の表に示す Kubernetes バージョンとプラットフォームバージョンのいずれかを実行している必要があります。一覧にあるバージョンより後の Kubernetes とプラットフォームのバージョンもサポートされることにご注意ください。現在の Kubernetes バージョンを確認するには、次のコマンドの my-cluster をクラスターの名前に置き換えて、変更したコマンドを実行します。
aws eks describe-cluster --name my-cluster --query cluster.version --output text
| Kubernetes バージョン | プラットフォームバージョン |
|---|---|
|
|
|
|
|
|
最小 VPC CNI バージョン
クラスター上の Amazon VPC CNI plugin for Kubernetes のバージョン 1.14 以降。現在のバージョンは、次のコマンドで確認できます。
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
バージョンが 1.14 より前の場合は、Amazon VPC CNI を更新する (Amazon EKS アドオン) を確認してバージョン 1.14 以降にアップグレードしてください。
最小 Linux カーネルバージョン
ノードにはバージョン 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 起動時のポリシーの適用を設定する
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: アドオンのネットワークポリシーパラメータを有効にする
ネットワークポリシー機能はデフォルトでノード上のポート 8162 をメトリクスに使用します。また、この機能はヘルスプローブにポート 8163 を使用していました。そのノード上、またはこれらのポートを使用する必要があるポッド内で他のアプリケーションを実行すると、そのアプリは実行できません。VPC CNI バージョン v1.14.1 以降ではこれらのポートを変更できます。
アドオンのネットワークポリシーパラメータを有効にするには次の手順に従います。
AWS マネジメントコンソール
-
Amazon EKS コンソール
を開きます。 -
左のナビゲーションペインで、[クラスター] を選択し、 Amazon VPC CNI アドオンを設定するクラスターの名前を選択してください。
-
[アドオン] タブを選択してください。
-
アドオンボックスの右上にあるボックスを選択し、次に [編集] を選択してください。
-
[
Amazon VPC CNIを設定] ページで、次の操作を行います:-
[バージョン] リストで
v1.14.0-eksbuild.3以降のバージョンを選択してください。 -
[オプションの構成設定] を展開します。
-
[設定値] に JSON キー
"enableNetworkPolicy":と値"true"を入力します。結果のテキストは有効な JSON オブジェクトでなければなりません。このキーと値だけがテキストボックス内のデータである場合はキーと値を中括弧{ }で囲みます。次の例ではネットワークポリシー機能が有効になっており、メトリクスとヘルスプローブがデフォルトのポート番号に設定されています:
{ "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } }
-
Helm
helm を通して Amazon VPC CNI plugin for Kubernetes をインストールしている場合、設定を更新してポートを変更できます。
-
次に、以下のコマンドを実行して、ポートを変更します。キー
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
-
エディターで
aws-nodeDaemonSetを開きます。kubectl edit daemonset -n kube-system aws-node -
VPC CNI
aws-nodeデーモンセットマニフェストのaws-network-policy-agentコンテナで、以下のargs:のコマンド引数でポート番号を置き換えます。- args: - --metrics-bind-addr=:8162 - --health-probe-bind-addr=:8163
ステップ 3: Kubernetes ネットワークポリシーを使用するようにクラスターを設定する
これはAmazon EKS アドオンまたはセルフマネージドアドオンに対して設定できます。
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 マネジメントコンソールを使用してこれを設定するには、以下の手順に従います。
-
Amazon EKS コンソール
を開きます。 -
左のナビゲーションペインで、[クラスター] を選択し、 Amazon VPC CNI アドオンを設定するクラスターの名前を選択してください。
-
[アドオン] タブを選択してください。
-
アドオンボックスの右上にあるボックスを選択し、次に [編集] を選択してください。
-
[
Amazon VPC CNIを設定] ページで、次の操作を行います:-
[バージョン] リストで
v1.14.0-eksbuild.3以降のバージョンを選択してください。 -
[オプションの構成設定] を展開します。
-
[設定値] に JSON キー
"enableNetworkPolicy":と値"true"を入力します。結果のテキストは有効な JSON オブジェクトでなければなりません。このキーと値だけがテキストボックス内のデータである場合はキーと値を中括弧{ }で囲みます。次の例はネットワークポリシーが有効になっていることを示しています:{ "enableNetworkPolicy": "true" }次のスクリーンショットはこのシナリオの例を示しています。
-
Helm
helm を通して Amazon VPC CNI plugin for Kubernetes をインストールしている場合、設定を更新してネットワークポリシーを有効にできます。
-
次のコマンドを実行してネットワークポリシーを有効にします。
helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
-
エディターで
amazon-vpc-cniConfigMapを開きます。kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml -
次の行を
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" -
エディターで
aws-nodeDaemonSetを開きます。kubectl edit daemonset -n kube-system aws-node-
VPC CNI
aws-nodeデーモンセットマニフェストのaws-network-policy-agentコンテナで、args:のコマンド引数--enable-network-policy=falseのfalseをtrueに置き換えます。- args: - --enable-network-policy=true
-
ステップ 4. 次のステップ
設定が完了したら、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 オブジェクトを作成して、クラスターにデプロイします。NetworkPolicy オブジェクトは名前空間に限定されます。ラベルセレクター、名前空間、および IP アドレス範囲に基づいて、Pod 間のトラフィックを許可または拒否するポリシーを実装します。NetworkPolicy オブジェクトの作成の詳細については Kubernetes ドキュメントの「ネットワークポリシー
Kubernetes NetworkPolicy オブジェクトの適用は、Extended Berkeley Packet Filter (eBPF) を使用して実装されます。iptables をベースにした実装に関連して、CPU 使用率の低下やシーケンシャルルックアップの回避など、低レイテンシーを実現し、パフォーマンス特性を発揮します。さらに、eBPF プローブは、複雑なカーネルレベルの問題のデバッグやオブザーバビリティの向上に役立つ、コンテキスト豊富なデータへのアクセスを提供します。Amazon EKS は、プローブを利用して各ノードのポリシー結果をログに記録し、そのデータを外部のログコレクターにエクスポートしてデバッグに役立てる eBPF ベースのエクスポーターをサポートしています。詳細については「eBPFドキュメント