如何在GKE的kube-dns中通过FQDN路由流量并实现域名重写?
rewrite name功能的方案 针对你在GKE集群中需要将servicename-d1.subdomain.example.com重写为servicename.d1.svc.cluster.local的需求,以下是几种可行方案:
方案一:切换到CoreDNS(推荐)
kube-dns本身不支持域名重写功能,最直接的方式是切换到GKE支持的CoreDNS,利用其原生的rewrite插件实现需求。
切换集群DNS到CoreDNS
执行gcloud命令完成切换:gcloud container clusters update YOUR_CLUSTER_NAME --zone YOUR_ZONE --dns-cluster-scope coredns替换
YOUR_CLUSTER_NAME和YOUR_ZONE为你的集群实际信息。配置CoreDNS的Rewrite规则
- 编辑CoreDNS的ConfigMap:
kubectl edit configmap coredns -n kube-system - 在Corefile块中添加rewrite规则,示例配置如下:
.:53 { errors health # 重写规则:匹配xxx-d1.subdomain.example.com -> xxx.d1.svc.cluster.local rewrite name regex (.*)-d1\.subdomain\.example\.com {1}.d1.svc.cluster.local kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa } forward . /etc/resolv.conf cache 30 loop reload loadbalance }
- 编辑CoreDNS的ConfigMap:
生效配置并验证
重启CoreDNS Pod让配置生效:kubectl rollout restart deployment coredns -n kube-system在集群内任意Pod中测试解析:
nslookup servicename-d1.subdomain.example.com若返回对应服务的ClusterIP,说明配置生效。
方案二:部署自定义CoreDNS转发器(不替换kube-dns)
如果不想替换默认的kube-dns,可以单独部署一个CoreDNS实例专门处理公司域名的重写:
部署自定义CoreDNS
- 创建ConfigMap存储自定义CoreDNS配置:
apiVersion: v1 kind: ConfigMap metadata: name: custom-coredns namespace: kube-system data: Corefile: | subdomain.example.com:53 { rewrite name regex (.*)-d1\.subdomain\.example\.com {1}.d1.svc.cluster.local forward . kube-dns.kube-system.svc.cluster.local cache 30 } - 基于此ConfigMap部署CoreDNS的Deployment和ClusterIP Service,确保服务能被集群内Pod访问。
- 创建ConfigMap存储自定义CoreDNS配置:
调整集群DNS转发
编辑kube-dns的ConfigMap,将subdomain.example.com的请求转发到自定义CoreDNS的Service地址,或者修改Pod的dnsPolicy为None并指定自定义CoreDNS为nameserver(此方式需修改Pod配置,灵活性较低)。
方案三:ExternalName Service(仅适用于固定服务)
如果你的服务是固定的,而非动态生成的任意名称,可以为每个服务创建ExternalName Service实现映射:
apiVersion: v1 kind: Service metadata: name: servicename-d1-proxy namespace: d1 spec: type: ExternalName externalName: servicename.d1.svc.cluster.local
需配合公司内部DNS配置,将subdomain.example.com指向集群DNS服务器,才能让Pod通过servicename-d1-proxy.subdomain.example.com访问目标服务。此方案无法处理动态服务名称的场景。
阻止外部请求访问
- 不在公网DNS中配置
subdomain.example.com的解析记录,确保外部无法解析到集群内部服务。 - 配置Kubernetes NetworkPolicy,仅允许集群内部Pod之间的通信,禁止外部流量访问目标服务。
内容的提问来源于stack exchange,提问作者ghitesh

