如何使用Istio 1.6管理多叢集中的微服務?
阿新 • • 發佈:2020-07-28
假如你正在一家典型的企業裡工作,需要與多個團隊一起工作,併為客戶提供一個獨立的軟體,組成一個應用程式。你的團隊遵循微服務架構,並擁有由多個Kubernetes叢集組成的廣泛基礎設施。
由於微服務分佈在多個叢集中,你需要設計一個解決方案來集中管理所有微服務。幸運的是,你正在使用Istio,提供這個解決方案只不過是另一個配置的變化。
像Istio這樣的服務網格技術可以幫助你安全地發現和連線分佈在多個叢集和環境中的微服務。今天我們來討論一下使用Istio管理託管在多個Kubernetes叢集中的微服務。
## 架構說明
Istio使用以下元件提供跨叢集服務發現:
- Istio CoreDNS:每個Istio控制平面都有一個CoreDNS。Istio使用它來發現全域性範圍上定義的服務。例如,如果一個託管在叢集1上的微服務需要連線到另一個託管在叢集2上的微服務,你需要為執行在叢集2上的微服務在Istio CoreDNS上做一個全域性條目。
- Root CA:由於Istio需要在不同叢集上執行的服務之間建立mTLS連線,因此需要使用共享的Root CA為兩個叢集生成中間CA證書。這就在不同叢集上執行的微服務之間建立了信任,因為中間CA共享同一個Root CA。
- Istio Ingress閘道器:叢集間的通訊通過Ingress閘道器進行,服務之間沒有直接連線。因此,你要確保Ingress閘道器是可發現的,並且所有叢集都可以連線到它。
![](https://oscimg.oschina.net/oscnet/up-de7580ded875a3feef8544fc99461e10be2.png)
## 服務發現
Istio使用以下步驟來促進服務發現:
1. 叢集上都有相同的控制平面,以促進高可用性。
2. Kube DNS與Istio CoreDNS為支點,以提供全域性服務發現。
3. 使用者通過Istio CoreDNS中的ServiceEntries定義遠端服務的路由,格式為name.namespace.global。
4. 源sidecar使用全域性CoreDNS條目將流量路由到目標Istio Ingress閘道器。
5. 目標 Istio Ingress 閘道器將流量路由到正確的微服務 pod。
前期準備
本文假設你已經對Kubernetes以及Istio的工作原理有一個基本的瞭解。如果你想了解Istio 1.5和1.6的詳細內容,[點選此處即可檢視相關視訊](https://www.bilibili.com/video/BV1uz4y1R7WB "點選此處即可檢視相關視訊")。為了能夠跟上我們接下來的演示,請確保:
- 你有至少兩個Kubernetes叢集,Kubernetes的版本為1.14、1.15或1.16
- 你擁有在叢集內安裝和配置Istio的許可權
- 你在兩個Kubernetes叢集上都有叢集管理許可權。
- Ingress閘道器可通過網路負載均衡器或類似配置連線到其他叢集。扁平網路是不必要的。
## 安裝Istio
在兩個叢集上,使用以下命令安裝Istio 1.6.1:
```
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.6.1 sh -
cd istio-1.6.1
export PATH=$PWD/bin:$PATH
```
由於我們需要用共享的根證書生成的中間證書來啟動我們的Istio服務網格,所以使用中間證書建立一個secret。
在這個例子中,我們使用提供的樣本證書。但是,我不建議你在生產中使用這些證書,因為它們一般都是可輕鬆獲取的,而且是眾所周知的。最好是使用你的組織的Root CA來生成中間CA證書。
在兩個叢集上執行以下命令來使用樣本證書。如果你使用的是你的證書,請替換適用的檔案路徑。
```
kubectl create namespace istio-system
kubectl create secret generic cacerts -n istio-system \
--from-file=samples/certs/ca-cert.pem \
--from-file=samples/certs/ca-key.pem \
--from-file=samples/certs/root-cert.pem \
--from-file=samples/certs/cert-chain.pem
secret/cacerts created
```
由於我們需要安裝Istio進行多叢集設定,所以在兩個叢集上使用提供的Istio多叢集閘道器manifest檔案。
```
$ istioctl manifest apply -f install/kubernetes/operator/examples/multicluster/values-istio-multicluster-gateways.yaml
- Applying manifest for component Base...
✔ Finished applying manifest for component Base.
- Applying manifest for component Pilot...
✔ Finished applying manifest for component Pilot.
Waiting for resources to become ready...
- Applying manifest for component AddonComponents...
- Applying manifest for component IngressGateways...
- Applying manifest for component EgressGateways...
✔ Finished applying manifest for component EgressGateways.
✔ Finished applying manifest for component IngressGateways.
✔ Finished applying manifest for component AddonComponents.
✔ Installation complete
```
## 配置KubeDNS
下一步是將DNS解析從Kube DNS聯邦到Istio CoreDNS。讓我們通過為`kube-dns`定義一個`ConfigMap`來配置一個存根域。在兩個叢集上應用以下manifest:
```
$ kubectl apply -