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

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

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

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

Considerations

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

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

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

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

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

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

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

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

  • ポッドセキュリティポリシーを使用してポッドミューテーションへのアクセスを制限している場合、eks-vpc-resource-controllervpc-resource-controller Kubernetes サービスアカウントは、ClusterRoleBinding が割り当てられている Role の Kubernetes psp で指定する必要があります。デフォルトの Amazon EKS、psp、および RoleClusterRoleBinding を使用している場合、これが 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

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

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

  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.0 より前のバージョンである場合は、CNI プラグインをバージョン 1.7.0 以降にアップグレードします。詳細については、「」を参照してください。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. CNI プラグインを有効にして、ENABLE_POD_ENI DaemonSet で true 変数を aws-node に設定することで、ポッドのネットワークインターフェイスを管理します。この設定が true に設定されると、クラスターのノードごとに、プラグインにより値 vpc.amazonaws.com/has-trunk-attached=true のラベルが追加されます。VPC リソースコントローラーは、 の記述を使用して、トランクネットワークインターフェイスaws-k8s-trunk-eniと呼ばれる 1 つの特別なネットワークインターフェイスを作成してアタッチします。

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

    トランクネットワークインターフェイスは、インスタンスタイプでサポートされているネットワークインターフェイスの最大数に含まれています。各インスタンスタイプでサポートされるインターフェイスの最大数のリストについては、https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI の「各インスタンスタイプのネットワークインターフェイスごとの IP アドレスLinux インスタンス用 Amazon EC2 ユーザーガイド」を参照してください。ノードにアタッチされている標準ネットワークインターフェイスの最大数がすでにある場合、VPC リソースコントローラーはスペースを予約します。コントローラーが標準ネットワークインターフェイスをデタッチして削除し、トランクネットワークインターフェイスを作成して、インスタンスにアタッチするのに十分な方法で、実行中のポッドをスケールダウンする必要があります。

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

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

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

    後のステップでポッドのセキュリティグループをデプロイすると、VPC リソースコントローラーは、 の説明を持つ ブランチネットワークインターフェイスaws-k8s-branch-eniと呼ばれる特別なネットワークインターフェイスを作成し、そこにセキュリティグループを関連付けます。ブランチネットワークインターフェイスは、ノードにアタッチされた標準およびトランクネットワークインターフェイスに加えて作成されます。ライブ状態または準備状態のプローブを使用している場合は、TCP 早期デモックスを無効にして、kubelet が TCP を介してブランチネットワークインターフェイスのポッドに接続できるようにする必要があります。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 のセキュリティグループ ID を指定する必要があります。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 のブランチネットワークインターフェイスを作成できます。デプロイを試みる 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