自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

CoreDNS 與多集群服務(wù) MCS

開(kāi)發(fā) 前端
假如當(dāng)前應(yīng)用內(nèi)的代碼中是使用 NAME.NS? 的方式的話,可以通過(guò)在 Pod /etc/resolv.conf?增加 clusterset.local? 搜索域來(lái)解決。由于 Kubernetes 集群只支持一個(gè) clusterDomain?,只能通過(guò) pod.dnsConfig 在添加搜索域了。單又會(huì)來(lái)另一個(gè)問(wèn)題:搜索域的增加勢(shì)必帶來(lái)性能的開(kāi)銷。

Kubernetes 作為一項(xiàng)核心技術(shù)已成為現(xiàn)代應(yīng)用程序架構(gòu)的基礎(chǔ),越來(lái)越多的企業(yè)使用其作為容器編排系統(tǒng)。Kubernetes 集群經(jīng)歷了 從單 Kubernetes 集群到多 Kubernetes 集群、從多 Kubernetes 集群到 Kubernetes 多集群的演進(jìn)[1],集群的展現(xiàn)形式不斷發(fā)生著變化。

為此,Kubernetes 多集群 SIG 提出了 KEP-1645: Multi-Cluster Services API[2](以下簡(jiǎn)稱 MCS API)應(yīng)對(duì) Kubernetes 多集群帶來(lái)的挑戰(zhàn),詳細(xì)內(nèi)容可以看之前的介紹:認(rèn)識(shí)一下 Kubernetes 多集群服務(wù) API[3] ,這篇要介紹的是多集群服務(wù) DNS。

多集群服務(wù) DNS

在官方建議的方案中使用了 多集群服務(wù) DNS[4] ,并提出了 Kubernetes 基于 DNS 的多集群服務(wù)發(fā)現(xiàn)規(guī)范[5]用于指導(dǎo)多集群服務(wù) API 的實(shí)現(xiàn)。該規(guī)范可以認(rèn)為是 Kubernetes 的基于 DNS 的服務(wù)發(fā)現(xiàn)規(guī)范[6] 的擴(kuò)展。

簡(jiǎn)單來(lái)說(shuō),該規(guī)范引入了新的 DNS 搜索域 clusterset.local,在 DNS 解析 <service>.<ns>.svc.clusterset.local 時(shí),返回 ServiceImport 中的 IP 地址。

圖片圖片

CoreDNS 的 multicluster[7] 插件實(shí)現(xiàn)了該邏輯。

CoreDNS 多集群插件

插件可以說(shuō)是 CoreDNS 精髓,其插件可以分為兩種:核心插件[8] 和 外部插件(External Plugin)[9]。

  • 核心插件,也就是通常所說(shuō)的插件,默認(rèn)是編譯在 CoreDNS 中的,只需在 Corefile 中添加配置即可啟用該插件。
  • 外部插件,不是 CoreDNS 默認(rèn)支持的,需要編譯時(shí)加入到 CoreDNS 中。下面會(huì)詳細(xì)介紹如何將外部插件編譯到 CoreDNS 中。

multicluster 插件是眾多外部插件中的一個(gè),實(shí)現(xiàn)了基于 DNS 的多集群服務(wù)發(fā)現(xiàn)規(guī)范。

工作原理

multicluster 插件在啟動(dòng)時(shí) 創(chuàng)建一個(gè)控制器[10],用于監(jiān)控 ServiceImports[11] 資源;在處理 DNS 解析請(qǐng)求階段,只處理 clusterset.local 域的解析請(qǐng)求:從所有 ServiceImports 資源中 檢索出匹配的結(jié)果[12],返回其中的 IP 地址,甚至端口。

演示

編譯 CoreDNS

修改 plugin.cfg,添加:

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

執(zhí)行命令 make 進(jìn)行編譯后,然后執(zhí)行命令檢查插件是否編譯成功:

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

在結(jié)果中我們有看到 dns.multicluster 說(shuō)明配置都成功了。

接下來(lái)就是構(gòu)建多平臺(tái)的二進(jìn)制文件了了:

make build -f Makefile.release

