如何使用Terraform通过YAML部署Kubernetes服务?

btxsgosb  于 2023-02-18  发布在  Kubernetes
关注(0)|答案(2)|浏览(213)

我正在学习Kubernetes,我的目标是通过terraform(Kubernetes提供程序)使用Yaml文件部署Kubernetes。
作为per,我知道我可以将ConfigMap作为资源,例如:

resource "kubernetes_config_map" "config" {
  metadata {
    namespace = "metallb_system"
    name = "config"
  }
  data {
    config = "${file(${path.module}/config.yml)}"
  }
}

现在我想部署一个服务,在HCL中如下所示:

resource "kubernetes_service" "nginx" {

  metadata {
    name = "nginx-example-bla"
  }
  spec {
    selector = {
      App = kubernetes_pod.airflow.metadata[0].labels.App
    }
    port {
      port        = 80
      target_port = 8080
    }

    type = "LoadBalancer"
  }
}

但是我想用yaml来代替HCL。
因此(假设),我希望能够做一些类似的事情:

resource "kubernetes_service" "nginx" {
  file = kubernetes_config_map.config  # Not sure if ConfigMap is the right usage here but I want to be able to deploy a service through Yaml
}
w1e3prcc

w1e3prcc1#

Terraform只跟踪用HCL添加的资源,而file()只添加内容。所以如果你想让Terraform管理你的k8s资源(检测这些资源的更改或删除),你必须坚持这一点。
如果你只是想使用terraform来部署你的YAML文件,你可以使用一个“null_resource”来运行命令:

resource "null_resource" "deploy-yaml" {

  provisioner "local-exec" {
      command = "kubectl apply -f xxx.yaml"
  }
}

如果你这样做,请记住,terraform现在没有任何变化检测。因此,如果YAML发生了变化,terraform并不知道。你必须通过快速和肮脏地更改资源名称或使用一些总是变化的值(例如random_uuid)来重新运行脚本。

r6hnlfcb

r6hnlfcb2#

您可以使用kubernetes_manifest来实现此目的。引用its docs
通过提供manifest属性来表示一个Kubernetes资源。manifest值是Kubernetes YAML清单的HCL表示形式。要将现有清单从YAML转换为HCL,可以使用Terraform内置函数yamldecode()tfk8s
因此,您可以:

resource "kubernetes_manifest" "test" {
  manifest = yamldecode(file("${path.module}/config.yml"))
}

相关问题