需配置externalname service将外部域名映射为集群内服务名,关键字段为type: externalname和externalname,不设selector、ports与clusterip;必须指定namespace以确保跨命名空间可解析;通过nslookup验证cname记录是否生效;修改externalname可动态切换外部地址,无需重启pod。

在Kubernetes集群中让内部应用通过统一服务名访问外部HTTP API、数据库域名或SaaS平台,需配置ExternalName Service将外部域名映射为集群内可解析的服务名,避免硬编码和DNS直连风险。
创建ExternalName Service资源
用YAML定义Service,关键字段是type: ExternalName和externalName,不写selector、不配ports、不生成ClusterIP。
在本地新建ext-svc.yaml文件,填入以下内容:
apiVersion: v1
kind: Service
metadata:
name: pay-gateway
namespace: finance
spec:
type: ExternalName
externalName: api.pay.example.com
执行kubectl apply -f ext-svc.yaml完成创建。
这一步不能漏掉namespace字段——如果省略,服务会落在default命名空间,而finance命名空间内的Pod无法直接用pay-gateway访问,必须写全pay-gateway.finance.svc.cluster.local。
验证DNS解析是否生效
进入集群内任意一个带nslookup或dig的Pod(如busybox、utils镜像):
kubectl run -it --rm --image=busybox:1.35 dns-test -- sh
在容器内执行:
nslookup pay-gateway.finance.svc.cluster.local
预期输出中应包含canonical name = api.pay.example.com.,且最终解析出A记录IP。
若返回** server can't find pay-gateway.finance.svc.cluster.local: NXDOMAIN,说明CoreDNS未加载该Service,检查命名空间是否存在、YAML语法是否正确、kubectl上下文是否指向目标集群。
跨命名空间调用的两种写法
方法一:显式写全DNS路径(推荐用于调试和跨命名空间场景)
在dev命名空间的Pod里访问finance下的ExternalName服务:curl http://pay-gateway.finance.svc.cluster.local/health
方法二:使用别名Service(仅限同命名空间)
若调用方也在finance命名空间,可直接用短名:curl http://pay-gateway/health
注意:ExternalName Service本身不转发流量,也不做端口映射。它只是让kube-dns返回一条CNAME记录。后端服务的端口、TLS、认证等全部由外部服务自己处理。
修改外部域名指向
第一步:编辑原有Service资源kubectl edit service pay-gateway -n finance
第二步:定位到externalName字段,把api.pay.example.com改为新地址staging-api.pay.example.com,保存退出。
第三步:等待CoreDNS刷新缓存(通常秒级),再次执行nslookup确认CNAME已变更。
这一步操作无需重启任何Pod,也不影响正在运行的连接——因为所有解析行为都发生在客户端发起请求前,变更后新发起的请求自动走新域名。











