使用单个Ingress Controller对接多服务的Helm配置问题咨询
1. 跨命名空间服务是否可以共用同一个Ingress Controller?
可以。只要你部署Ingress Controller时没有通过--watch-namespace参数指定只监听特定命名空间,默认会全局监听集群所有命名空间下的Ingress资源,自动合并所有匹配对应ingress.class的Ingress规则,不管服务部署在哪个命名空间都可以共用同一个Controller。
2. 报错原因及修复方案
报错根因
你当前的Ingress.yaml里写死了资源名称为dev-ingress,每次部署新服务时都会尝试在对应命名空间下创建同名的Ingress资源。而Helm会为自己管理的所有资源打上所有权标签/注解,同一个资源不能被多个Helm Release同时管理,因此第二次部署时就会触发所有权校验冲突的报错。
最佳修复方案(推荐)
不需要强行把所有服务的路由规则塞到同一个Ingress资源里,Ingress Controller会自动合并所有同ingress.class的Ingress规则,你只需要给每个服务配置独立的Ingress资源即可,修改逻辑如下:
修改Ingress.yaml,将Ingress名称参数化,保证每个服务的Ingress资源唯一:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: # 用应用名拼接Ingress名称,保证唯一性 name: {{ .Values.metadata.name }}-ingress {{- if .Values.ingress.management.annotations }} annotations: {{ toYaml .Values.ingress.management.annotations | indent 4 }} {{- end }} spec: rules: - http: paths: - backend: serviceName: {{ .Values.metadata.name }}-svc servicePort: 80 path: /{{ .Values.env.path }}
修改后每个服务部署时都会创建自己专属的Ingress资源,所有权归对应服务的Helm Release,互不冲突,所有规则都会被同一个Ingress Controller自动识别合并,完全满足你共用Controller的需求。
可选方案(仅当你必须共用同一个Ingress资源时使用)
如果你确实需要所有服务共用同一个Ingress资源,需要把Ingress从单个服务的Chart中拆分出来,单独做成一个独立的Helm Chart,所有服务的路由规则作为该Chart的values参数统一维护,每次新增服务时单独更新这个Ingress专属的Helm Release即可。这种方案耦合度较高,需要同步维护所有服务的路由规则,不推荐使用。
内容的提问来源于stack exchange,提问作者megha

