ポッドのセキュリティグループ - Amazon EKS

ポッドのセキュリティグループ

ポッドのセキュリティグループは、Amazon EC2 セキュリティグループを Kubernetes ポッドと統合します。Amazon EC2 セキュリティグループを使用して、多くの Amazon EC2 インスタンスタイプと Fargate で実行されているノードにデプロイするポッドとの間で送受信されるネットワークトラフィックを許可するルールを定義できます。この機能の詳細な説明については、「ポッドのセキュリティグループの紹介」のブログを参照してください。

Considerations

ポッドのセキュリティグループをデプロイする前に、次の制限と条件を考慮してください。

  • Amazon EKS クラスターでは、Kubernetes バージョン 1.17 および Amazon EKS プラットフォームバージョン eks.3 以降が実行されている必要があります。Amazon EC2 にデプロイした Kubernetes クラスターのポッドにはセキュリティグループを使用できません。

  • 関連付けられたセキュリティグループを持つポッドとの間のトラフィックフローに、Calico ネットワークポリシーは適用されず、Amazon EC2 セキュリティグループの適用のみに限定されます。この制限を取り除くために、コミュニティの取り組みが進行中です。

  • AWS Fargate で実行中のポッドに関して、ポッドのセキュリティグループを使用できるのは、クラスターが 1.18 のプラットフォームバージョンeks.7 またはそれ以降、1.19 のプラットフォームバージョン eks.5 またはそれ以降、または 1.20 以降の場合に限ります。

  • ポッドのセキュリティグループは Windows ノードでは使用できません。

  • ポッドのセキュリティグループは、m5c5r5p3m6gc6g、および r6g インスタンスファミリーを含むほとんどの Nitro ベースの Amazon EC2 インスタンスファミリーでサポートされています。t3 インスタンスファミリーはサポートされていません。サポートされるインスタンスの完全なリストについては、「Amazon EC2 がサポートするインスタンスとブランチネットワークインターフェイス」を参照してください。ノードは、サポートされているいずれかのインスタンスタイプである必要があります。

  • アウトバウンドセキュリティグループルールが適用されるように、セキュリティグループが割り当てられたポッドからのアウトバウンドトラフィックに対してソース NAT が無効になります。インターネットにアクセスするには、セキュリティグループが割り当てられたポッドを、NAT ゲートウェイまたはインスタンスで構成されたプライベートサブネットにデプロイされたノードで起動する必要があります。パブリックサブネットにデプロイされたセキュリティグループが割り当てられたポッドは、インターネットにアクセスできません。

  • externalTrafficPolicyLocal に設定したインスタンスターゲットを使用しているタイプ NodePortLoadBalancer の Kubernetes サービスは、セキュリティグループを割り当てる ポッドではサポートされません。インスタンスターゲットでのロードバランサーの使用の詳細については、「Amazon EKS でのネットワーク負荷分散」を参照してください。

  • ポッドのセキュリティポリシーを使用してポッド変更へのアクセスを制限している場合は、eks-vpc-resource-controller および vpc-resource-controller Kubernetes サービスアカウントは、psp が割り当てられた Role に対して Kubernetes ClusterRoleBinding で指定する必要があります。デフォルトの Amazon EKS の psp、Role、および ClusterRoleBinding を使用している場合、これは eks:podsecuritypolicy:authenticated ClusterRoleBinding です。例えば、次の例に示すように、サービスアカウントをセクション subjects: に追加します。

    ... subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated - kind: ServiceAccount name: vpc-resource-controller - kind: ServiceAccount name: eks-vpc-resource-controller
  • カスタムネットワークとポッドのセキュリティグループを組み合わせて使用している場合、ENIconfig で指定されたセキュリティグループではなく、ポッドのセキュリティグループによって指定されたセキュリティグループが使用されます。

  • セキュリティグループを使用するポッドには、ポッド仕様に terminationGracePeriodSeconds が含まれている必要があります。これは、Amazon EKS VPC CNI プラグインが API サーバーに問い合わせて、ホスト上のポッドネットワークを削除する前にポッド IP アドレスを取得するためです。この設定がないと、プラグインはホスト上のポッドネットワークを削除しません。

ポッドのセキュリティグループをデプロイする

