【问题标题】:GCP List vm instances and Get External IPsGCP 列出 vm 实例并获取外部 IP
【发布时间】:2020-04-02 21:13:41
【问题描述】:

我现在正在寻找几天的智慧,我不是 terraform 专家,但我似乎无法找到获取 Kubernetes 集群内的所有外部 ips 的 GCP Vm 实例列表,因为我需要使用这个列表将它们添加到允许访问数据库的列表中。

谁能给我举个例子或者什么

试过这样的东西,但不能使用 * =\

data "google_compute_instance" "instances" {
}

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

【问题讨论】:

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


    【解决方案1】:

    我想出了一种使用 Terraform 执行此操作的方法,但由于 GKE 集群元数据返回实例组列表Managers 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]
    }
    

    【讨论】:

    • 效果很好!谢谢,但缺点是如果它依赖于其他资源,我将无法使用它。即使我添加了depends_on,我也会得到“for_each”值取决于在应用之前无法确定的资源属性,因此 Terraform 无法预测将创建多少个实例。要解决此问题,请使用 -target 参数首先仅应用 for_each 所依赖的资源。
    • 在没有看到您的代码的情况下很难说出解决方案可能是什么,也许可以发布一个新问题,说明您正在尝试什么。另请查看此答案是否提供任何帮助stackoverflow.com/questions/58607536/…
    【解决方案2】:

    与其考虑 GKE 节点是作为计算引擎实现的现实,不如考虑一下其 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”的栏目。然后,我将这些与暴露公共 IP 的 Compute Engine VM 实例进行比较,发现它们是相同的。

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

    【讨论】:

    • 虽然这是一个好主意,但 Kubernetes 提供程序中没有相关的数据源可以帮助解决这个问题,所以就目前的情况而言,它不是一个初学者。您可以改为使用外部数据源调用 kubectl 并输出它,但您需要在答案中充实它,因为将其作为练习留给读者有点棘手。
    【解决方案3】:

    我的 terraform 知识有点混乱,但你能不做以下事情吗?

    如本页所述: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"
      }
    }
    

    然后从文件中读取它?

    【讨论】:

    • 有趣,对于新版本的 TF,我想看看是否可以使用表达式来遍历 ips 列表并创建地图。我将探讨这些已发布的想法。谢谢!
    【解决方案4】:

    解决这个问题的最佳方法是使用 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
    

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2018-02-09
      • 2021-09-20
      • 1970-01-01
      • 2020-05-27
      • 2020-10-16
      相关资源
      最近更新 更多