You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中helm_release资源配置nodeSelector调度服务到指定节点

配置方案

你当前的配置存在两个问题:一是参数名大小写错误,cert-manager官方Chart的控制器节点选择器参数为驼峰格式controller.nodeSelector,并非小写的nodeselector;二是多余的controller.空配置块可以直接删除。

以下是两种可用的配置方式,以节点标签node-role.kubernetes.io/infra: true、kubernetes.io/os: linux为例:

方式1:使用set块逐个配置

适合标签数量较少的场景,注意标签名中的特殊字符(点、斜杠)需要用双反斜杠转义:

resource "helm_release" "cert_manager" {
  namespace        = var.cert_manager_namespace
  name             = "cert-manager"
  repository       = "https://charts.jetstack.io"
  chart            = "cert-manager"
  version          = var.cert_manager_release_version
  create_namespace = true
  count            = var.enable

  # 配置controller组件的nodeSelector
  set {
    name  = "controller.nodeSelector.node-role\\.kubernetes\\.io/infra"
    value = "true"
  }
  set {
    name  = "controller.nodeSelector.kubernetes\\.io/os"
    value = "linux"
  }

  # 若需要webhook、cainjector组件也调度到目标节点,补充对应配置即可
  set {
    name  = "webhook.nodeSelector.node-role\\.kubernetes\\.io/infra"
    value = "true"
  }
  set {
    name  = "cainjector.nodeSelector.node-role\\.kubernetes\\.io/infra"
    value = "true"
  }

  set {
    name  = "installCRDs" # 仅首次部署时需要开启
    value = "true"
  }

  set {
    name  = "securityContext.enabled"
    value = "true"
  }
}

方式2:使用values参数批量配置

适合标签数量多、配置结构复杂的场景,无需处理特殊字符转义,可读性更高:

resource "helm_release" "cert_manager" {
  namespace        = var.cert_manager_namespace
  name             = "cert-manager"
  repository       = "https://charts.jetstack.io"
  chart            = "cert-manager"
  version          = var.cert_manager_release_version
  create_namespace = true
  count            = var.enable

  values = [
    yamlencode({
      # 三个核心组件统一配置nodeSelector
      controller = {
        nodeSelector = {
          "node-role.kubernetes.io/infra" = "true"
          "kubernetes.io/os"              = "linux"
        }
      }
      webhook = {
        nodeSelector = {
          "node-role.kubernetes.io/infra" = "true"
          "kubernetes.io/os"              = "linux"
        }
      }
      cainjector = {
        nodeSelector = {
          "node-role.kubernetes.io/infra" = "true"
          "kubernetes.io/os"              = "linux"
        }
      }
      installCRDs = true
      securityContext = {
        enabled = true
      }
    })
  ]
}

Ambassador服务配置逻辑

Ambassador(现已更名为Emissary Ingress)的配置逻辑完全一致,只需先确认对应Helm Chart的nodeSelector参数路径,再按上述两种方式配置即可:

  • 若为全局节点选择器,参数路径通常为nodeSelector
  • 若为组件级节点选择器,按Chart文档给出的路径替换即可

验证方法

部署完成后执行以下命令,确认Pod是否调度到目标节点:

kubectl get pod -n <对应命名空间> -o wide

内容的提问来源于stack exchange,提问作者n1vgabay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:15:01