如何使用 Istio 进行多集群部署管理:多控制平面
作者 | 王夕寧? 阿里云高級(jí)技術(shù)專家
導(dǎo)讀:本文摘自于阿里云高級(jí)技術(shù)專家王夕寧撰寫的《Istio?服務(wù)網(wǎng)格技術(shù)解析與實(shí)戰(zhàn)》一書,講述了如何使用?Istio?進(jìn)行多集群部署管理來闡述服務(wù)網(wǎng)格對(duì)多云環(huán)境、多集群即混合部署的支持能力。
前文詳情:
- 《如何使用 Istio 進(jìn)行多集群部署管理:單控制平面 VPN 連接拓?fù)洹?/li>
- 《如何使用 Istio 進(jìn)行多集群部署管理:單控制平面 Gateway 連接拓?fù)洹?/li>
在多控制平面拓?fù)涞呐渲弥?#xff0c;每個(gè)?Kubernetes?集群都會(huì)安裝相同的?Istio?控制平面,并且每個(gè)控制平面只會(huì)管理自己集群內(nèi)的服務(wù)端點(diǎn)。通過使用?Istio?網(wǎng)關(guān)、公共根證書頒發(fā)機(jī)構(gòu)(CA)以及服務(wù)條目?ServiceEntry,可以將多個(gè)集群配置組成一個(gè)邏輯上的單一服務(wù)網(wǎng)格。這種方法沒有特殊的網(wǎng)絡(luò)要求,因此通常被認(rèn)為是在?Kubernetes?集群之間沒有通用網(wǎng)絡(luò)連接時(shí)的一種最簡單方法。
在這種拓?fù)渑渲孟?#xff0c;Kubernetes?跨集群通信需要服務(wù)之間的雙向?TLS?連接,要在集群之間啟用雙向?TLS?通信,每個(gè)集群的?Citadel?將配置由共享的根?CA?生成的中間?CA?證書,如圖所示。
(多控制平面)
部署控制平面
從共享的根?CA?為每個(gè)集群的?Citadel?生成中間?CA?證書,共享的根?CA?啟用跨不同集群的雙向?TLS?通信。為了便于說明,我們將?samples/certs?目錄下?Istio?安裝中提供的示例根?CA?證書用于兩個(gè)集群。在實(shí)際部署中,你可能會(huì)為每個(gè)集群使用不同的?CA?證書,所有?CA?證書都由公共根?CA?簽名。
在每個(gè)?Kubernetes?集群中實(shí)施以下步驟,以在所有集群中部署相同的?Istio?控制平面配置。
確保上述步驟在每個(gè)?Kubernetes?集群中都執(zhí)行成功。當(dāng)然,通過?helm?生成?istio.yaml?的命令執(zhí)行一次即可。
設(shè)置?DNS
為遠(yuǎn)程集群中的服務(wù)提供?DNS?解析,則現(xiàn)有應(yīng)用程序不需要做修改就可以運(yùn)行,因?yàn)閼?yīng)用程序通常期望通過其?DNS?名稱來解析服務(wù)并訪問所得到的?IP?地址。Istio?本身不使用?DNS?在服務(wù)之間路由請(qǐng)求,同一個(gè)?Kubernetes?集群下的服務(wù)會(huì)共享一個(gè)相同的?DNS?后綴(例如?svc.cluster.local)。Kubernetes DNS?為這些服務(wù)提供?DNS?解析能力。為了給遠(yuǎn)程集群中的服務(wù)提供相似的設(shè)置,將遠(yuǎn)程集群中的服務(wù)以?..global?的格式命名。
Istio?安裝包中附帶了一個(gè)?CoreDNS?服務(wù)器,該服務(wù)器將為這些服務(wù)提供DNS解析能力。為了利用這個(gè)?DNS?解析能力,需要配置?Kubernetes?的?DNS?服務(wù)指向該?CoreDNS?服務(wù)。該?CoreDNS?服務(wù)將作為?.global DNS?域的?DNS 服務(wù)器。
對(duì)于使用?kube-dns?的集群,請(qǐng)創(chuàng)建以下配置項(xiàng)或更新現(xiàn)有的配置項(xiàng):
kubectl apply -f - <<EOF apiVersion: v1 kind: ConfigMap metadata:name: kube-dnsnamespace: kube-system data:stubDomains: |{"global": ["$(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})"]} EOF對(duì)于使用?CoreDNS?的集群,請(qǐng)創(chuàng)建以下配置項(xiàng)或更新現(xiàn)有的配置項(xiàng):
kubectl apply -f - <<EOF apiVersion: v1 kind: ConfigMap metadata:name: corednsnamespace: kube-system data:Corefile: |.:53 {errorshealthkubernetes cluster.local in-addr.arpa ip6.arpa {pods insecureupstreamfallthrough in-addr.arpa ip6.arpa}prometheus :9153proxy . /etc/resolv.confcache 30reloadloadbalance}global:53 {errorscache 30proxy . $(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})} EOF部署示例應(yīng)用
為了演示跨集群訪問,在一個(gè)?Kubernetes?集群中部署?sleep?應(yīng)用服務(wù),在第二個(gè)集群中部署?httpbin?應(yīng)用服務(wù),然后驗(yàn)證?sleep?應(yīng)用是否可以調(diào)用遠(yuǎn)程集群的?httpbin?服務(wù)。
對(duì)于?*.global?域下服務(wù)的?DNS?解析,需要為這些服務(wù)分配一個(gè)?IP?地址,并且保證?.globalDNS?域中的每個(gè)服務(wù)在集群中必須具有唯一的?IP?地址。這些?IP?地址在?pod?之外是不可路由的。在這個(gè)例子中,我們將使用網(wǎng)段?127.255.0.0/16?來避免與其他的IP沖突。這些?IP?的應(yīng)用流量將由?Sidecar?代理捕獲并路由到適當(dāng)?shù)钠渌h(yuǎn)程服務(wù)。
在集群?cluster1?中創(chuàng)建該?httpbin?服務(wù)對(duì)應(yīng)的?ServiceEntry,執(zhí)行如下命令:
kubectl apply -n app1 -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata:name: httpbin-app2 spec:hosts:# must be of form name.namespace.global- httpbin.app2.global# Treat remote cluster services as part of the service mesh# as all clusters in the service mesh share the same root of trust.location: MESH_INTERNALports:- name: http1number: 8000protocol: httpresolution: DNSaddresses:# the IP address to which httpbin.bar.global will resolve to# must be unique for each remote service, within a given cluster.# This address need not be routable. Traffic for this IP will be captured# by the sidecar and routed appropriately.- 127.255.0.2endpoints:# This is the routable address of the ingress gateway in cluster2 that# sits in front of sleep.bar service. Traffic from the sidecar will be# routed to this address.- address: ${CLUSTER2_GW_ADDR}ports:http1: 15443 # Do not change this port value EOF上面的配置將會(huì)使集群?cluster1?中訪問?httpbin.app2.global?的所有流量,包括訪問它的任何端口的流量,都會(huì)被路由到啟用了雙向?TLS?連接的端點(diǎn)?:15443?上。
端口?15443?的網(wǎng)關(guān)是一個(gè)特殊的?SNI?感知的?Envoy?代理,它是在前面開始部分中作為多集群?Istio?安裝步驟的一部分預(yù)先配置和安裝的。進(jìn)入端口?15443?的流量將在目標(biāo)集群的適當(dāng)內(nèi)部服務(wù)的?pod?中進(jìn)行負(fù)載均衡。
在集群?cluster1?下執(zhí)行如下命令查看容器?istiocoredns,可以看到上述?ServiceEntry?的域名映射關(guān)系已經(jīng)被加載:
export ISTIO_COREDNS=$(kubectl get -n istio-system po -l app=istiocoredns -o jsonpath={.items..metadata.name}) kubectl logs --tail 2 -n istio-system ${ISTIO_COREDNS} -c istio-coredns-plugin執(zhí)行結(jié)果如下所示:
執(zhí)行結(jié)果如下所示:
至此,集群?cluster1?與?cluster2?在多控制平面配置下完成了連通。
跨集群的版本路由
通過前面的文章,我們已經(jīng)了解了?Istio?的很多功能,例如基本版本的路由等,可以在單個(gè)?Kubernetes?集群上很容易地實(shí)現(xiàn)。而很多真實(shí)的業(yè)務(wù)場景中,基于微服務(wù)的應(yīng)用程序并非那么簡單,而是需要在多個(gè)位置跨集群去分配和運(yùn)行服務(wù)。那么問題就來了,是否?Istio?的這些功能同樣可以很簡單地運(yùn)行在這些真實(shí)的復(fù)雜環(huán)境中呢?
下面我們將會(huì)通過一個(gè)示例來了解?Istio?的流量管理功能如何在具有多個(gè)控制平面拓?fù)涞亩嗉壕W(wǎng)格中正常運(yùn)行。
在我們的例子中,它是?helloworld.hello.global,所以我們需要在集群?cluster1?中創(chuàng)建服務(wù)條目?ServiceEntry?和目標(biāo)規(guī)則?DestinationRule。服務(wù)條目?ServiceEntry?將使用集群?cluster2?的入口網(wǎng)關(guān)作為端點(diǎn)地址來訪問服務(wù)。
通過使用以下命令在集群?cluster1?中創(chuàng)建?helloworld?服務(wù)對(duì)應(yīng)的服務(wù)條目?ServiceEntry?和目標(biāo)規(guī)則DestinationRule:
kubectl apply -n hello -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata:name: helloworld spec:hosts:- helloworld.hello.globallocation: MESH_INTERNALports:- name: http1number: 5000protocol: httpresolution: DNSaddresses:- 127.255.0.8endpoints:- address: ${CLUSTER2_GW_ADDR}labels:cluster: cluster2ports:http1: 15443 # Do not change this port value --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: helloworld-global spec:host: helloworld.hello.globaltrafficPolicy:tls:mode: ISTIO_MUTUALsubsets:- name: v2labels:cluster: cluster2- name: v3labels:cluster: cluster2 EOF而在集群?cluster2?中創(chuàng)建子集?v2?和?v3?對(duì)應(yīng)的目標(biāo)規(guī)則,執(zhí)行如下命令:
kubectl apply -n hello -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: helloworld spec:host: helloworld.hello.svc.cluster.localtrafficPolicy:tls:mode: ISTIO_MUTUALsubsets:- name: v2labels:version: v2- name: v3labels:version: v3 EOF應(yīng)用下面的虛擬服務(wù)將會(huì)使得來自用戶?jason?對(duì)?helloworld?的流量請(qǐng)求指向位于集群?cluster2?中的版本?v2?和?v3,其中?v2?比例為?70%,v3?比例為?30%;來自任何其他用戶對(duì)?helloworld?的流量請(qǐng)求都將轉(zhuǎn)到位于集群?cluster1?中的版本?v1:
kubectl apply -n hello -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: helloworld spec:hosts:- helloworld.hello.svc.cluster.local- helloworld.hello.globalhttp:- match:- headers:end-user:exact: jasonroute:- destination:host: helloworld.hello.globalsubset: v2weight: 70- destination:host: helloworld.hello.globalsubset: v3weight: 30- route:- destination:host: helloworld.hello.svc.cluster.localsubset: v1 EOF執(zhí)行多次調(diào)用,可以從下面的執(zhí)行結(jié)果中看出,上述流量路由的規(guī)則生效,這也說明了在多控制平面拓?fù)湎?#xff0c;用于路由的規(guī)則定義與在本地集群的使用方式是一樣的:
設(shè)置多集群網(wǎng)格的最簡單方法是使用多控制平面拓?fù)?#xff0c;因?yàn)樗鼪]有特殊的網(wǎng)絡(luò)要求。通過上述示例可以看出,在單個(gè)?Kubernetes?集群上運(yùn)行的路由功能同樣很容易地在多個(gè)集群中使用運(yùn)行。
**《Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)戰(zhàn)》讀者可免費(fèi)體驗(yàn) ASM 產(chǎn)品進(jìn)行學(xué)習(xí)!**點(diǎn)擊了解阿里云服務(wù)網(wǎng)格產(chǎn)品 ASM:www.aliyun.com/product/servicemesh
作者簡介
王夕寧 阿里云高級(jí)技術(shù)專家,阿里云服務(wù)網(wǎng)格產(chǎn)品 ASM 及 Istio on Kubernetes 技術(shù)負(fù)責(zé)人,專注于 Kubernetes、云原生、服務(wù)網(wǎng)格等領(lǐng)域。曾在 IBM 中國開發(fā)中心工作,擔(dān)任過專利技術(shù)評(píng)審委員會(huì)主席,擁有 40 多項(xiàng)相關(guān)領(lǐng)域的國際技術(shù)專利?!禝stio 服務(wù)網(wǎng)格解析與實(shí)戰(zhàn)》一書由其撰寫,詳細(xì)介紹了 Istio 的基本原理與開發(fā)實(shí)戰(zhàn),包含大量精選案例和參考代碼可以下載,可快速入門 Istio 開發(fā)。Gartner 認(rèn)為,2020 年服務(wù)網(wǎng)格將成為所有領(lǐng)先的容器管理系統(tǒng)的標(biāo)配技術(shù)。本書適合所有對(duì)微服務(wù)和云原生感興趣的讀者,推薦大家對(duì)本書進(jìn)行深入的閱讀。
課程推薦
為了更多開發(fā)者能夠享受到 Serverless 帶來的紅利,這一次,我們集結(jié)了 10+ 位阿里巴巴 Serverless 領(lǐng)域技術(shù)專家,打造出最適合開發(fā)者入門的 Serverless 公開課,讓你即學(xué)即用,輕松擁抱云計(jì)算的新范式——Serverless。
點(diǎn)擊即可免費(fèi)觀看課程:https://developer.aliyun.com/learning/roadmap/serverless
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢(shì)、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開發(fā)者的公眾號(hào)?!?/p>
總結(jié)
以上是生活随笔為你收集整理的如何使用 Istio 进行多集群部署管理:多控制平面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenKruise v0.5.0 版本
- 下一篇: 引领开源新风潮,阿里巴巴编程之夏第二期重