通過命令行管理多集群服務(wù)實(shí)現(xiàn)Kubernetes服務(wù)的跨集群訪問
通過多集群服務(wù),讓您無需創(chuàng)建負(fù)載均衡,即可實(shí)現(xiàn)Kubernetes服務(wù)的跨集群訪問。本文通過示例介紹如何在Fleet實(shí)例上創(chuàng)建ServiceExport、ServiceImport等資源來管理多集群服務(wù),實(shí)現(xiàn)Kubernetes服務(wù)的跨集群訪問。
前提條件
已開啟艦隊(duì)管理功能。具體操作,請參見開啟艦隊(duì)管理功能。
艦隊(duì)的Fleet實(shí)例已添加2個關(guān)聯(lián)集群(服務(wù)提供者集群、服務(wù)消費(fèi)者集群)。具體操作,請參見添加關(guān)聯(lián)集群。
確保關(guān)聯(lián)集群的版本為1.22及以上版本。
獲取服務(wù)提供者集群和服務(wù)消費(fèi)者集群的Kubeconfig,并通過kubectl連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
概述
通過多集群服務(wù)實(shí)現(xiàn)Kubernetes服務(wù)的跨集群訪問,打破了多集群服務(wù)訪問的邊界。多集群服務(wù)示例如下圖所示。
管理員在服務(wù)提供者集群(ACK Cluster 1)和服務(wù)消費(fèi)者集群(ACK Cluster 2)中,創(chuàng)建應(yīng)用相關(guān)資源,包含Namespace、Deployment和Service;創(chuàng)建多集群Service資源,包括ServiceExport和ServiceImport。
多集群艦隊(duì)Fleet監(jiān)聽子集群的ServiceExport和ServiceImport資源,同步多集群Service對應(yīng)的Endpoint信息。
在服務(wù)消費(fèi)者集群ACK Cluster 2上,Client Pod可跨集群訪問服務(wù)提供者集群ACK Cluster 1上的Service1。
步驟一:創(chuàng)建服務(wù)提供者相關(guān)資源
如果您的服務(wù)提供者集群ACK Cluster 1已經(jīng)部署了Kubernetes服務(wù)和相關(guān)資源,可以跳過此步驟。
在服務(wù)提供者集群ACK Cluster 1上,執(zhí)行以下命令,創(chuàng)建服務(wù)提供者命名空間。
示例的命名空間為
provider-ns
。kubectl create ns provider-ns
在服務(wù)提供者集群ACK Cluster 1上,創(chuàng)建服務(wù)提供者Kubernetes服務(wù)和相關(guān)的Deployment等資源。
使用以下內(nèi)容,創(chuàng)建一個
app-meta.yaml
文件。apiVersion: v1 # 服務(wù)提供者。 kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-demo name: web-demo namespace: provider-ns spec: replicas: 2 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/web-demo:0.4.0 name: web-demo env: - name: ENV_NAME value: cluster1-beijing
執(zhí)行以下命令,在服務(wù)提供者集群ACK Cluster 1中創(chuàng)建資源。
kubectl apply -f app-meta.yaml
執(zhí)行以下命令,在服務(wù)提供者集群ACK Cluster 1中創(chuàng)建ServiceExport資源,指定需要開放多集群訪問的Kubernetes服務(wù)。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport metadata: name: service1 # 名稱與待開放的Kubernetes服務(wù)名稱相同。 namespace: provider-ns # 與待開放的Kubernetes服務(wù)在同一個命名空間。
具體參數(shù)說明如下:
參數(shù)
說明
metadata.name
待開放的Kubernetes服務(wù)名稱。
metadata.namespace
待開放的Kubernetes服務(wù)所在的命名空間。
步驟二:配置消費(fèi)者集群
在服務(wù)消費(fèi)者集群ACK Cluster 2上,執(zhí)行以下命令,創(chuàng)建服務(wù)提供者命名空間。
示例的命名空間為
provider-ns
。kubectl create ns provider-ns
在服務(wù)消費(fèi)者集群ACK Cluster 2中,使用以下內(nèi)容,創(chuàng)建ServiceImport資源。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport metadata: name: service1 namespace: provider-ns spec: ports: # 與待開放的Kubernetes服務(wù)ports相同。 - name: http port: 80 protocol: TCP type: ClusterSetIP
以上示例代碼中ServiceImport的
spec
字段僅定義了部分參數(shù)。關(guān)于spec
完整的參數(shù)說明如下表所示。參數(shù)
說明
metadata.name
服務(wù)名稱,需要與待開放的Kubernetes服務(wù)名稱相同。
metadata.namespace
服務(wù)命名空間。需要與待開放的Kubernetes服務(wù)命名空間一致。
spec. ports. name
Port名稱。需要與待開放的Kubernetes服務(wù)相應(yīng)字段一致。
spec. ports. protocol
協(xié)議。需要與待開放的Kubernetes服務(wù)相應(yīng)字段一致。
spec. ports. appProtocol
應(yīng)用協(xié)議。需要與待開放的Kubernetes服務(wù)相應(yīng)字段一致。
spec. ports. port
Port。需要與待開放的Kubernetes服務(wù)相應(yīng)字段一致。
spec. ips
服務(wù)VIP。由Fleet實(shí)例分配,無需填寫。
spec. type
支持
ClusterSetIP
和Headless
。當(dāng)待開放的Kubernetes服務(wù)的
ClusterIP
為None
時,表示服務(wù)為Headless服務(wù),設(shè)置type
為Headless
。否則,設(shè)置
type
為ClusterSetIP
。spec. sessionAffinity
會話關(guān)聯(lián),支持
ClientIP
和None
。需要與待開放的Kubernetes服務(wù)相應(yīng)字段一致。spec. sessionAffinityConfig
會話關(guān)聯(lián)配置。需要與待開放的Kubernetes服務(wù)相應(yīng)字段一致。
步驟三:訪問多集群服務(wù)
在服務(wù)消費(fèi)者集群Cluster 2中的Client Pod可以通過以下兩種方式訪問服務(wù)提供者集群ACK Cluster 1中的Service 1。
方式一:通過新的Service名稱訪問
服務(wù)消費(fèi)者集群ACK Cluster 2創(chuàng)建ServiceImport后,F(xiàn)leet實(shí)例會在服務(wù)消費(fèi)者集群ACK Cluster 2中,創(chuàng)建一個以amcs-
為前綴的Kubernetes服務(wù)代表多集群Service。
在服務(wù)消費(fèi)者集群ACK Cluster 2的Client Pod中,可以通過訪問amcs-service1.provider-ns
來訪問服務(wù)提供者集群ACK Cluster 1中的Service 1。
在服務(wù)消費(fèi)者集群ACK Cluster 2上執(zhí)行以下命令,獲取相關(guān)Service信息。
kubectl get service -n provider-ns
預(yù)期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE amcs-service1 ClusterIP 172.xx.xx.xx <none> 80/TCP 26m
在服務(wù)消費(fèi)者集群ACK Cluster 2的Client Pod上執(zhí)行以下命令,訪問服務(wù)提供者集群ACK Cluster 1中的Service 1。
curl amcs-service1.provider-ns
方式二:通過新的Service域名訪問
在服務(wù)消費(fèi)者集群Cluster 2中安裝或升級CoreDNS,版本要求1.9.3及以上。具體操作,請參見CoreDNS和管理組件。
修改CoreDNS組件的配置Corefile。
執(zhí)行如下命令,修改CoreDNS組件的ConfigMap文件。
kubectl edit configmap coredns -n kube-system
在Corefile文件中新增一行配置項(xiàng)
multicluster clusterset.local
,支持多集群服務(wù)域名解析。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready multicluster clusterset.local #增加配置項(xiàng),支持多集群服務(wù)域名解析。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified ttl 30 fallthrough in-addr.arpa ip6.arpa } ... } kind: ConfigMap metadata: name: coredns namespace: kube-system
在服務(wù)消費(fèi)者集群Cluster 2的Client Pod上執(zhí)行如下命令,訪問服務(wù)提供者集群Cluster 1中的Service 1。
curl service1.provider-ns.svc.clusterset.local
(可選)通過修改服務(wù)消費(fèi)者集群Cluster 2中Client Pod的
dnsConfig.searches
,訪問多集群服務(wù)。在Client Pod的
dnsConfig.searches
字段中增加搜索clusterset.local
的域名。apiVersion: apps/v1 kind: Deployment metadata: name: client-pod namespace: consumer-ns spec: ... template: ... spec: dnsPolicy: "ClusterFirst" dnsConfig: searches: #dnsConfig,增加搜索clusterset.local域名。 - svc.clusterset.local - clusterset.local - consumer-ns.svc.cluster.local - svc.cluster.local - cluster.local containers: - name: client-pod ...
執(zhí)行如下命令,訪問多集群服務(wù)。
curl service1.provider-ns
相關(guān)文檔
除了命令行方式,您也可以通過控制臺方式管理多集群服務(wù)。具體操作,請參見通過控制臺管理多集群服務(wù)。