如何正确使用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
之前配置报错的原因
- 第一次尝试用
controller.affinity[0]将affinity当作数组处理,但K8s的Affinity是对象而非数组,因此报错expected map instead of array; - 第三次直接给
controller.affinity添加key字段,但Affinity结构体本身没有该字段,key属于嵌套在matchExpressions内的子属性,所以触发unknown field "key" in io.k8s.api.core.v1.Affinity错误。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

