如何在 terraform 中运行 kubectl apply 命令

Sun*_*ula 21 kubernetes google-kubernetes-engine terraform

我开发了一个 terraform 脚本来在 GKE 上创建一个 k8 集群。

成功创建集群后,我有一组要应用于 k8 集群的 yaml 文件。

如何在我的 terraform 脚本中调用以下命令?

kubectl create <.yaml>
Run Code Online (Sandbox Code Playgroud)

dav*_*d_g 36

您可以使用 Terraformkubectl第三方提供程序。按照此处的安装说明进行操作: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")
}
Run Code Online (Sandbox Code Playgroud)

这种方法的一大优势是所有内容都是动态获取的,并且不依赖于任何本地配置文件(如果您在 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))
}
Run Code Online (Sandbox Code Playgroud)

加分项:您可以模板化您的yaml文件。我在多资源自动缩放器 yaml 文件中插入集群名称,如下所示:

resource "kubectl_manifest" "autoscaler" {
  yaml_body = templatefile("${path.module}/autoscaler.yaml", {cluster_name = var.cluster_name })
}
Run Code Online (Sandbox Code Playgroud)

  • 我想在 terraform 云中使用它,但“kubectl”提供程序未发布到注册表,因此它失败。我怎样才能克服这个问题? (2认同)
  • @ChristopherMarkieta,提供程序可以正确处理多个对象,但您必须首先使用“kubectl_filename_list”数据来分割它们。请参阅上面的示例。我还更新了链接。 (2认同)

Ric*_*ver 13

有几种方法可以实现您想要做的事情。

您可以使用 Terraform 资源template_filenull_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"
  }
}
Run Code Online (Sandbox Code Playgroud)

但也许最好的方法是使用Kubernetes provider
有两种配置方式:

  • 默认情况下,您的清单将部署在您当前的上下文中 ( 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")}"
}
Run Code Online (Sandbox Code Playgroud)

完成后,您可以非常轻松地创建自己的部署。对于基本的 pod,它会很简单:

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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Que*_*vel -11

最好的方法是使用Terraform 的Kubernetes提供程序

  • 如果您提供一个简单、有效的示例,而不是仅仅链接到 Kubernetes 提供程序文档,这个答案会更好。 (5认同)
  • 使用当前版本的 kubernetes 提供程序,无法应用 .yaml 文件。请参阅 https://github.com/terraform-providers/terraform-provider-kubernetes/issues/141 (4认同)