You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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资源单独追加规则,步骤如下:

  1. 获取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
    # }
    
  2. 添加入站规则允许堡垒机访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:15:44