Как повторно использовать туннель S SH в Terraform - PullRequest
1 голос
/ 12 апреля 2020

Мне нужно создать задание k8s через Terraform и каким-то образом организовать механизм ожидания завершения этого задания (поскольку Terraform не может это сделать https://github.com/terraform-providers/terraform-provider-kubernetes/issues/534). Я понял, что нет ничего лучше, чем использовать нулевой ресурс с командой, которая ожидает задания k8s (а именно kubectl wait). Этот материал будет выполнен в контейнере Docker на CI. Более того, мне нужно go через Бастион, чтобы попасть в кластер k8s. Для этого я использую туннель S SH:

provider "ssh" {
  port = ....
}
provider "kubernetes" {
  config_context         = "..."
  config_context_cluster = "..."
  host                   = "api.${k8s_host}:${data.ssh_tunnel.k8s.port}"
}

data "ssh_tunnel" "k8s" {
  host           = "bastion.....com"
  local_address  = "localhost:0"
  remote_address = "api.${k8s_host}:443"
}

Все ресурсы k8s успешно созданы, поэтому я предполагаю, что туннель S SH работает нормально. Но как использовать его для нулевого ресурса? Вот оно:

resource "null_resource" "wait" {
  provisioner "local-exec" {
    connection {
      type = "ssh"
      bastion_host = data.ssh_tunnel.k8s.host
      bastion_private_key = file("~/.ssh/id_rsa")
      bastion_port = data.ssh_tunnel.k8s.port
      host = "api.${k8s_host}"
      port = 443
    }
    command = "kubectl wait ...."
  }
  triggers = {
    job_ids = join(", ", kubernetes_job.a-job.*.id)
  }
}

Но не повезло, я получил «Отказ в соединении с сервером api. $ {K8s_host} - вы указали правильный хост или порт?»

Итак, есть два вопроса: 1. Как ждать работу по-другому 2. Если 1 невозможно (я уверен, что это так), как правильно использовать туннель S SH.

PS Да, я прочитал документацию https://www.terraform.io/docs/provisioners/connection.html но я определенно что-то делаю не так.

1 Ответ

0 голосов
/ 16 апреля 2020

Я понял, как использовать туннель S SH, открытый Terraform:

resource "null_resource" "wait" {
provisioner "local-exec" {
  command = "kubectl wait --server=https://api.${k8s_host}:${data.ssh_tunnel.k8s.port} --for=condition=complete --timeout=3000s job/a-job"
  }
  triggers = {
    job_ids = join(", ", kubernetes_job.a-job.*.id)
  }
}
...