Kubernetes ExternalName类型Service关联Ingress时提示端点未找到但业务正常
<error: endpoints "xxx" not found>的原因 你遇到的这个报错不是Kubernetes的Bug,而是ExternalName类型Service的特性导致的,完全不影响业务运行是正常情况,下面详细解释:
1. 为什么会出现这个错误?
ExternalName Service是Kubernetes里一种特殊的Service类型:它的作用仅仅是给外部服务做一个DNS别名,不会创建对应的Endpoints资源——因为它不需要绑定Kubernetes集群内的Pod,只是把请求转发到externalName字段指定的外部域名。
而kubectl describe ingress命令在展示Ingress详情时,会尝试去查询关联Service对应的Endpoints资源,确认后端的可达性。但对于ExternalName Service来说,这个Endpoints根本不存在,所以就会抛出<error: endpoints "test-external-service" not found>的提示。
2. 为什么业务能正常运行?
NGINX Ingress Controller在处理关联ExternalName Service的Ingress规则时,并不会依赖Kubernetes的Endpoints资源:它会直接解析Service的externalName字段对应的域名,把请求转发到外部服务。所以只要你的外部Elasticsearch服务正常,Ingress就能正常转发请求,和这个报错完全无关。
3. 有没有遗漏配置?
没有遗漏任何必要配置,这是ExternalName Service和kubectl describe命令交互时的正常现象。
如果实在不想看到这个报错,你可以改用ClusterIP类型Service+手动创建Endpoints的方式来指向外部服务,但这样反而增加了配置复杂度(需要手动维护Endpoints的IP),完全没必要——毕竟这个报错只是kubectl describe的信息提示,不影响实际功能。
附你的配置参考
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: platform resources: - test-ingress.yaml - test-service.yaml generatorOptions: disableNameSuffixHash: true
test-service.yaml
apiVersion: v1 kind: Service metadata: name: test-external-service namespace: platform spec: type: ExternalName externalName: "some-working-external-elasticsearch-service"
test-ingress.yaml
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test-ingress annotations: kubernetes.io/ingress.class: nginx-external nginx.ingress.kubernetes.io/configuration-snippet: | proxy_cache_bypass $http_upgrade; spec: rules: - host: testapi.mydomain.com http: paths: - path: / backend: serviceName: test-external-service servicePort: 9200
内容的提问来源于stack exchange,提问作者TomG