可以再檢查下編譯好的二進(jìn)制文件(使用對(duì)應(yīng)平臺(tái)的版本,我這里是 Ubuntu):

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

構(gòu)建鏡像

構(gòu)建鏡像之前記得執(zhí)行下面的命令調(diào)整下文件目錄:

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

執(zhí)行命令構(gòu)建并推送鏡像,這里 DOCKER=addozhang 是鏡像 repository 名字,NAME=coredns-multicluster 是鏡像名,按照下面的配置最終構(gòu)建的鏡像是 addozhang/coredns-multicluster:1.10.1:

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

更新 CoreDNS

因?yàn)檫@次演示不會(huì)涉及 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 資源的操作權(quán)限。

kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:coredns
rules:
- apiGroups:
  - ""
  resources:
  - endpoints
  - services
  - pods
  - namespaces
  verbs:
  - list
  - watch
- apiGroups:  #add serviceimports resource verbs
  - multicluster.x-k8s.io
  resources:
  - serviceimports
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
- apiGroups:
  - discovery.k8s.io
  resources:
  - endpointslices
  verbs:
  - list
  - watch
EOF

將集群 CoreDNS 的鏡像改為上面構(gòu)建的鏡像:

kubectl patch deployment coredns -n kube-system -p '{"spec":{"template":{"spec":{"containers":[{"name":"coredns","image":"addozhang/coredns-multicluster:1.10.1"}]}}}}'

只更新 CoreDNS 還不夠,還需要修改 Corefile,添加 multicluster 配置。

kubectl apply -n kube-system -f - <<EOF
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        multicluster clusterset.local
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
EOF

測(cè)試

手動(dòng)創(chuàng)建 ServiceImport 資源,將服務(wù)地址配置為我本地運(yùn)行的 web 服務(wù) 192.168.1.174:8080,來(lái)模擬其他集群的服務(wù)。類型設(shè)置為 ClusterSetIP:

apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceImport
metadata:
  name: my-svc
  namespace: default
spec:
  ips:
  - 192.168.1.174 
  type: "ClusterSetIP"
  ports:
  - name: http
    protocol: TCP
    port: 8080
  sessionAffinity: None

接下來(lái)測(cè)試下多集群服務(wù) DNS 的解析,運(yùn)行一個(gè) pod 來(lái)模擬客戶端:

kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -n default

查詢 my-svc.default.svc.clusterset.local 的解析,測(cè)試 A 記錄和 SRV 記錄的解析:

dig +short my-svc.default.svc.clusterset.local
192.168.1.174

dig +short SRV my-svc.default.svc.clusterset.local
0 100 8080 my-svc.default.svc.clusterset.local.

應(yīng)用也可以正常訪問(wèn):

curl my-svc.default.svc.clusterset.local:8080
Hi, there!

總結(jié)

這篇文章中我們通過(guò) DNS 解決了跨集群的服務(wù)發(fā)現(xiàn)問(wèn)題,相信看到這里大家也發(fā)現(xiàn)了 DNS 方案的弊端:

  1. 引入了新的 DNS 域 clusterset.local,需要改動(dòng)應(yīng)用代碼。
  2. 兩個(gè)集群間的網(wǎng)絡(luò)要打通,對(duì)底層的網(wǎng)絡(luò)架構(gòu)要求高,如果涉及跨云跨數(shù)據(jù)中心的話這個(gè)問(wèn)題會(huì)更加明顯。
  3. 多集群服務(wù) DNS 插件目前還屬于 external plugin,還要像上面那樣重新編譯、部署 CoreDNS

其中,由于目前 KEP1645 還處于提案階段,待正式發(fā)布之后,相信 #3 的問(wèn)題待插件進(jìn)入核心插件列表后可以解決。

而 #1 的問(wèn)題,假如當(dāng)前應(yīng)用內(nèi)的代碼中是使用 NAME.NS 的方式的話,可以通過(guò)在 Pod /etc/resolv.conf增加 clusterset.local 搜索域來(lái)解決。由于 Kubernetes 集群只支持一個(gè) clusterDomain,只能通過(guò) pod.dnsConfig 在添加搜索域了。單又會(huì)來(lái)另一個(gè)問(wèn)題:搜索域的增加勢(shì)必帶來(lái)性能的開(kāi)銷。

