CoreDNS 与多集群服务 MCS

2023年 7月 18日 54.6k 0

Kubernetes 作为一项核心技术已成为现代应用程序架构的基础,越来越多的企业使用其作为容器编排系统。Kubernetes 集群经历了 从单 Kubernetes 集群到多 Kubernetes 集群、从多 Kubernetes 集群到 Kubernetes 多集群的演进[1],集群的展现形式不断发生着变化。

为此,Kubernetes 多集群 SIG 提出了 KEP-1645: Multi-Cluster Services API[2](以下简称 MCS API)应对 Kubernetes 多集群带来的挑战,详细内容可以看之前的介绍:认识一下 Kubernetes 多集群服务 API[3] ,这篇要介绍的是多集群服务 DNS。

多集群服务 DNS

在官方建议的方案中使用了 多集群服务 DNS[4] ,并提出了 Kubernetes 基于 DNS 的多集群服务发现规范[5]用于指导多集群服务 API 的实现。该规范可以认为是 Kubernetes 的基于 DNS 的服务发现规范[6] 的扩展。

简单来说,该规范引入了新的 DNS 搜索域 clusterset.local,在 DNS 解析 ..svc.clusterset.local 时,返回 ServiceImport 中的 IP 地址。

图片图片

CoreDNS 的 multicluster[7] 插件实现了该逻辑。

CoreDNS 多集群插件

插件可以说是 CoreDNS 精髓,其插件可以分为两种:核心插件[8] 和 外部插件(External Plugin)[9]。

  • 核心插件,也就是通常所说的插件,默认是编译在 CoreDNS 中的,只需在 Corefile 中添加配置即可启用该插件。
  • 外部插件,不是 CoreDNS 默认支持的,需要编译时加入到 CoreDNS 中。下面会详细介绍如何将外部插件编译到 CoreDNS 中。

multicluster 插件是众多外部插件中的一个,实现了基于 DNS 的多集群服务发现规范。

工作原理

multicluster 插件在启动时 创建一个控制器[10],用于监控 ServiceImports[11] 资源;在处理 DNS 解析请求阶段,只处理 clusterset.local 域的解析请求:从所有 ServiceImports 资源中 检索出匹配的结果[12],返回其中的 IP 地址,甚至端口。

演示

编译 CoreDNS

修改 plugin.cfg,添加:

...
kubernetes:kubernetes
multicluster: github.com/coredns/multicluster
...

执行命令 make 进行编译后,然后执行命令检查插件是否编译成功:

./coredns --plugins | grep -A1 dns.minimal      
  dns.minimal
  dns.multicluster

在结果中我们有看到 dns.multicluster 说明配置都成功了。

接下来就是构建多平台的二进制文件了了:

make build -f Makefile.release

可以再检查下编译好的二进制文件(使用对应平台的版本,我这里是 Ubuntu):

./build/linux/amd64/coredns --plugins | grep -A1 mini
  dns.minimal
  dns.multicluster

构建镜像

构建镜像之前记得执行下面的命令调整下文件目录:

cp -r build/linux build/docker
for arch in amd64 arm arm64 mips64le ppc64le s390x; do 
  cp Dockerfile build/docker/${arch} ;
done;

执行命令构建并推送镜像,这里 DOCKER=addozhang 是镜像 repository 名字,NAME=coredns-multicluster 是镜像名,按照下面的配置最终构建的镜像是 addozhang/coredns-multicluster:1.10.1:

export DOCKER_LOGIN=addozhang
export DOCKER_PASSWORD=
make docker-build docker-push DOCKER=addozhang NAME=coredns-multicluster VERSION=1.10.1 -f Makefile.docker

更新 CoreDNS

因为这次演示不会涉及 ServiceExport,可以只部署 ServiceImport CRD。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/mcs-api/master/config/crd/multicluster.x-k8s.io_serviceimports.yaml

修改了 ClusterRole coredns,增加 multicluster.x-k8s.io 的 serviceimports 资源的操作权限。

kubectl apply -f -

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论