V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
asilin
V2EX  ›  Kubernetes

如何在 k8s 的 coredns 中设定,部分域名转发到某一个 pod(提供了 DNS 服务)来解析?

  •  
  •   asilin · 2021-12-04 11:23:33 +08:00 · 2281 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,业务上部分域名(a.b.com)需要使用自定义 DNS 来解析,这在 CoreDNS 中很好设置,使用如下形式:

    a.b.com:53 {
        forward . 192.168.123.45:5353
    }
    

    上述配置,将告诉 CoreDNS 遇到 a.b.com 及其子域的查询,就转到 192.168.123.45:5353 这个 DNS 。

    但是现在有一个需求,提供 192.168.123.45:5353 的机器是单点的,所以就想把 a.b.com 子域查询的 DNS 服务部署在 k8s 集群中,享受 Pod 带来的所有便利。

    所以,问题就是如何将请求转发给这个 Pod 呢?写死 Pod IP 肯定不行,因为 IP 会变; 使用 NodePort 将端口映射出来,再写死 NodePort IP ,嗯... 也是一种办法,但不是很优雅。

    有没有 V 友能够解答下?

    第 1 条附言  ·  2021-12-04 18:16:29 +08:00
    在 SF 上找到有一个相同需求的问题: https://stackoverflow.com/questions/64167215/coredns-forward-plugin-to-use-a-k8s-service-name

    从唯一的回答来看,仅靠 CoreDNS 本身,是无法实现将某一个域名解析的 upstream dns 设置为 k8s 的 service 域名的。
    15 条回复    2021-12-04 23:22:48 +08:00
    liuliuball
        1
    liuliuball  
       2021-12-04 11:29:21 +08:00 via iPhone
    能 forward 到 service 吗
    asilin
        2
    asilin  
    OP
       2021-12-04 11:30:10 +08:00 via Android
    @liuliuball 就是这么想的,但是查找了 Google 和官方文档,没发现类似写法
    swulling
        3
    swulling  
       2021-12-04 11:37:19 +08:00 via iPhone
    用 rewrite
    https://coredns.io/2017/05/08/custom-dns-entries-for-kubernetes/

    前一个项目里用过。

    rewrite name foo.example.com foo.default.svc.cluster.local
    asilin
        4
    asilin  
    OP
       2021-12-04 11:44:43 +08:00 via Android
    @swulling 子域或者泛域名解析也可以吗?我试试
    Infinitify
        5
    Infinitify  
       2021-12-04 13:19:36 +08:00
    @asilin 这个设配好了,估计宝塔也可以跑在 K8S 中了。
    swulling
        6
    swulling  
       2021-12-04 14:41:41 +08:00 via iPhone
    @asilin 功能很强大,别说子域名了,正则匹配都行

    https://coredns.io/plugins/rewrite/
    wd
        7
    wd  
       2021-12-04 17:05:08 +08:00 via iPhone
    给你的 service 设置一个固定的 ip 不就可以了么
    yprisoner
        8
    yprisoner  
       2021-12-04 17:18:13 +08:00
    用 service externalName 可以吗
    asilin
        9
    asilin  
    OP
       2021-12-04 17:40:08 +08:00 via Android
    @wd 因为 coredns 不能随便修改(不由我们控制),如果我这边把 service 删除了,或者 ip 被占用了,就不太符合预期了。
    asilin
        10
    asilin  
    OP
       2021-12-04 17:40:40 +08:00 via Android
    @yprisoner 需要子域或者泛域名解析
    asilin
        11
    asilin  
    OP
       2021-12-04 18:22:55 +08:00
    @swulling #6 rewrite 本身是在 CoreDNS 内部解决 DNS 的请求转换,而不是将解析送给上有的 DNS 服务器,应该不满足我的需求。
    v2000000001ex
        12
    v2000000001ex  
       2021-12-04 18:30:32 +08:00
    配合 dnsmasq 一起使用?
    asilin
        13
    asilin  
    OP
       2021-12-04 18:33:36 +08:00
    @v2000000001ex #12 是的,就是想将 dnsmasq 作为上游 DNS ,运行在 k8s 集群中,自定义某些特定域名及其子域名的解析。
    wd
        14
    wd  
       2021-12-04 23:14:45 +08:00 via iPhone
    @asilin 不理解 你这个服务如果是你自己的,为什么会出现你说的情况呢? ip 你先占到了在改 coredns 啊,service 为啥会被删除?如果删除不就是不想提供服务了吗?不改 coredns 顶多就是你那个自定义域名不能解析
    asilin
        15
    asilin  
    OP
       2021-12-04 23:22:48 +08:00
    @wd #14 具体需求就是 k8s 不由我们掌控,偶尔让对方修改一次 CoreDNS 还可以,多次修改可能会拒绝。

    当 service 被删除(无论是有意还是无意),都会导致 service ip 变化,但是 service name 是恒定的。

    所以,希望在 CoreDNS 中填写一个恒定的 service name ,比多次让对方修改变化的 service ip ,更现实。

    当然了,如果 service 不会被删除,那 service ip 肯定不会变,这种情况下 service ip 也是最佳方案。

    最理想的当然是 forward 到 恒定的 service name 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5403 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:20 · PVG 16:20 · LAX 00:20 · JFK 03:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.