K8s中Ingress无法识别FQDN类型EndpointSlice的问题排查
背景与需求
我正在搭建蓝绿部署环境,受跨应用限制,需要构建Ingress → 无标签选择器的Service → 带标签选择器的Service → Pods的流量路径,核心目标:
- Ingress转发流量到可频繁变更的服务名称,避免硬编码IP
- 支持跨命名空间甚至跨集群的服务访问
- 外部用户通过
app-live.mydomain.com访问Pod,集群内应用可通过live-svc.myNamespace.svc.cluster.local访问,且流量全程在集群内部流转,不能出集群再返回以满足延迟要求
问题现象
我尝试用ExternalName类型Service配合手动创建的FQDN类型EndpointSlice,但使用AWS ALB控制器时,控制器不支持ExternalName服务;即使把live-svc改成普通无选择器Service并绑定FQDN类型EndpointSlice,Ingress仍报错**「endpoints not found」**。
配置尝试
以下是我的配置文件:
无标签选择器的Service(live-svc)
apiVersion: v1 kind: Service metadata: name: live-svc namespace: myNamespace spec: #type: ExternalName #externalName: secondaryService.myNamespace.svc.cluster.local # 该服务已正确关联Pod ports: - name: https port: 443 protocol: TCP targetPort: https
FQDN类型EndpointSlice
apiVersion: discovery.k8s.io/v1 kind: EndpointSlice metadata: name: live-svc namespace: myNamespace labels: kubernetes.io/service-name: live-svc addressType: FQDN ports: - name: https protocol: TCP port: 443 endpoints: - addresses: - secondaryService.myNamespace.svc.cluster.local
Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: ... name: app-public namespace: myNamespace spec: rules: - host: app-live.mydomain.com http: paths: - backend: service: name: live-svc port: name: https path: / pathType: Prefix
核心疑问
我原以为EndpointSlice是Endpoints的替代方案且更推荐,现在是否必须改用Endpoints类型资源才能解决这个问题?
1. AWS ALB控制器的支持限制
AWS ALB控制器目前不支持FQDN类型的EndpointSlice,仅适配IP类型的EndpointSlice/Endpoints。这是配置后Ingress报错「endpoints not found」的核心原因。
2. 是否必须改用Endpoints资源?
是的,当前场景下必须改用传统Endpoints资源:
- 尽管EndpointSlice是官方推荐的Endpoints替代方案,但ALB控制器尚未适配FQDN类型的EndpointSlice
- 传统
Endpoints资源支持配置FQDN地址,完全满足你将流量转发到目标服务内部DNS的需求
3. 修正后的配置示例
无标签选择器的Service(live-svc)
保持原配置不变,无需设置type: ExternalName:
apiVersion: v1 kind: Service metadata: name: live-svc namespace: myNamespace spec: ports: - name: https port: 443 protocol: TCP targetPort: https
替换为Endpoints资源
apiVersion: v1 kind: Endpoints metadata: name: live-svc namespace: myNamespace subsets: - addresses: - hostname: secondaryService.myNamespace.svc.cluster.local ports: - name: https port: 443 protocol: TCP
Ingress配置
保持原配置不变即可。
4. 集群内访问验证
配置完成后,集群内Pod通过live-svc.myNamespace.svc.cluster.local访问时,Kubernetes DNS会解析到该Service的ClusterIP,再通过Endpoints配置的FQDN转发到目标服务,流量全程在集群内部流转,不会出集群,满足延迟要求。
5. 蓝绿切换适配
后续蓝绿切换时,只需修改Endpoints资源中的hostname字段,指向新的目标服务(比如primaryService.myNamespace.svc.cluster.local)即可,无需修改Ingress或live-svc的配置,完全符合“可频繁变更服务名称”的需求。
内容的提问来源于stack exchange,提问作者Hunter Carnes

