我现在已经搜索了几天,我不是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 }"
}
答案 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