我正在学习使用terraform在DO上创建k8s集群的方法,我一直在尝试获取我创建的单个K8s节点的ID
,并从负载均衡器中引用它。
这样做的主要原因是,我可以在.tf
文件中声明FQDN。
首先,这是集群声明:
variable "digitalocean_token" {}
provider "digitalocean" {
token = "${var.digitalocean_token}"
}
resource "digitalocean_kubernetes_cluster" "foo" {
name = "foo"
region = "nyc1"
version = "1.12.1-do.2"
node_pool {
name = "woker-pool"
size = "s-1vcpu-2gb"
node_count = 1
}
}
这是负载均衡器声明:
resource "digitalocean_loadbalancer" "foo" {
name = "k8s-lb.nyc1"
region = "nyc1"
forwarding_rule {
entry_port = 80
entry_protocol = "http"
target_port = 80
target_protocol = "http"
}
droplet_ids = ["${digitalocean_kubernetes_cluster.foo.node_pool.0.id}"]
}
output "loadbalancer_ip" {
value = "${digitalocean_loadbalancer.foo.ip}"
}
resource "digitalocean_record" "terraform" {
domain = "example.com" # "${digitalocean_domain.example.name}"
type = "A"
name = "terraform"
value = "${digitalocean_loadbalancer.foo.ip}"
}
# Output the FQDN for the record
output "fqdn" {
value = "${digitalocean_record.terraform.fqdn}"
}
我猜想digitalocean_loadbalancer
资源是否仅设置为可以处理单个墨滴?
以下是输出错误:我运行terraform apply
时:
* output.loadbalancer_ip: Resource 'digitalocean_loadbalancer.foo' not found for variable 'digitalocean_loadbalancer.foo.ip'
* digitalocean_record.terraform: Resource 'digitalocean_loadbalancer.foo' not found for variable 'digitalocean_loadbalancer.foo.ip'
* digitalocean_loadbalancer.foo: droplet_ids.0: cannot parse '' as int: strconv.ParseInt: parsing "d4292e64-9c0a-4afb-83fc-83f239bcb4af": invalid syntax
Pt。 2
我添加了digitalocean_droplet
资源,以查看将什么样的ID传递给负载均衡器。
resource "digitalocean_droplet" "web" {
name = "web-1"
size = "s-1vcpu-1gb"
image = "ubuntu-18-04-x64"
region = "nyc1"
}
digitalocean_kubernetes_cluster.foo.node_pool.0.id = '6ae6a787-d837-4e78-a915-cb52155f66fe'
digitalocean_droplet.web.id = 132533158
答案 0 :(得分:2)
您为负载均衡器Droplet ID使用了错误的属性引用。
droplet_ids = ["${digitalocean_kubernetes_cluster.foo.node_pool.0.id}"]
这将使用链接here的node_pool
id
您实际需要做的是使用node_pool
nodes id,该ID被引用为here
droplet_ids = "${digitalocean_kubernetes_cluster.foo.node_pool.0.nodes}"
您将要遇到的下一个问题是,这将返回一个地图列表,您将需要从中构建一个ID列表。恐怕我目前不确定如何解决该问题,但这有望使您前进。
但是,从您的答案看来,您想要做的是为负载均衡器更新DNS。
您可以使用external-dns
来digitalocean provider执行此操作只需将其部署为Pod,指定所需的配置,并确保已设置arg --source=service
。
如果您想更进一步,并允许使用特定的主机名更新DNS,请部署一个入口控制器(如nginx-ingress)并为您的应用程序指定入口。外部DNS部署(如果您设置了--source=ingress
)将从入口处获取主机名并为您更新DNS。
答案 1 :(得分:1)
因此,digitalocean_loadbalancer
资源具有一个可选的droplet_tag
参数,可用于提供给创建的节点/液滴的通用标签。
但是,当在kubernetes中声明一个负载均衡器时,仍然会创建一个新的负载均衡器。因此,至少目前看来,在digitalocean上无法使用Terraform定义域/ CNAME记录