🌊

EKS Podにセキュリティグループを適用する

2022/09/25に公開

はじめに

以前投稿した、prometheusのメトリクスを使ってHPAする際に、promethues-operaterは EC2 に、sidekiq-exporterは Fargate 上に存在し、インバウンドルールで通信が許可されていないので通信できないという状況になっていました。

https://zenn.dev/ymktmk/articles/d89b65032d4875

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以降でない場合 は以下の記事を読んで設定してください。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/managing-vpc-cni.html#updating-vpc-cni-add-on

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単位で通信の設定ができるのでセキュアになるかなと思います。

参考文献

https://qiita.com/MAKOTO1995/items/4e70998e50aaea5e9882

https://zenn.dev/karamaru/articles/97d7c6b79b7251

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/managing-vpc-cni.html#updating-vpc-cni-add-on

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security-groups-for-pods.html

Discussion