web-dev-qa-db-ja.com

terraformでkubectl applyコマンドを実行する方法

GKEでk8クラスターを作成するためのterraformスクリプトを開発しました。

クラスターの作成が成功した後、k8クラスターに適用する一連のyamlファイルを用意しました。

Terraformスクリプトで以下のコマンドを呼び出すにはどうすればよいですか?

kubectl create <.yaml>
3
Sunil Gajula

Terraform kubectlサードパーティプロバイダーを使用できます。ここのインストール手順に従ってください: Kubectl Terraform Provider

次に、単にkubectl_manifest YAMLファイルを指すように:

# Get your cluster-info
data "google_container_cluster" "my_cluster" {
  name     = "my-cluster"
  location = "us-east1-a"
}

# Same parameters as kubernetes provider
provider "kubectl" {
  load_config_file       = false
  Host                   = "https://${data.google_container_cluster.my_cluster.endpoint}"
  token                  = "${data.google_container_cluster.my_cluster.access_token}"
  cluster_ca_certificate = "${base64decode(data.google_container_cluster.my_cluster.master_auth.0.cluster_ca_certificate)}"
}

resource "kubectl_manifest" "my_service" {
    yaml_body = file("${path.module}/my_service.yaml")
}

このアプローチには、すべてが動的に取得され、ローカル構成ファイルに依存しないという大きな利点があります(CI/CDサーバーでTerraformを実行する場合、またはマルチクラスター環境を管理する場合に非常に重要です)。

kubectlプロバイダーは、複数のファイルを非常に簡単に処理するのに役立つデータソースも提供します。ドキュメントから kubectl_filename_list

data "kubectl_filename_list" "manifests" {
    pattern = "./manifests/*.yaml"
}

resource "kubectl_manifest" "test" {
    count = length(data.kubectl_filename_list.manifests.matches)
    yaml_body = file(element(data.kubectl_filename_list.manifests.matches, count.index))
}

追加ポイントyamlファイルをテンプレート化できます。次のように、マルチリソースオートスケーラーのyamlファイルでクラスター名を補間します。

resource "kubectl_manifest" "autoscaler" {
  yaml_body = templatefile("${path.module}/autoscaler.yaml", {cluster_name = var.cluster_name })
}
6
david_g

やりたいことを達成するには、いくつかの方法があります。

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プロバイダー を使用することです。
それを構成するには2つの方法があります:

  • デフォルトでは、マニフェストは現在のコンテキスト(kubectl config current-context
  • 2番目の方法は、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"
    }
  }
}
5
Ricardo Jover

これを行うには、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
AnmolNagpal