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

如何正确使用controller.affinity注解?Helm部署Nginx Ingress疑问

正确配置NGINX Ingress Controller的controller.affinity

你的问题核心在于Affinity和Tolerations的Kubernetes API结构完全不同:

  • tolerations是数组(列表)类型,所以可以用[0]指定第一个元素;
  • 而affinity是嵌套的Map对象,必须严格遵循Kubernetes的Affinity结构体配置,它包含nodeAffinity、podAffinity、podAntiAffinity三个核心子字段,具体的亲和规则要定义在这些子字段之下。

正确配置示例(节点亲和性)

如果要调度Ingress Controller到带有指定标签的节点,用--set的写法如下:

--set controller.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key=key_here \
--set controller.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator=In \
--set controller.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]=value_here

如果是简单的等值匹配标签,可简化为:

--set controller.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchLabels.key_here=value_here

Pod亲和性/反亲和性配置示例

如果要避免Ingress Controller和特定Pod调度到同一节点(Pod反亲和性):

--set controller.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchLabels.app=example \
--set controller.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].topologyKey=kubernetes.io/hostname

之前配置报错的原因

  1. 第一次尝试用controller.affinity[0]将affinity当作数组处理,但K8s的Affinity是对象而非数组,因此报错expected map instead of array;
  2. 第三次直接给controller.affinity添加key字段,但Affinity结构体本身没有该字段,key属于嵌套在matchExpressions内的子属性,所以触发unknown field "key" in io.k8s.api.core.v1.Affinity错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:05:16