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

如何在Terraform输出中显示EKS工作节点IP地址?

如何用Terraform输出EKS工作节点的IP地址

问题描述

我有一个Terraform脚本,用来创建EKS集群和节点组,之后在集群上部署Kubernetes Pod。我想把Terraform创建的工作节点IP作为输出内容展示,尝试在outputs.tf里定义:

output "Worker-node-ip" {
  description = "This is the private ip of worker node"
  value = aws_eks_node_group.example. ???
}

但不知道该用什么属性来获取IP地址。

我使用Terraform文档里的标准代码创建EKS工作节点,相关资源定义如下:

resource "aws_eks_node_group" "example" {
  cluster_name    = aws_eks_cluster.example.name
  node_group_name = "example"
  node_role_arn   = aws_iam_role.example.arn
  subnet_ids      = aws_subnet.example[*].id

  scaling_config {
    desired_size = 1
    max_size     = 1
    min_size     = 1
  }

  update_config {
    max_unavailable = 2
  }

  launch_template {
    name    = aws_launch_template.Example_eks_launch_template.name
    version = aws_launch_template.Example_eks_launch_template.latest_version
  }

  depends_on = [
    aws_iam_role_policy_attachment.example-AmazonEKSWorkerNodePolicy,
    aws_iam_role_policy_attachment.example-AmazonEKS_CNI_Policy,
    aws_iam_role_policy_attachment.example-AmazonEC2ContainerRegistryReadOnly,
  ]
}

### 工作节点启动模板定义 ###
resource "aws_launch_template" "Example_eks_launch_template" {
  name                   = "Example_eks_launch_template"
  vpc_security_group_ids = [aws_security_group.Example.id, aws_eks_cluster.example.vpc_config[0].cluster_security_group_id]
  image_id               = "ami-0d5cbb67678bc879c"
  user_data = base64encode(<<-EOF
 MIME-Version: 1.0
 Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
 --==MYBOUNDARY==
 Content-Type: text/x-shellscript; charset="us-ascii"
 #!/bin/bash
 /etc/eks/bootstrap.sh example
 --==MYBOUNDARY==--\
  EOF
  )

  tag_specifications {
    resource_type = "instance"

    tags = {
      Name = "EKS-MANAGED-NODE"
    }
  }
}

解决方案

aws_eks_node_group资源本身不会直接返回工作节点的IP地址,因为EKS托管节点组的EC2实例是由AWS管理的。要获取节点IP,需要通过aws_instance数据源,利用EKS节点组自动添加的标签来过滤实例。

步骤1:添加EC2实例数据源

在你的Terraform配置中添加以下数据源块,通过集群名称和节点组名称的标签过滤出对应的工作节点:

data "aws_instances" "eks_worker_nodes" {
  instance_tags = {
    "eks:cluster-name"   = aws_eks_cluster.example.name
    "eks:nodegroup-name" = aws_eks_node_group.example.node_group_name
  }

  depends_on = [aws_eks_node_group.example]
}

步骤2:修改输出定义

在outputs.tf中,使用数据源的private_ips属性来输出工作节点的私有IP:

output "Worker-node-ip" {
  description = "私有IP地址列表(EKS工作节点)"
  value       = data.aws_instances.eks_worker_nodes.private_ips
}

如果只需要单个节点的IP(比如你的节点组desired_size是1),也可以这样写:

output "Worker-node-ip" {
  description = "EKS工作节点的私有IP"
  value       = data.aws_instances.eks_worker_nodes.private_ips[0]
}

原理说明

AWS为EKS托管节点组的EC2实例自动添加了以下标签:

  • eks:cluster-name: 对应所属的EKS集群名称
  • eks:nodegroup-name: 对应所属的节点组名称
    通过这些标签,我们可以精准过滤出目标节点组的所有实例,进而获取它们的IP地址。

内容的提问来源于stack exchange,提问作者curiousgeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:57:26