GCP列出虚拟机实例并获取外部IP

时间:2019-12-09 18:11:17

标签: google-cloud-platform terraform google-kubernetes-engine

我现在已经搜索了几天,我不是terraform专家,但是我似乎仍然找不到将Kubernetes集群中的所有外部ip的GCP Vm实例列表获取的方法,因此我需要使用此列表将它们添加到允许访问数据库的列表中。

有人可以给我指出一个例子吗?

尝试了类似的方法,但是不能使用* = \

data "google_compute_instance" "instances" {
}

output "instance_ids" {
  value = "${data.google_compute_instance.instances.*.network_interface.0.access_config.0.nat_ip }"
}

4 个答案:

答案 0 :(得分:1)

我想出了一种使用Terraform进行此操作的方法,但由于GKE群集元数据返回了实例组 Managers的列表,因此涉及一些URL的字符串处理有些麻烦, em>,而不是实例组(尽管标记了属性)。但是,它确实适用于我对其进行测试的集群。

如果有帮助,下面是一个Terraform示例,该示例输出所有节点计算实例的外部IP:

provider "google" {
  version = "~> 2"
  project  = "my-project"
}

// GKE cluster details
data "google_container_cluster" "my_cluster" {
  name     = "my-cluster-name"
  location = "my-location"
} 

// GKE node instance group details
data "google_compute_instance_group" "node_instance_groups" {
    for_each = toset(data.google_container_cluster.my_cluster.node_pool[0].instance_group_urls)
    self_link = replace(each.key, "instanceGroupManagers", "instanceGroups")
}

// GKE node compute instance details
data "google_compute_instance" "nodes" {
    for_each = toset(flatten([for x in data.google_compute_instance_group.node_instance_groups : x.instances[*]]))
    self_link = each.key
}

// Return the external IPs for all GKE node instances
output "external_ips" {
    value = [for x in data.google_compute_instance.nodes : x.network_interface[0].access_config[0].nat_ip]
}

答案 1 :(得分:0)

与其考虑将GKE节点实现为Compute Engine的现实,不如考虑其Kubernetes概念中的GKE节点。作为测试,我创建了一个具有3个节点的集群,然后运行:

kubectl get nodes -o wide

结果是

NAME                                STATUS   ROLES    AGE   VERSION           INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-c1-default-pool-5b6b460a-59nb   Ready    <none>   68s   v1.13.11-gke.14   10.128.0.42   35.222.104.41    Container-Optimized OS from Google   4.14.138+        docker://18.9.7
gke-c1-default-pool-5b6b460a-ggh9   Ready    <none>   68s   v1.13.11-gke.14   10.128.0.41   35.192.152.130   Container-Optimized OS from Google   4.14.138+        docker://18.9.7
gke-c1-default-pool-5b6b460a-j8nn   Ready    <none>   67s   v1.13.11-gke.14   10.128.0.40   104.197.68.223   Container-Optimized OS from Google   4.14.138+        docker://18.9.7

请注意名为EXTERNAL-IP的列。然后,我将它们与Compute Engine VM实例公开的公共IP进行了比较,发现它们是相同的。

现在我们看到使用kubectl检查节点会返回我们想要的信息,我们现在可以潜在地使用与该命令等效的Terraform。例如Kubernetes Provider

答案 2 :(得分:0)

我对地形的知识有点不了解,但是您不能执行以下操作吗?

如本页所述:https://www.terraform.io/docs/provisioners/local-exec.html

resource "gcp_instance" "web" {
  # ...

  provisioner "local-exec" {
    command = "echo gcloud compute instances list --format=\"value(External IP)\" --filter=\"name~'gke-$cluster_name-$pool_name*' --format=\"value(External_IP)\" "} >> public_ips.txt"
  }
}

然后从文件中读取?

答案 3 :(得分:0)

解决此问题的最佳方法是将 gcloud 命令行工具与 awk 结合使用来操作输出。

通过 2 个简单的命令,您可以获得一个漂亮的格式化输出。

首先计算节点数:

num_nodes=$(kubectl get nodes | awk 'END{print NR - 1}')

之后

gcloud compute instances list | awk '{print $1,$5}' | tail -n $num_nodes

如果要创建动态 Ansible 库存,那么上面的命令变为:

gcloud compute instances list | awk '{print $1, "ansible_ssh_host="$5}' | tail -n $num_nodes