ポッドのセキュリティグループをデプロイするには

  1. Fargate ポッドでのみセキュリティグループを使用し、クラスターに Amazon EC2 ノードがない場合は、ステップ 4 に進みます。次のコマンドを使用して、現在の CNI プラグインのバージョンをチェックします。

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    出力は次の例のようになります。

    amazon-k8s-cni:<1.7.7>

    CNI プラグインのバージョンが 1.7.7 より前の場合は、CNI プラグインをバージョン 1.7.7 以降に更新してください。詳細については、「Amazon VPC CNI Amazon EKS アドオンの更新」を参照してください。

  2. AmazonEKSVPCResourceController マネージドポリシーを Amazon EKS クラスターに関連付けられているクラスターのロールに追加します。ポリシーにより、ロールはネットワークインターフェイス、プライベート IP アドレス、インスタンスへのアタッチメントとデタッチメントを管理できます。次のコマンドでは、<eksClusterRole> という名前のクラスターロールにこのポリシーを追加します。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. CNI プラグインを有効にしてポッドのネットワークインターフェイスを管理するには、aws-node デーモンセットで ENABLE_POD_ENI 変数を true に設定します。この設定が true になると、クラスター内の各ノードについて、プラグインは値が vpc.amazonaws.com/has-trunk-attached=true のラベルを追加します。VPC リソースコントローラーは、1 つの特別なネットワークインターフェイスを作成してアタッチします。これは、トランクネットワークインターフェイスと呼ばれ、説明は aws-k8s-trunk-eni です。

    kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true
    注記

    トランクネットワークインターフェイスは、インスタンスタイプでサポートされているネットワークインターフェイスの最大数に含まれます。各インスタンスタイプによりサポートされるインターフェイスの最大数のリストについては、Amazon EC2 Linux インスタンス用ユーザーガイドの「各インスタンスタイプのネットワークインターフェイスあたりの IP アドレス数」を参照してください。ノードにすでに最大数の標準ネットワークインターフェイスがアタッチされている場合、VPC リソースコントローラーはスペースを予約します。コントローラーが標準ネットワークインターフェイスをデタッチして削除し、トランクネットワークインターフェイスを作成し、インスタンスにアタッチできるように、実行中のポッドをスケールダウンする必要があります。

    true に設定されている aws-k8s-trunk-eni がどのノードにあるか、次のコマンドで確認できます。

    kubectl get nodes -o wide -l vpc.amazonaws.com/has-trunk-attached=true

    トランクネットワークインターフェイスが作成されると、ポッドにトランクネットワークインターフェイスまたは標準ネットワークインターフェイスからセカンダリ IP アドレスを割り当てることができます。ノードが削除されると、トランクインターフェイスは自動的に削除されます。

    後のステップでポッドのセキュリティグループをデプロイすると、VPC リソースコントローラーはブランチネットワークインターフェイスと呼ばれる特別のインターフェイスを aws-k8s-branch-eni の説明とともに作成し、セキュリティグループを関連付けます。ノードにアタッチされた標準ネットワークインターフェイスとトランクネットワークインターフェイスに加えて、ブランチネットワークインターフェイスが作成されます。Liveness プローブまたは Readiness プローブを使用している場合は、TCP Early Demux も無効にする必要があります。これにより、kubelet は TCP 経由でブランチネットワークインターフェイス上のポッドに接続できます。TCP Early Demux を無効にするには、次のコマンドを実行します。

    kubectl patch daemonset aws-node \ -n kube-system \ -p '{"spec": {"template": {"spec": {"initContainers": [{"env":[{"name":"DISABLE_TCP_EARLY_DEMUX","value":"true"}],"name":"aws-vpc-cni-init"}]}}}}'
  4. リソースをデプロイする 名前空間を作成します。

    kubectl create namespace <my-namespace>
  5. Amazon EKS SecurityGroupPolicy をクラスターにデプロイします。

    1. 次のセキュリティポリシーの例を、<my-security-group-policy.yaml> という名前のファイルに保存します。podSelectorserviceAccountSelector に置き換えると、サービスアカウントのラベルに基づいてポッドを選択することができます。セレクターをどちらか 1 つ指定する必要があります。podSelector が空 (例: podSelector: {}) であると、名前空間内のすべてのポッドが選択されます。serviceAccountSelector が空であると、名前空間内のすべてのサービスアカウントが選択されます。groupIds には、1~5 個のセキュリティグループ ID を指定する必要があります。複数の ID を指定した場合、すべてのセキュリティグループ内のすべてのルールの組み合わせが、選択したポッドに対して有効になります。

      apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: <my-security-group-policy> namespace: <my-namespace> spec: podSelector: matchLabels: role: <my-role> securityGroups: groupIds: - <sg-abc123>
      重要
      • ポリシーで指定するセキュリティグループが存在している必要があります。存在しない場合、セレクターに一致するポッドをデプロイすると、ポッドは作成プロセスでスタックしたままになります。ポッドの説明を書き込むと、次のようなエラーメッセージが表示されます: An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '<sg-abc123>' does not exist

      • セキュリティグループは、プローブを設定した任意のポート経由のクラスターセキュリティグループ (kubelet の場合) からのインバウンド通信を許可する必要があります。

      • セキュリティグループは、TCP および UDP ポート 53 経由のクラスターセキュリティグループ (CoreDNS の場合) へのアウトバウンド通信を許可する必要があります。クラスターセキュリティグループは、ポッドに関連付けられている最低 1 つのセキュリティグループからの、ポート 53 でのインバウンド TCP (および UDP) による通信も許可する必要があります。

      • Fargate でセキュリティグループポリシーを使用している場合は、セキュリティグループに、ポッドと Kubernetes コントロールプレーンとの通信を許可するルールを含めます。最も簡単な方法は、クラスターセキュリティグループをセキュリティグループの 1 つとして指定することです。

    2. ポリシーをデプロイします。

      kubectl apply -f my-security-group-policy.yaml
  6. 前のステップで指定した <podSelector><my-role> の値に一致するラベルを持つサンプルアプリケーションをデプロイします。

    1. 次の内容をファイルに保存します。

      apiVersion: apps/v1 kind: Deployment metadata: name: <my-deployment> namespace: <my-namespace> labels: app: <my-app> spec: replicas: <1> selector: matchLabels: app: <my-app> template: metadata: labels: app: <my-app> role: <my-role> spec: containers: - name: <my-container> image: <my-image> ports: - containerPort: <80>
    2. 次のコマンドを使用して、アプリケーションをデプロイします。アプリケーションをデプロイすると、CNI プラグインは role ラベルと一致し、前のステップで指定したセキュリティグループがポッドに適用されます。

      kubectl apply -f my-security-group-policy.yaml
      注記
      • ポッドが Waiting 状態にスタックし、ポッドの記述時に Insufficient permissions: Unable to create Elastic Network Interface. が表示された場合、前のステップで IAM クラスターロールに IAM ポリシーを追加したことを確認します。

      • ポッドが Pending 状態にスタックした場合、ノードのインスタンスタイプが Amazon EC2 がサポートするインスタンスとブランチネットワークインターフェイス のリストに含まれていることと、インスタンスタイプでサポートされるブランチネットワークインターフェイスの最大数とノードグループ内のノード数を乗算した数にまだ達していないことを確認します。例えば、m5.large インスタンスは、9 つのブランチネットワークインターフェイスをサポートします。ノードグループに 5 つのノードがある場合、ノードグループに対して最大 45 のブランチネットワークインターフェイスを作成できます。46 番目のポッドをデプロイしようとすると、セキュリティグループに関連付けられた別のポッドが削除されるまで Pending 状態のままになります。

      kubectl describe pod <my-deployment-xxxxxxxxxx-xxxxx> -n <my-namespace> を実行したときに次のようなメッセージが表示されている場合は、無視しても問題ありません。このメッセージは、CNI プラグインがホストネットワークの設定を試み、ネットワークインターフェイスの作成中に失敗したときに表示される場合があります。CNI プラグインは、ネットワークインターフェイスが作成されるまで、このイベントをログに記録します。

      Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "<e24268322e55c8185721f52df6493684f6c2c3bf4fd59c9c121fd4cdc894579f>" network for pod "<my-deployment-59f5f68b58-c89wx>": networkPlugin cni failed to set up pod "<my-deployment-59f5f68b58-c89wx_my-namespace>" network: add cmd: failed to assign an IP address to container

      インスタンスタイプで実行できるポッドの最大数を超えることはできません。各インスタンスタイプで実行できるポッドの最大数の一覧については、GitHub の「eni-max-pods.txt」を参照してください。セキュリティグループが関連付けられているポッドを削除するか、ポッドが実行されているノードを削除すると、VPC リソースコントローラーによってブランチネットワークインターフェイスが削除されます。セキュリティグループ用ポッドを使用してポッドを含むクラスターを削除した場合、コントローラーはブランチネットワークインターフェイスを削除しないため、自分で削除する必要があります。

