0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-24

はじめに

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

参考文献

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