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/
参考にさせていただきました。ありがとうございます。