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
相关产品推荐
相关产品推荐

