如何使用 Istio 进行多集群部署管理:多控制平面
作者 | 王夕寧? 阿里云高級技術專家
導讀:本文摘自于阿里云高級技術專家王夕寧撰寫的《Istio?服務網格技術解析與實戰》一書,講述了如何使用?Istio?進行多集群部署管理來闡述服務網格對多云環境、多集群即混合部署的支持能力。
前文詳情:
- 《如何使用 Istio 進行多集群部署管理:單控制平面 VPN 連接拓撲》
- 《如何使用 Istio 進行多集群部署管理:單控制平面 Gateway 連接拓撲》
在多控制平面拓撲的配置中,每個?Kubernetes?集群都會安裝相同的?Istio?控制平面,并且每個控制平面只會管理自己集群內的服務端點。通過使用?Istio?網關、公共根證書頒發機構(CA)以及服務條目?ServiceEntry,可以將多個集群配置組成一個邏輯上的單一服務網格。這種方法沒有特殊的網絡要求,因此通常被認為是在?Kubernetes?集群之間沒有通用網絡連接時的一種最簡單方法。
在這種拓撲配置下,Kubernetes?跨集群通信需要服務之間的雙向?TLS?連接,要在集群之間啟用雙向?TLS?通信,每個集群的?Citadel?將配置由共享的根?CA?生成的中間?CA?證書,如圖所示。
(多控制平面)
部署控制平面
從共享的根?CA?為每個集群的?Citadel?生成中間?CA?證書,共享的根?CA?啟用跨不同集群的雙向?TLS?通信。為了便于說明,我們將?samples/certs?目錄下?Istio?安裝中提供的示例根?CA?證書用于兩個集群。在實際部署中,你可能會為每個集群使用不同的?CA?證書,所有?CA?證書都由公共根?CA?簽名。
在每個?Kubernetes?集群中實施以下步驟,以在所有集群中部署相同的?Istio?控制平面配置。
確保上述步驟在每個?Kubernetes?集群中都執行成功。當然,通過?helm?生成?istio.yaml?的命令執行一次即可。
設置?DNS
為遠程集群中的服務提供?DNS?解析,則現有應用程序不需要做修改就可以運行,因為應用程序通常期望通過其?DNS?名稱來解析服務并訪問所得到的?IP?地址。Istio?本身不使用?DNS?在服務之間路由請求,同一個?Kubernetes?集群下的服務會共享一個相同的?DNS?后綴(例如?svc.cluster.local)。Kubernetes DNS?為這些服務提供?DNS?解析能力。為了給遠程集群中的服務提供相似的設置,將遠程集群中的服務以?..global?的格式命名。
Istio?安裝包中附帶了一個?CoreDNS?服務器,該服務器將為這些服務提供DNS解析能力。為了利用這個?DNS?解析能力,需要配置?Kubernetes?的?DNS?服務指向該?CoreDNS?服務。該?CoreDNS?服務將作為?.global DNS?域的?DNS 服務器。
對于使用?kube-dns?的集群,請創建以下配置項或更新現有的配置項:
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對于使用?CoreDNS?的集群,請創建以下配置項或更新現有的配置項:
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部署示例應用
為了演示跨集群訪問,在一個?Kubernetes?集群中部署?sleep?應用服務,在第二個集群中部署?httpbin?應用服務,然后驗證?sleep?應用是否可以調用遠程集群的?httpbin?服務。
對于?*.global?域下服務的?DNS?解析,需要為這些服務分配一個?IP?地址,并且保證?.globalDNS?域中的每個服務在集群中必須具有唯一的?IP?地址。這些?IP?地址在?pod?之外是不可路由的。在這個例子中,我們將使用網段?127.255.0.0/16?來避免與其他的IP沖突。這些?IP?的應用流量將由?Sidecar?代理捕獲并路由到適當的其他遠程服務。
在集群?cluster1?中創建該?httpbin?服務對應的?ServiceEntry,執行如下命令:
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上面的配置將會使集群?cluster1?中訪問?httpbin.app2.global?的所有流量,包括訪問它的任何端口的流量,都會被路由到啟用了雙向?TLS?連接的端點?:15443?上。
端口?15443?的網關是一個特殊的?SNI?感知的?Envoy?代理,它是在前面開始部分中作為多集群?Istio?安裝步驟的一部分預先配置和安裝的。進入端口?15443?的流量將在目標集群的適當內部服務的?pod?中進行負載均衡。
在集群?cluster1?下執行如下命令查看容器?istiocoredns,可以看到上述?ServiceEntry?的域名映射關系已經被加載:
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執行結果如下所示:
執行結果如下所示:
至此,集群?cluster1?與?cluster2?在多控制平面配置下完成了連通。
跨集群的版本路由
通過前面的文章,我們已經了解了?Istio?的很多功能,例如基本版本的路由等,可以在單個?Kubernetes?集群上很容易地實現。而很多真實的業務場景中,基于微服務的應用程序并非那么簡單,而是需要在多個位置跨集群去分配和運行服務。那么問題就來了,是否?Istio?的這些功能同樣可以很簡單地運行在這些真實的復雜環境中呢?
下面我們將會通過一個示例來了解?Istio?的流量管理功能如何在具有多個控制平面拓撲的多集群網格中正常運行。
在我們的例子中,它是?helloworld.hello.global,所以我們需要在集群?cluster1?中創建服務條目?ServiceEntry?和目標規則?DestinationRule。服務條目?ServiceEntry?將使用集群?cluster2?的入口網關作為端點地址來訪問服務。
通過使用以下命令在集群?cluster1?中創建?helloworld?服務對應的服務條目?ServiceEntry?和目標規則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?中創建子集?v2?和?v3?對應的目標規則,執行如下命令:
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應用下面的虛擬服務將會使得來自用戶?jason?對?helloworld?的流量請求指向位于集群?cluster2?中的版本?v2?和?v3,其中?v2?比例為?70%,v3?比例為?30%;來自任何其他用戶對?helloworld?的流量請求都將轉到位于集群?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執行多次調用,可以從下面的執行結果中看出,上述流量路由的規則生效,這也說明了在多控制平面拓撲下,用于路由的規則定義與在本地集群的使用方式是一樣的:
設置多集群網格的最簡單方法是使用多控制平面拓撲,因為它沒有特殊的網絡要求。通過上述示例可以看出,在單個?Kubernetes?集群上運行的路由功能同樣很容易地在多個集群中使用運行。
**《Istio服務網格技術解析與實戰》讀者可免費體驗 ASM 產品進行學習!**點擊了解阿里云服務網格產品 ASM:www.aliyun.com/product/servicemesh
作者簡介
王夕寧 阿里云高級技術專家,阿里云服務網格產品 ASM 及 Istio on Kubernetes 技術負責人,專注于 Kubernetes、云原生、服務網格等領域。曾在 IBM 中國開發中心工作,擔任過專利技術評審委員會主席,擁有 40 多項相關領域的國際技術專利。《Istio 服務網格解析與實戰》一書由其撰寫,詳細介紹了 Istio 的基本原理與開發實戰,包含大量精選案例和參考代碼可以下載,可快速入門 Istio 開發。Gartner 認為,2020 年服務網格將成為所有領先的容器管理系統的標配技術。本書適合所有對微服務和云原生感興趣的讀者,推薦大家對本書進行深入的閱讀。
課程推薦
為了更多開發者能夠享受到 Serverless 帶來的紅利,這一次,我們集結了 10+ 位阿里巴巴 Serverless 領域技術專家,打造出最適合開發者入門的 Serverless 公開課,讓你即學即用,輕松擁抱云計算的新范式——Serverless。
點擊即可免費觀看課程:https://developer.aliyun.com/learning/roadmap/serverless
“阿里巴巴云原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的公眾號。”
總結
以上是生活随笔為你收集整理的如何使用 Istio 进行多集群部署管理:多控制平面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenKruise v0.5.0 版本
- 下一篇: 引领开源新风潮,阿里巴巴编程之夏第二期重