GKE中Ingress指向跨命名空间ExternalName服务不生效问题求解
问题根因
你遇到的报错是GKE默认的GCE Ingress控制器本身的限制导致的:
- GCE Ingress不支持将ExternalName类型的Service作为后端,要求后端必须是ClusterIP、NodePort、LoadBalancer类型,且必须存在关联的Endpoints对象
- 你当前的ExternalName Service没有声明ports配置,也会导致控制器无法识别80端口配置
可选解决方案
方案1:直接将Ingress部署在me命名空间(最简推荐)
如果没有必须将Ingress放在main命名空间的强制要求,直接把Ingress资源部署在me命名空间,直接指向同命名空间下的me-service即可,完全不需要跨命名空间的额外配置,修改后Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: gce name: main-router namespace: me # 改到me命名空间 spec: rules: - host: some-domain.me http: paths: - backend: service: name: me-service port: number: 80 path: / pathType: ImplementationSpecific
删除不需要的main命名空间和对应的ExternalName Service即可正常运行。
方案2:main命名空间手动配置Service+Endpoints(适配GCE Ingress)
如果必须将Ingress放在main命名空间,将原来的ExternalName Service替换为无selector的ClusterIP Service + 手动Endpoints,指向me命名空间下Service的ClusterIP:
- 先获取
me命名空间下me-service的ClusterIP:
kubectl get svc me-service -n me -o jsonpath='{.spec.clusterIP}'
- 替换
main命名空间下的Service配置:
apiVersion: v1 kind: Service metadata: name: me-service namespace: main spec: ports: - port: 80 protocol: TCP targetPort: 80 type: ClusterIP --- apiVersion: v1 kind: Endpoints metadata: name: me-service namespace: main subsets: - addresses: - ip: 【替换为上一步查到的ClusterIP】 ports: - port: 80 protocol: TCP
Ingress配置无需修改,重新apply后GCE Ingress即可正常识别后端。
注意:如果
me命名空间的me-service重建,ClusterIP会发生变化,需要同步更新此处Endpoints的IP地址。
方案3:切换为Nginx Ingress控制器(支持ExternalName)
Nginx Ingress控制器原生支持ExternalName类型的Service作为后端,操作如下:
- 先在GKE集群中部署Nginx Ingress控制器
- 给
main命名空间的ExternalName Service补充ports配置:
apiVersion: v1 kind: Service metadata: name: me-service namespace: main spec: externalName: me-service.me.svc.cluster.local type: ExternalName ports: - port: 80 protocol: TCP targetPort: 80
- 修改Ingress的ingress.class注解为
nginx:
metadata: annotations: kubernetes.io/ingress.class: nginx
内容的提问来源于stack exchange,提问作者HyeonJunOh
相关产品推荐
相关产品推荐

