kubernetes 如何使用templatefile函数将Terraform中的map传递给manifest yaml文件来设置NodeSelector?

p5fdfcr1  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(99)

我在Terraform中有一个manifest yaml文件,用于在Kubernetes集群上部署部署,我想通过templatefile函数将具有定义节点选择器的键值对的Map传递给yaml文件,以在其上设置nodeSelector
下面是我的Terraform代码的样子:

...
resource "kubernetes_manifest" "deployment" {
  manifest = yamldecode(
    templatefile("${path.module}/resources/deployment-tmpl.yaml",
      {
        app_name      = var.app_name,
        app_namespace = var.app_namespace
    })
  )
}
...

字符串
下面是我的manifest yaml代码的样子:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: ${app_name}
  name: ${app_name}
  namespace: ${app_namespace}
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: ${app_name}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ${app_name}
    spec:
      containers:
        ...
...


我的节点选择器变量可能看起来像这样:

variable "node_selector" {
  default = {
    "eks.amazonaws.com/nodegroup" = "app"
  }
}


Terraform版本是v0.14.11
在我的情况下,我该怎么做呢?我不想硬编码,我想发送一个Map,其中可以有一个或多个键值对。

nnvyjq4y

nnvyjq4y1#

在这种情况下,可以使用Terraform中的templatefile函数中的yamlencode来实现。
我已将manifest yaml文件更改如下:

...
    spec:
      nodeSelector:
        ${node_selector}
      containers:
...

字符串
我修改了Terraform文件如下:

...
resource "kubernetes_manifest" "deployment" {
  manifest = yamldecode(
    templatefile("${path.module}/resources/deployment-tmpl.yaml",
      {
        app_name      = var.app_name,
        app_namespace = var.app_namespace,
        node_selector = yamlencode(var.node_selector)
    })
  )
}
...


节点选择器变量将保持不变,并且可以有多个键值对:

variable "node_selector" {
  default = {
    "eks.amazonaws.com/nodegroup" = "app"
  }
}


参考:Terraform - templatefile Function

相关问题