CoreDNS实现跨集群service解析实践

news/2024/9/29 3:32:34/

CoreDNS实现跨集群service解析实践

  • 背景介绍
  • 使用条件
  • 实现方案

CoreDNS是一款使用Go语言实现的专为云原生应用而生的DNS服务器。本文介绍CoreDNS在特定实际场景下的一种进阶使用实践,也许能为其他也在使用CoreDNS做服务发现的同学提供一些启发和思考。

背景介绍

在我们的实际生产环境中,往往会将关键服务部署在各自独立的k8s集群中,一方面是为了减小故障半径,另一方面也是为了资源最优分配(不同业务对机型、规格要求不同,比如计算型服务、存储型服务对机型有各自比较严格的要求才能实现机器资源的最佳利用)。

然而这些服务之间往往又不是逻辑独立的,相互之间存在依赖关系。比如服务A部署在k8s集群1中,服务B部署在k8s集群2中,而服务A、B之间存在依赖关系,服务A需要调用B提供的接口实现某些功能。这个时候就需要服务A能够通过某种方式能直接访问到服务B。

在我们的生产环境中存在大量的内部服务,相互之间有错综复杂的调用关系(数百个内部服务,分布在数十个不同的k8s集群上)。为了应对这些内部服务之间的服务发现需求,在我们的生产环境中借助CoreDNS来实现跨k8s集群的service域名解析。

使用条件

使用CoreDNS来实现跨集群的service域名解析并达到服务发现的效果,是需要有一些前提条件的。

  1. 跨集群POD IP可直通。这也就意味着,在k8s集群1上的业务POD A中,只要获取到k8s集群2上业务POD B的POD IP,就可以通过这个POD IP进行直接通信。这就要求容器网络插件能提供支持(比如Cilium就能实现这种跨集群POD直通),在我们内部是自研了一套网络插件,实现了跨集群POD IP直通,具备了本文方案的基础。

  2. 跨集群服务使用headless service的FQDN域名。由于本质上跨集群的服务通信是依赖于POD IP,即最终要解析得到对端服务的POD IP,这就意味着我们可以通过headless service的FQDN作为服务域名。一个完整的headless service格式为:
    {service_name}.{namespace}.svc.{cluster_domain}

  3. 每个k8s集群都有唯一的cluster domain。有了多集群中之后,为了唯一标识一个k8s集群,我们在创建k8s集群的时候就为其指定了独一无二的cluster domain,即/etc/kubernetes/kubelet-config.yaml中的clusterDomain字段(该字段如果不设置的话,默认为cluster.local)。指定了该字段之后,在创建dnsPolicy为ClusterFirst/ClusterFirstWithHostNet等业务POD时,POD的/etcd/resolv.conf中search域就会带上该cluster domain。如果创建k8s集群时没有指定的话,search域默认为:

search {ns}.svc.cluster.local svc.cluster.local cluster.local

有了上述3个前提之后,我们就可以设计CoreDNS跨集群service解析的方案了。

实现方案

在我们的方案中,主要利用CoreDNS forward插件能力。具体来说,将每个k8s集群独一无二的cluster domain作为Corefile的一个zone,然后CoreDNS在解析FQDN格式的service时,匹配到某个zone(cluster domain)时,就请求forward到对应的k8s集群的CoreDNS。

现在以两个k8s集群(cluster domain配置分别为cluster1.local、cluster2.local)为例说明实施步骤:

  1. 分别在两个k8s集群中为CoreDNS创建NodePort service(默认端口范围为30000-32768,这里选择的端口为32710):
    在这里插入图片描述
  2. 分别配置两个k8s集群中Corefile(一般为kube-system命名空间下的coredns configmap):
    在这里插入图片描述
  3. 等待CoreDNS自动reload Corefile之后,即可跨集群解析headless service了。

http://www.ppmy.cn/news/1530668.html

相关文章

使用AI进行需求分析的案例研究

生成式 AI 的潜在应用场景似乎无穷无尽。虽然这令人兴奋,但也可能让人不知所措。因此,团队在使用这项技术时需要有明确的目标:关键是要明确生成式 AI 在团队工作中能产生哪些实质性影响。 在软件工程中,一个引人注目的应用场景是…

Python Web 面试题

1 Web 相关 get 和 post 区别 get: 请求数据在 URL 末尾,URL 长度有限制 请求幂等,即无论请求多少次,服务器响应始终相同,这是因为 get 至少获取资源,而不修改资源 可以被浏览器缓存,以便以后…

LeetCode 1014. 最佳观光组合 一次遍历数组,时间复杂度O(n)

1014. 最佳观光组合 today 1014 最佳观光组合 题目描述 给定正整数数组 A&#xff0c;A[i] 表示第 i 个观光景点的评分&#xff0c;评分由 1 到 10^6 之间的整数。 一对景点&#xff08;A[i], A[j]&#xff09;的观光总得分为 A[i] A[j] i - j&#xff0c;其中 i < j。…

付费进群V5版本首发源码

付费进群V5版本首发 最新分站大屏 更新三个模板 仿官方模板等等 最新防注入技术 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89797314 更多资源下载&#xff1a;关注我。

【递归】5.leetcode 872 叶子相似的树

1 题目描述 题目链接&#xff1a;叶子相似的树 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关…

工业交换机如何保证数据的访问安全

在现代工业自动化环境中&#xff0c;工业交换机作为关键的网络设备&#xff0c;扮演着数据传输和信息交互的重要角色。为了确保数据的访问安全&#xff0c;工业交换机不仅具备高效的转发性能&#xff0c;还集成了多层次的安全防护机制&#xff0c;以抵御各种潜在的网络威胁。 首…

alpine安装docker踩坑记

文章目录 前言错误场景正确操作最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近使用alpine操作系统上docker遇到了一些错误&#xff0c;尝试解决之后就准备输出一篇博客&#xff0c;帮助有需要的后人能够少踩坑&#xff0c;因为淋过雨所以想给别人撑伞 错误场景 我…

新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)

Triaxis 旋转和线性位置传感器IC&#xff1a; MLX90372GVS-ACE-103 MLX90372GVS-ACE-108 MLX90372GVS-ACE-301 MLX90372GVS-ACE-200 MLX90372GVS-ACE-208 MLX90372GVS-ACE-303 MLX90372GVS-ACE-300 MLX90372GVS-ACE-350 MLX90372GVS-ACE-100 MLX90372GVS-ACE-101 MLX90372GVS-…