如何通过Terraform将bastionSG作为入站规则添加到EKS自动生成安全组
私有EKS集群堡垒机无法通过kubectl访问控制平面的Terraform解决方案
我用Terraform部署了私有EKS集群、堡垒机及其他AWS服务,创建了多个安全组。其中bastionSG安全组允许家庭IP通过SSH访问堡垒机,这部分正常运行,但堡垒机无法通过kubectl访问EKS控制平面。
原因是私有EKS集群默认仅允许同VPC内节点通信,需要把bastionSG作为入站规则添加到EKS自动生成的安全组中。目前我只能在Terraform部署完成后手动通过AWS控制台操作,希望直接用Terraform实现,且不覆盖安全组原有自动生成的规则。
已知可以通过data块查询现有安全组:
data "aws_security_group" "selectedSG" { id = var.security_group_id }
假设selectedSG是EKS生成的安全组,需要为其添加bastionSG的入站规则。
现有配置代码
EKS节点组配置
resource "aws_eks_node_group" "flmd_node_group" { cluster_name = var.cluster_name node_group_name = var.node_group_name node_role_arn = var.node_pool_role_arn subnet_ids = [var.flmd_private_subnet_id] instance_types = ["t2.small"] scaling_config { desired_size = 3 max_size = 3 min_size = 3 } update_config { max_unavailable = 1 } remote_access { ec2_ssh_key = "MyPemFile" source_security_group_ids = [ var.allow_tls_id, var.allow_http_id, var.allow_ssh_id, var.bastionSG_id ] } tags = { "Name" = "flmd-eks-node" } }
注:已将bastionSG加入节点组的远程访问安全组,但未实现堡垒机访问EKS控制平面的预期效果。
EKS集群配置
resource "aws_eks_cluster" "flmd_cluster" { name = var.cluster_name role_arn = var.role_arn vpc_config { subnet_ids =[var.flmd_private_subnet_id, var.flmd_public_subnet_id, var.flmd_public_subnet_2_id] endpoint_private_access = true endpoint_public_access = false security_group_ids = [ var.bastionSG_id] } }
注:bastionSG_id是下方堡垒机安全组的输出值,已作为变量传入集群配置。
堡垒机安全组配置
resource "aws_security_group" "bastionSG" { name = "Home to bastion" description = "Allow SSH - Home to Bastion" vpc_id = var.vpc_id ingress { description = "Home to bastion" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = [<我的家庭IP地址>] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } tags = { Name = "Home to bastion" } }
Terraform实现方案
要在不覆盖EKS自动生成安全组原有规则的前提下添加入站规则,可使用aws_security_group_rule资源单独追加规则,步骤如下:
获取EKS自动生成的控制平面安全组
EKS集群创建后会自动生成一个关联控制平面的安全组,可通过标签过滤或直接传入ID的方式获取:# 方式1:通过标签过滤(EKS自动生成的安全组默认带集群归属标签) data "aws_security_group" "eks_control_plane_sg" { filter { name = "tag:kubernetes.io/cluster/${var.cluster_name}" values = ["owned"] } vpc_id = var.vpc_id } # 方式2:直接传入已知的安全组ID # data "aws_security_group" "eks_control_plane_sg" { # id = var.eks_control_plane_sg_id # }添加入站规则允许堡垒机访问EKS控制平面
EKS控制平面通过443端口提供API服务,添加规则允许bastionSG的流量访问该端口:resource "aws_security_group_rule" "allow_bastion_access_eks_control_plane" { type = "ingress" from_port = 443 to_port = 443 protocol = "tcp" security_group_id = data.aws_security_group.eks_control_plane_sg.id source_security_group_id = aws_security_group.bastionSG.id description = "Allow bastion host to access EKS control plane" }
关键说明
aws_security_group_rule会在现有安全组基础上追加规则,不会覆盖EKS自动生成的原有规则- 确保堡垒机和EKS集群处于同一个VPC内,否则需要额外配置VPC对等或网络打通策略
- kubectl访问EKS控制平面依赖443端口,因此规则目标端口需设置为443
内容的提问来源于stack exchange,提问作者floormind
相关产品推荐
相关产品推荐

