You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GKE的kube-dns中通过FQDN路由流量并实现域名重写?

实现kube-dns等价于CoreDNS rewrite name功能的方案

针对你在GKE集群中需要将servicename-d1.subdomain.example.com重写为servicename.d1.svc.cluster.local的需求,以下是几种可行方案:

方案一:切换到CoreDNS(推荐)

kube-dns本身不支持域名重写功能,最直接的方式是切换到GKE支持的CoreDNS,利用其原生的rewrite插件实现需求。

  1. 切换集群DNS到CoreDNS
    执行gcloud命令完成切换:

    gcloud container clusters update YOUR_CLUSTER_NAME --zone YOUR_ZONE --dns-cluster-scope coredns
    

    替换YOUR_CLUSTER_NAME和YOUR_ZONE为你的集群实际信息。

  2. 配置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
      }
      
  3. 生效配置并验证
    重启CoreDNS Pod让配置生效:

    kubectl rollout restart deployment coredns -n kube-system
    

    在集群内任意Pod中测试解析:

    nslookup servicename-d1.subdomain.example.com
    

    若返回对应服务的ClusterIP,说明配置生效。

方案二:部署自定义CoreDNS转发器(不替换kube-dns)

如果不想替换默认的kube-dns,可以单独部署一个CoreDNS实例专门处理公司域名的重写:

  1. 部署自定义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访问。
  2. 调整集群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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:45:38