将安全组应用于EKS Pod

首先

之前投稿时,在使用Prometheus的指标进行HPA时,Prometheus Operator部署在EC2上,而Sidekiq Exporter部署在Fargate上。由于入站规则禁止了通信,导致它们无法相互通信。

 

要与 EC2 -> Fargate 进行通信,需要使用 “Fargate 的集群安全组” 或者 “Pod 的 SecurityGroupPolicy”。但是,Fargate 的集群安全组会允许所有 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

如果正在使用活动探针和就绪探针,似乎还需要以下命令。

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的设置。

请在matchLabels中指定与Pod标签匹配的标签(例如,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进行通信设置,所以我认为这可以提高安全性。

书目参考

 

bannerAds