如何在单个kind Kubernetes集群中部署两个ingress-nginx控制器
解决方案
1. 是否需要将第二个控制器Pod调度到不同节点?
是的,这是解决端口冲突的直接有效方式,需要调整控制器的调度规则适配:
- 若控制器以DaemonSet部署:修改其
nodeSelector或affinity配置,给目标节点打专属标签后,让第二个控制器仅调度到未运行第一个控制器的节点。 - 若控制器以Deployment部署:添加
podAntiAffinity规则,强制两个控制器Pod不被调度到同一节点,示例配置如下:
配置后Kubernetes会自动将第二个控制器Pod调度到空闲节点,规避端口占用问题。affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app.kubernetes.io/name operator: In values: - ingress-nginx topologyKey: kubernetes.io/hostname
2. Kind能否将多个节点的相同端口映射到宿主机?
不能。宿主机的TCP/UDP端口是全局唯一的,无法同时被多个Kind节点(本质是Docker容器)占用同一个宿主机端口。因此两个ingress控制器若都使用默认的80/443 NodePort,必然会触发端口映射冲突。
替代方案
方案A:为第二个控制器配置自定义NodePort
修改第二个ingress控制器的Service资源,指定非默认的NodePort端口,比如30080(对应宿主机8080)和30443(对应宿主机8443):
apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller-2 namespace: your-second-namespace spec: type: NodePort ports: - name: http port: 80 targetPort: 80 nodePort: 30080 - name: https port: 443 targetPort: 443 nodePort: 30443 selector: app.kubernetes.io/name: ingress-nginx-2
同时在创建Kind集群的配置文件kind-config.yaml中添加对应端口映射:
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker extraPortMappings: - containerPort: 30080 hostPort: 8080 listenAddress: "0.0.0.0" protocol: TCP - containerPort: 30443 hostPort: 8443 listenAddress: "0.0.0.0" protocol: TCP
完成后访问宿主机的8080/8443即可转发到第二个ingress控制器。
方案B:用IngressClass区分控制器(推荐)
如果不需要独立端口,仅需通过域名区分两个应用,可以复用同一套ingress控制器资源:为两个应用的Ingress配置不同域名,或者为第二个控制器配置专属IngressClass,让不同Ingress资源绑定对应控制器。这种方式无需额外端口映射,从根源避免冲突。
示例专属IngressClass配置:
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: nginx-2 spec: controller: k8s.io/ingress-nginx-2
第二个应用的Ingress资源只需指定ingressClassName: nginx-2即可绑定到对应控制器。
内容的提问来源于stack exchange,提问作者Andriy Simonov
相关产品推荐
相关产品推荐

