【问题标题】:How do I deploy a Kubernetes service through YAML using Terraform?如何使用 Terraform 通过 YAML 部署 Kubernetes 服务?
【发布时间】:2021-03-20 13:38:05
【问题描述】:

我正在学习 Kubernetes,我的目标是部署 Kubernetes,但通过 terraform (Kubernetes provider) 使用 Yaml 文件。我举个例子来说明:

作为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
}

【问题讨论】:

    标签: kubernetes terraform


    【解决方案1】:

    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)来重新运行脚本来触发它。

    【讨论】:

    • 很好的答案。只是补充;如果您在管道中执行此操作,请确保下载 kubeconfig 文件并在 kubectl 命令中使用它。
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 2017-10-12
    • 2021-09-27
    • 1970-01-01
    • 2021-12-08
    • 2021-12-19
    • 2020-06-26
    • 2021-11-05
    相关资源
    最近更新 更多