Как запустить kubectl применить команды в terraform - PullRequest
0 голосов
/ 08 января 2019

Я разработал скрипт terraform для создания кластера k8 в GKE.

После успешного создания кластера у меня есть набор файлов yaml для применения на кластере k8.

Как я могу вызвать приведенную ниже команду в моем скрипте terraform?

kubectl create <.yaml>

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Для этого вы можете использовать terraform local-exec.

   resource "aws_instance" "web" {
     # ...
     provisioner "local-exec" {
      command = "echo ${aws_instance.web.private_ip} >> private_ips.txt"
     }
   }

Ссылка: https://www.terraform.io/docs/provisioners/local-exec.html

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

Есть несколько способов достичь того, что вы хотите сделать.

Вы можете использовать ресурсы Terraform template_file и null_resource .
Обратите внимание, что я использую триггер для запуска команды kubectl всегда, когда вы изменяете шаблон (вы можете заменить create на apply).

data "template_file" "your_template" {
  template = "${file("${path.module}/templates/<.yaml>")}"
}

resource "null_resource" "your_deployment" {
  triggers = {
    manifest_sha1 = "${sha1("${data.template_file.your_template.rendered}")}"
  }

  provisioner "local-exec" {
    command = "kubectl create -f -<<EOF\n${data.template_file.your_template.rendered}\nEOF"
  }
}

Но, возможно, лучшим способом является использование провайдера Kubernetes .
Есть два способа его настройки:

  • По умолчанию ваши манифесты будут развернуты в вашем текущем контексте (kubectl config current-context)
  • Второй способ - статически определить учетные данные сертификата TLS:
provider "kubernetes" {
  host = "https://104.196.242.174"

  client_certificate     = "${file("~/.kube/client-cert.pem")}"
  client_key             = "${file("~/.kube/client-key.pem")}"
  cluster_ca_certificate = "${file("~/.kube/cluster-ca-cert.pem")}"
}

Как только вы это сделаете, вы сможете довольно легко создать собственное развертывание. Для базового модуля это будет так же просто, как:

resource "kubernetes_pod" "hello_world" {
  metadata {
    name = "hello-world"
  }

  spec {
    container {
      image = "my_account/hello-world:1.0.0"
      name  = "hello-world"
    }

    image_pull_secrets  {
      name = "docker-hub"
    }
  }
}
0 голосов
/ 08 января 2019

Лучшим способом было бы использовать Kubernetes провайдера Terraform

...