Amazon EC2 がサポートするインスタンスとブランチネットワークインターフェイス

次の表に、サポートされている各 Amazon EC2 インスタンスタイプで使用できるブランチネットワークインターフェイスの数を示します。

インスタンスタイプ ブランチネットワークインターフェイス
a1.medium 10
a1.large 9
a1.xlarge 18
a1.2xlarge 38
a1.4xlarge 54
a1.metal 54
c5.large 9
c5.xlarge 18
c5.2xlarge 38
c5.4xlarge 54
c5.9xlarge 54
c5.12xlarge 54
c5.18xlarge 107
c5.24xlarge 107
c5.metal 107
c5a.large 9
c5a.xlarge 18
c5a.2xlarge 38
c5a.4xlarge 54
c5a.8xlarge 54
c5a.12xlarge 54
c5a.16xlarge 107
c5a.24xlarge 107
c5d.large 9
c5d.xlarge 18
c5d.2xlarge 38
c5d.4xlarge 54
c5d.9xlarge 54
c5d.12xlarge 54
c5d.18xlarge 107
c5d.24xlarge 107
c5d.metal 107
c5n.large 9
c5n.xlarge 18
c5n.2xlarge 38
c5n.4xlarge 54
c5n.9xlarge 54
c5n.18xlarge 107
c5n.metal 107
c6g.medium 4
c6g.large 9
c6g.xlarge 18
c6g.2xlarge 38
c6g.4xlarge 54
c6g.8xlarge 54
c6g.12xlarge 54
c6g.16xlarge 107
c6g.metal 107
g4dn.xlarge 39
g4dn.2xlarge 39
g4dn.4xlarge 59
g4dn.8xlarge 58
g4dn.12xlarge 54
g4dn.16xlarge 118
g4dn.metal 107
i3en.large 5
i3en.xlarge 12
i3en.2xlarge 28
i3en.3xlarge 38
i3en.6xlarge 54
i3en.12xlarge 114
i3en.24xlarge 107
i3en.metal 107
inf1.xlarge 38
inf1.2xlarge 38
inf1.6xlarge 54
inf1.24xlarge 107
m5.large 9
m5.xlarge 18
m5.2xlarge 38
m5.4xlarge 54
m5.8xlarge 54
m5.12xlarge 54
m5.16xlarge 107
m5.24xlarge 107
m5.metal 107
m5a.large 9
m5a.xlarge 18
m5a.2xlarge 38
m5a.4xlarge 54
m5a.8xlarge 54
m5a.12xlarge 54
m5a.16xlarge 107
m5a.24xlarge 107
m5ad.large 9
m5ad.xlarge 18
m5ad.2xlarge 38
m5ad.4xlarge 54
m5ad.8xlarge 54
m5ad.12xlarge 54
m5ad.16xlarge 107
m5ad.24xlarge 107
m5d.large 9
m5d.xlarge 18
m5d.2xlarge 38
m5d.4xlarge 54
m5d.8xlarge 54
m5d.12xlarge 54
m5d.16xlarge 107
m5d.24xlarge 107
m5d.metal 107
m5dn.large 9
m5dn.xlarge 18
m5dn.2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
m5n.large 9
m5n.xlarge 18
m5n.2xlarge 38
m5n.4xlarge 54
m5n.8xlarge 54
m5n.12xlarge 54
m5n.16xlarge 107
m5n.24xlarge 107
m6g.medium 4
m6g.large 9
m6g.xlarge 18
m6g.2xlarge 38
m6g.4xlarge 54
m6g.8xlarge 54
m6g.12xlarge 54
m6g.16xlarge 107
m6g.metal 107
p3.2xlarge 38
p3.8xlarge 54
p3.16xlarge 114
p3dn.24xlarge 107
r5.large 9
r5.xlarge 18
r5.2xlarge 38
r5.4xlarge 54
r5.8xlarge 54
r5.12xlarge 54
r5.16xlarge 107
r5.24xlarge 107
r5.metal 107
r5a.large 9
r5a.xlarge 18
r5a.2xlarge 38
r5a.4xlarge 54
r5a.8xlarge 54
r5a.12xlarge 54
r5a.16xlarge 107
r5a.24xlarge 107
r5ad.large 9
r5ad.xlarge 18
r5ad.2xlarge 38
r5ad.4xlarge 54
r5ad.8xlarge 54
r5ad.12xlarge 54
r5ad.16xlarge 107
r5ad.24xlarge 107
r5d.large 9
r5d.xlarge 18
r5d.2xlarge 38
r5d.4xlarge 54
r5d.8xlarge 54
r5d.12xlarge 54
r5d.16xlarge 107
r5d.24xlarge 107
r5d.metal 107
r5dn.large 9
r5dn.xlarge 18
r5dn.2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n.large 9
r5n.xlarge 18
r5n.2xlarge 38
r5n.4xlarge 54
r5n.8xlarge 54
r5n.12xlarge 54
r5n.16xlarge 107
r5n.24xlarge 107
r6g.medium 4
r6g.large 9
r6g.xlarge 18
r6g.2xlarge 38
r6g.4xlarge 54
r6g.8xlarge 54
r6g.12xlarge 54
r6g.16xlarge 107
z1d.large 13
z1d.xlarge 28
z1d.2xlarge 58
z1d.3xlarge 54
z1d.6xlarge 54
z1d.12xlarge 107
z1d.metal 107