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

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

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

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

Considerations

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

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

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

  • ポッドのセキュリティグループは、 にデプロイされたポッドでは使用できませんFargate。

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

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

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

  • タイプの Kubernetes サービスNodePortで、 を LoadBalancer に設定してインスタンスターゲットexternalTrafficPolicyを使用すると、セキュリティグループを割り当てるポッドでサポートLocalされません。インスタンスターゲットでのロードバランサーの使用の詳細については、「」ロードバランサー–インスタンスのターゲットを参照してください。

  • また、ポッドのセキュリティポリシーを使用してポッドのミューテーションへのアクセスを制限する場合は、 eks-vpc-resource-controller vpc-resource-controller が割り当てられている ClusterRoleBindingRole Kubernetes で、 psp および Kubernetes サービスアカウントを指定する必要があります。デフォルトの Amazon EKS psp、、Roleおよび ClusterRoleBinding を使用している場合、これは ですeks:podsecuritypolicy:authenticatedClusterRoleBinding。たとえば、次の例に示すように、 サービスアカウントを 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. 次のコマンドを使用して、現在の 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 Plugin for Kubernetes のアップグレード

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

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. ENABLE_POD_ENI true DaemonSetで aws-node 変数を に設定して、CNI プラグインを有効にしてポッドのネットワークインターフェイスを管理します。この設定を に設定すると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
    注記

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

    次のコマンドを使用して、 が aws-k8s-trunk-eni に設定したノードを確認できますtrue

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

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

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

    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 を に置き換えることができます。いずれかのセレクタを指定する必要があります。空の podSelector (例: podSelector: {}) は、 名前空間内のすべてのポッドを選択します。空にすると、名前空間内のすべてのサービスアカウントserviceAccountSelectorが選択されます。に 1-5 のセキュリティグループ IDs を指定する必要がありますgroupIds。複数の 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 の場合) へのアウトバウンド通信を許可する必要があります。クラスターセキュリティグループは、ポッドに関連付けられているすべてのセキュリティグループからのインバウンド TCP および UDP ポート 53 通信も許可する必要があります。

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

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

    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 <file-name-you-used-in-previous-step.yaml>
      注記
      • ポッドが Waiting 状態でスタックし、ポッドの説明Insufficient permissions: Unable to create Elastic Network Interface.が表示された場合は、前のステップでIAMクラスターロールにIAMポリシーを追加したことを確認します。

      • ポッドが Pending 状態でスタックしている場合は、ノードインスタンスタイプが に一覧表示Amazon EC2 でサポートされるインスタンスとブランチネットワークインターフェイスされていること、およびインスタンスタイプでサポートされているブランチネットワークインターフェイスの最大数にノードグループ内のノード数が乗算されていないことを確認します。たとえば、 m5.large インスタンスは 9 つのブランチネットワークインターフェイスをサポートします。ノードグループに 5 つのノードがある場合、ノードグループに対して最大 45 のブランチネットワークインターフェイスを作成できます。デプロイしようとする 46th 番目のポッドは、関連付けられたセキュリティグループを持つ別のポッドが削除されるまで、 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
a1metal 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
c5metal 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
inf1xlarge 38
inf12xlarge 38
inf16xlarge 54
inf124xlarge 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
m5dn2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
m5n.large 9
m5n.xlarge 18
m5n2xlarge 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
r5dn2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n.large 9
r5n.xlarge 18
r5n2xlarge 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