這里 #2 的可能最為棘手,需要調(diào)整底層的網(wǎng)絡(luò)架構(gòu),使用扁平網(wǎng)絡(luò)或者其他如 vxlan、隧道等方案。

我曾經(jīng)在另一篇文章中介紹過(guò)使用 7 層網(wǎng)絡(luò)解決 #2 的網(wǎng)絡(luò)互通問(wèn)題,有興趣可以看 這篇。

不知道你是否有更好的方案?歡迎留言討論。

參考資料

[1] 從單 Kubernetes 集群到多 Kubernetes 集群、從多 Kubernetes 集群到 Kubernetes 多集群的演進(jìn): https://atbug.com/kubernetes-cluster-evolution-in-multi-hybrid-cloud/

[2] KEP-1645: Multi-Cluster Services API: https://github.com/kubernetes/enhancements/tree/master/keps/sig-multicluster/1645-multi-cluster-services-api#kep-1645-multi-cluster-services-api

[3] 認(rèn)識(shí)一下 Kubernetes 多集群服務(wù) API: https://atbug.com/kubernetes-multi-cluster-api/

[4] 多集群服務(wù) DNS: https://github.com/kubernetes/enhancements/blob/master/keps/sig-multicluster/1645-multi-cluster-services-api/README.md#dns

[5] Kubernetes 基于 DNS 的多集群服務(wù)發(fā)現(xiàn)規(guī)范: https://github.com/kubernetes/enhancements/blob/master/keps/sig-multicluster/1645-multi-cluster-services-api/specification.md

[6] Kubernetes 的基于 DNS 的服務(wù)發(fā)現(xiàn)規(guī)范: https://github.com/kubernetes/dns/blob/master/docs/specification.md

[7] multicluster: https://coredns.io/explugins/multicluster/

[8] 核心插件: https://coredns.io/plugins/

[9] 外部插件(External Plugin): https://coredns.io/explugins

[10] 創(chuàng)建一個(gè)控制器: https://github.com/coredns/multicluster/blob/3afa45c2996fd02d1d781b74c58da0d0e6855f18/multicluster.go#L69

[11] ServiceImports: https://github.com/coredns/multicluster/blob/3afa45c2996fd02d1d781b74c58da0d0e6855f18/controller.go#L95

[12] 檢索出匹配的結(jié)果: https://github.com/coredns/multicluster/blob/3afa45c2996fd02d1d781b74c58da0d0e6855f18/controller.go#L300

責(zé)任編輯:武曉燕 來(lái)源: 云原生指北
相關(guān)推薦

2020-12-14 14:21:55

NEC

2021-03-11 12:31:33

K8sCoreDNSDNS服務(wù)器

2019-07-26 14:31:43

服務(wù)器集群部署

2022-05-24 09:00:00

云計(jì)算Kubernetes安全

2021-02-07 08:00:00

Kubernetes集群云原生

2022-07-24 21:11:19

KubernetesLinux

2009-06-11 09:35:47

GlassFish配置多機(jī)集群

2021-12-24 10:47:49

Kubernetes容器化微服務(wù)

2010-09-15 14:50:57

集群負(fù)載均衡Tomcat

2010-11-11 09:06:38

Linux集群LVS

2019-04-02 09:01:47

CoreDNSDNS污染

2009-06-12 17:45:16

JMS集群JBoss集群

2022-01-12 11:55:43

Kubernetes多集群Linux

2014-02-21 15:21:29

集群共享運(yùn)維人員

2021-11-22 16:21:28

Kubernetes 運(yùn)維開(kāi)源

2009-06-12 14:27:49

JBoss集群配置

2019-10-31 09:03:12

Java集群微服務(wù)

2023-09-26 00:59:54

零配置服務(wù)網(wǎng)格

2021-05-28 17:59:37

K8sDNS解析CoreDNS

2022-07-11 09:46:43

Kubernetes開(kāi)源Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)