Kubernetes如何将.svc.cluster.local流量重定向到自定义svc域名
解决方案:CoreDNS全局rewrite规则配置
你之前测试的ExternalName Service是单Namespace下的单个服务别名,无法覆盖全集群所有.svc.cluster.local后缀的解析请求,因此没有生效。可以通过修改CoreDNS的全局配置实现自动域名重写,无需修改任何上层应用的YAML配置,操作步骤如下:
步骤1:修改CoreDNS Corefile配置
CoreDNS的默认配置以ConfigMap形式存放在kube-system命名空间下,执行以下命令编辑:
kubectl edit configmap coredns -n kube-system
在Corefile的kubernetes配置段上方新增rewrite正则匹配规则,修改后完整配置参考如下:
.:53 { errors health # 新增规则:将所有*.svc.cluster.local查询自动重写为*.svc.k8s.my-domain.com rewrite name regex (.*)\.svc\.cluster\.local {1}.svc.k8s.my-domain.com answer auto kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance }
该规则会自动匹配所有以.svc.cluster.local为后缀的域名解析请求,替换为你自定义的.svc.k8s.my-domain.com后缀后再执行解析,同时应答内容会自动适配原请求域名,客户端侧完全无感知。
步骤2:验证配置生效
保存ConfigMap后CoreDNS会自动热加载配置,等待1~2分钟后进入任意运行中的Pod执行解析测试:
nslookup dgraph-service.dgraph-namespace.svc.cluster.local
如果返回结果与直接解析dgraph-service.dgraph-namespace.svc.k8s.my-domain.com的ClusterIP一致,说明配置已生效。
注意事项
- 若你的CoreDNS通过Helm部署,不要直接修改ConfigMap,需要更新Helm Values中的Corefile配置,避免后续版本升级时自定义配置被覆盖
- 该规则不会影响原生
.svc.k8s.my-domain.com后缀、或不带后缀的短域名解析能力,原有正常通信的地址不受影响 - 若解析未生效可查看CoreDNS Pod日志排查规则匹配情况:
kubectl logs -n kube-system -l k8s-app=kube-dns
内容的提问来源于stack exchange,提问作者Hongbo Miao
相关产品推荐
相关产品推荐

