LoginSignup
0
0

More than 1 year has passed since last update.

[EKS] Podに対してSecurity Groupを適用する前にしておく準備について

Last updated at Posted at 2022-11-12

What's This

EKSにおいて、Podに対してSGを適用する場合、いくつか準備が必要です。
設計前、作業前に知っておくと、検証がスイスイ進むのではないかという内容です。
簡易なメモです。

ノードにt3系は使用できない

ドキュメントにある通り、Pod単位でSGを適用したい場合には、ノードにt3系は使用できないです。

pods のセキュリティグループは、m5、c5、r5、p3、m6g、c6g、および r6g インスタンスファミリーを含む、ほとんどの Nitro ベースの Amazon EC2 インスタンスファミリーでサポートされています。t3 インスタンスファミリーはサポートされていません。サポートされているインスタンスの詳細なリストについては、GitHub で「limits.go」ファイルを参照してください。ノードは、そのファイルで一覧表示されているインスタンスタイプのうち、IsTrunkingCompatible: true を含むものである必要があります。

以下limits.goでIsTrunkingCompatibleがtrueになっているc5.largeに変更して再度検証したところ、適用できました。
https://github.com/aws/amazon-vpc-resource-controller-k8s/blob/master/pkg/aws/vpc/limits.go

ちなみに、サポートされていないファミリー(a1.medium)で適用するとこんなエラーが出ます。

│ Error: error creating EKS Node Group (`cluster名前`:`Node Group 名前`): InvalidParameterException: [a1.medium] is not a valid instance type for requested amiType `hogehoge`
│ {
│   RespMetadata: {
│     StatusCode: 400,
│     RequestID: "`hogehoge`"
│   },
│   ClusterName: "`cluster名前`",
│   Message_: "[a1.medium] is not a valid instance type for requested amiType `hogehoge`",
│   NodegroupName: "`Node Group 名前`"
│ }
│ 

検証が結構進んだ段階でこれを知った場合、今更ノードのタイプを変更したくないなあ…ということもあるのではないかと思い、記しました。
まあただ、t3系を本番で運用することもあんまりないのかなとは思いますが…

CNI プラグインを有効にする必要がある

CNIのバージョンは1.7.7以降である必要がある

次のコマンドで、現在の Amazon VPC CNI plugin for Kubernetes のバージョンを確認します。
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
出力例を次に示します。
v1.7.6
Amazon VPC CNI plugin for Kubernetes バージョンが 1.7.7 より前の場合は、プラグインを 1.7.7 以降に更新してください。詳細については、「Amazon VPC CNI plugin for Kubernetes アドオンの更新」を参照してください。

CNI Amazon VPC CNI アドオンを有効にする

Amazon VPC CNI アドオンを有効にして pods のネットワークインターフェイスを管理するには、aws-node DaemonSet で 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

自分はterraformで以下のようにラベル付けを行いました。

      labels = {
        "vpc.amazonaws.com/has-trunk-attached" = "true"
      }

が、環境によってはコマンドベースでやった方が確実かもしれません。

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

確認

kubectl describe daemonset -n kube-system aws-node | grep ENABLE_POD_ENI
      ENABLE_POD_ENI:                         true(なら有効)

EKSクラスターのIAMロールに AmazonEKSVPCResourceController マネージドポリシーを追加する必要がある

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

まあこれは元々ついてた、ということもあるかと思いますので、改めて追加することもあんまりないのかなとは思いますが、一応。

Reference

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security-groups-for-pods.html
https://www.grugrut.net/posts/202107250958/

参考にさせていただきました。ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0