如何通过Terraform的templatefile函数向K8s清单传递NodeSelector映射
实现动态传递多键值对NodeSelector到Kubernetes Deployment模板
步骤1:更新Terraform资源代码,传入node_selector变量
修改kubernetes_manifest资源的templatefile参数,将var.node_selector传递到模板上下文:
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 = var.node_selector # 新增参数,传入节点选择器映射 } ) ) }
步骤2:修改Deployment模板文件,动态生成nodeSelector字段
在模板的spec.template.spec区域添加动态生成逻辑,利用Terraform的循环和条件判断,支持多键值对且避免空字段:
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: ${if length(node_selector) > 0} nodeSelector: ${for key, value in node_selector}${key}: ${value} ${end} ${endif} containers: ...
关键说明
- 用
length(node_selector) > 0做判断,确保只有当节点选择器有值时才生成nodeSelector字段,避免无效YAML。 for key, value in node_selector循环遍历映射中的所有键值对,自动生成对应配置,完全支持多键值对传递,无需硬编码任何键名。- 语法适配Terraform v0.14.11,该版本已支持
templatefile中的循环与条件判断。
示例:当node_selector变量设置为:
variable "node_selector" { default = { "eks.amazonaws.com/nodegroup" = "app" "disktype" = "ssd" } }
模板会生成:
nodeSelector: eks.amazonaws.com/nodegroup: app disktype: ssd
内容的提问来源于stack exchange,提问作者Abdullah Khawer
相关产品推荐
相关产品推荐

