EKS Podにセキュリティグループを適用する
はじめに
以前投稿した、prometheusのメトリクスを使ってHPAする際に、promethues-operaterは EC2
に、sidekiq-exporterは Fargate
上に存在し、インバウンドルールで通信が許可されていないので通信できないという状況になっていました。
EC2 -> Fargate
へ通信するには「FargateのクラスターSG」 or 「PodにSecurityGroupPolicy」 のいずれかが必要です。しかし、FargateのクラスターSGの場合は全てのPodに対して9292番ポートの通信を許可してしまうのでPod単位で設定できる SecurityGroupPolicy
が適しています。今回はSecurityGroupPolicyを正しく設定してEC2からFargateのPodへの通信を可能にしていきたいと思います。
セキュリティグループ用の VPC CNI アドオンの設定
CNI プラグインのバージョンが 1.7.7より前の場合は、CNIプラグインをバージョン1.7.7以降に更新しなければなりません。以下のコマンドで確認してください。
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
1.7.7以降でない場合
は以下の記事を読んで設定してください。
CNI プラグインを有効にする。
kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true
liveness probesやreadiness probesを使用している場合は、以下コマンドも必要らしい。
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"}]}}}}'
セキュリティグループを作成
今回はTerraformで構築しました。
resource "aws_security_group" "security_group_policy_for_sidekiq_exporter" {
name = "security_group_policy_for_sidekiq_exporter"
vpc_id = module.vpc.vpc_id
}
resource "aws_security_group_rule" "accept9292" {
security_group_id = aws_security_group.security_group_policy_for_sidekiq_exporter.id
type = "ingress"
source_security_group_id = module.eks.node_security_group_id
from_port = 9292
to_port = 9292
protocol = "tcp"
}
resource "aws_security_group_rule" "out_all" {
security_group_id = aws_security_group.security_group_policy_for_sidekiq_exporter.id
type = "egress"
cidr_blocks = ["0.0.0.0/0"]
from_port = 0
to_port = 65535
protocol = "-1"
}
SecurityGroupPolicyの設定
Podに付与しているラベルをmatchLabelsにて指定する(私の場合はapp: sidekiq-exporter
)そして、groupIdsに作成したセキュリティグループのIDを指定してください。
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
name: security-policy
namespace: sidekiq
spec:
podSelector:
matchLabels:
app: sidekiq-exporter
securityGroups:
groupIds:
- sg-xxxxxxxxxxxxx
まとめ
以上の設定で EC2 -> Fargate
への通信が可能になりました。KubernetesマニフェストにセキュリティグループIDを直書きするのは辛いですがPod単位で通信の設定ができるのでセキュアになるかなと思います。
参考文献
Discussion