※ 2022年8月更新:ドキュメントが大幅に変わっていたため本記事も大きく書き換えました。
背景
EKSクラスターやワーカーノードに用いるセキュリティグループ(以下SG)には何種類かありますが、それぞれの役割について一部よくわからない部分がありました。
今回、AWSサポートへの問い合わせや動作検証によりきちんと調べてみたので、まとめていきたいと思います。
EKS関連SGの種類
EKS関連のSGは下記3種類がある。
- クラスターSG
- コントロールプレーンSG
- ノードSG
ノードSGがワーカーノードEC2に付与するSGっていうのは、なんとなく分かる。けど、1.と2.の違いがよく分からん。。という状態でした。
さらに検証進めていく中で、ノードSGも少し特殊な動作することがわかりました。
それぞれ詳しく
1. クラスターSG
- 下記3者に付与されるSG
- EKSコントロールプレーン通信用ENI(EKS-managed ENI)
- EKSonFargateの場合:Fargateノード
- EKSonEC2の場合:マネージドノードグループ内のEC2ノード
※ただし後述のノードSG
がEC2ノードに付与されている場合、クラスターSGは付与されない。
- EKSクラスターを作成した時にEKS側で自動作成される。(デフォルトでは自身SGからの通信を全て許可するルール)
- そのためCFnでルールをカスタマイズしてデプロイ等できない。カスタマイズするならクラスター作成後に手動変更が必要。
2. コントロールプレーンSG
- EKSコントロールプレーン通信用ENI(EKS-managed ENI) に付与されるSG。
- ただしマネージド型ノードグループEC2ノード、Fargateノードには付与されない。
-
このSGは作成は必須ではなく、
クラスターSG
とは別に追加ルールをコントロープレーンENIに設けたい時に作成する。 - マネジメントコンソールのEKSクラスター設定で「追加のセキュリティグループ」と表示される。
- CFnでは、"ResourcesVpcConfig"の"SecurityGroupIds"で指定したSGが
コントロールプレーンSG
となる。(ドキュメント)
3. ノードSG
- EKSonEC2限定で使えるSG
- マネージドノードグループ内のEC2ノードに付与するSG。
- コントロールプレーンや、ノードEC2と通信するリソース(他ノード、ALBなど)からのアクセスを許可するために使用可能。
- 作成は必須ではなく、
ノードSG
の指定がなければクラスターSG
がマネージドノードグループに自動適用される。
図解
文章だけだとどうしても分かりづらいため、図にしてみました。
EKS on EC2
- ノードSGを指定した場合、ノード-コントロールプレーン間の通信はノードSGのルールによる
- ノードSGを指定しない場合、デフォルトではノード-コントロールプレーン間は自由に通信行き来できる(クラスターSGのデフォルトルールが自身SGからのインバウンド全開のため)
EKS on Fargate
- デフォルトでは、ノード-コントロールプレーン間は自由に通信行き来できる(クラスターSGのデフォルトルールが自身SGからのインバウンド全開のため)
- ノード-コントロールプレーン間の通信に制限を設けたい場合は最低限のポート(ドキュメントに記載あり)を開けつつ、あとはアプリケーションワークロードに応じて適宜開放する。
最後に
ドキュメントに明記されておらずAWSサポートからの回答で判明したこともいくつかありました。分からなかったら積極的に問い合わせるのが吉ですね。
参考
1. ドキュメント「Amazon EKS セキュリティグループの考慮事項」
2. EKS CFnテンプレート「AWS::EKS::Cluster」