将安全组应用于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进行通信设置,所以我认为这可以提高安全性。
书目参考