「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
ポッドのセキュリティグループ
ポッドのセキュリティグループは、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、
m5
、c5
、r5
、p3
、m6g
、c6g
インスタンスファミリーを含む、ほとんどのr6g
Nitro ベースインスタンスファミリーでサポートされています。インスタンスファミリーはサポートされていません。t3
サポートされているインスタンスの詳細なリストについては、「Amazon EC2 でサポートされるインスタンスおよびブランチネットワークインターフェイス」を参照してください。ノードは、サポートされているインスタンスタイプのいずれかである必要があります。 -
セキュリティグループが割り当てられたポッドからのアウトバウンドトラフィックでは、ソース NAT が無効になるため、アウトバウンドセキュリティグループルールが適用されます。インターネットにアクセスするには、NAT ゲートウェイまたはインスタンスで設定されたプライベートサブネットにデプロイされたノードで、セキュリティグループが割り当てられたポッドを起動する必要があります。割り当てられたセキュリティグループがパブリックサブネットにデプロイされているポッドは、インターネットにアクセスできません。
-
が
NodePort
に設定されているインスタンスターゲットを使用するタイプLoadBalancer
およびexternalTrafficPolicy
の Kubernetes サービスは、セキュリティグループを割り当てるポッドではサポートされません。Local
インスタンスターゲットでロードバランサーを使用する方法の詳細については、「ロードバランサーの – インスタンスターゲット」を参照してください。 -
ポッドセキュリティポリシーを使用してポッドミューテーションへのアクセスを制限している場合、
eks-vpc-resource-controller
とvpc-resource-controller
Kubernetes サービスアカウントは、ClusterRoleBinding
が割り当てられているRole
の Kubernetespsp
で指定する必要があります。デフォルトの 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
ポッドのセキュリティグループをデプロイする
ポッドのセキュリティグループをデプロイするには
-
以下のコマンドを使用して、現在の 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 のアップグレード.
-
クラスターに関連付けられている
AmazonEKSVPCResourceController
クラスターロールに 管理ポリシーを追加します。Amazon EKSポリシーでは、ネットワークインターフェイス、プライベート IP アドレス、およびインスタンスとのアタッチメントとデタッチの管理をロールに許可します。次のコマンドは、 <eksClusterRole>
という名前のクラスターロールにポリシーを追加します。aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
-
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-eni
がtrue
に設定されているかを確認できます。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"}]}}}}'
-
リソースをデプロイする名前空間を作成します。
kubectl create namespace <my-namespace>
-
Amazon EKS をクラスターにデプロイします。
SecurityGroupPolicy
-
次のセキュリティポリシーの例を <my-security-group-policy.yaml> という名前のファイルに保存します。サービスアカウントのラベルに基づいてポッドを選択する場合は、
podSelector
をserviceAccountSelector
に置き換えることができます。セレクタのいずれかを指定する必要があります。空の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 通信も許可する必要があります。
-
-
ポリシーをデプロイします。
kubectl apply -f <my-security-group-policy.yaml>
-
-
前のステップで指定した
<my-role>
の<podSelector>
値と一致するラベルのサンプルアプリケーションをデプロイします。-
次の内容をファイルに保存します。
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>
-
次のコマンドを使用してアプリケーションをデプロイします。アプリケーションをデプロイすると、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 |