Предварительное развертывание нагрузочного балансировщика Kubernetes с терраформой на DigitalOcean? - PullRequest
0 голосов
/ 10 февраля 2019

Я изучаю создание кластера k8s на DO с использованием terraform, я пытался взять ID одного созданного мной узла K8s и сослаться на него из loadbalancer.

Основная причина этого заключается в том, что я могу объявить полное доменное имя в файле .tf.

Во-первых, вот объявление кластера:


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, чтобы посмотреть, какой идентификатор был передан в балансировщик нагрузки.

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вы используете неправильную ссылку на атрибут для идентификаторов дроплетов балансировщика нагрузки.

droplet_ids = ["${digitalocean_kubernetes_cluster.foo.node_pool.0.id}"]

При этом будет использоваться идентификатор node_pool связанный здесь

Что вам действительно нужно сделать, так это использовать node_pool узлы id, на который ссылается здесь

droplet_ids = "${digitalocean_kubernetes_cluster.foo.node_pool.0.nodes}"

Следующая проблема, которую вы 'у вас будет то, что это возвращает список карт, и вам нужно будет составить список идентификаторов из этого.В настоящее время я не уверен, как решить эту проблему, боюсь, но это должно вас продвинуть вперед.

Из вашего ответа, однако, очевидно, что вы хотите обновить DNS для вашего loadbalancer.

Вы можете сделать это external-dns с помощью поставщика digitalocean

Просто разверните его как модуль, указав требуемую конфигурацию, и убедитесь, чтоАргумент --source=service установлен.

Если вы хотите пойти дальше и разрешить обновление DNS с определенным именем хоста, разверните входной контроллер, такой как nginx-ingress, и укажите входы для ваших приложений.Развертывание external-dns (если вы установили --source=ingress) получит имя хоста от вашего входа и обновит DNS для вас.

0 голосов
/ 11 февраля 2019

Итак, ресурс digitalocean_loadbalancer имеет необязательный аргумент droplet_tag, который можно использовать для предоставления общего тега, заданного для созданных узлов / капель.

Однако при объявлении балансировщика нагрузки внутриkubernetes, новый еще будет создан.Так что пока, по крайней мере, может показаться, что определение домена / записи CNAME с помощью terraform невозможно в digitalocean

...