使用雲平台可以為組織提供豐富的好處。然而,不可否認的是,采用雲可能會給 DevOps 團隊帶來壓力。開發人員必須使用微服務以滿足應用的可移植性,同時運營商管理了極其龐大的混合和多雲部署。Istio 允許您連接、保護、控制和觀測服務。
在較高的層次上,Istio 有助於降低這些部署的復雜性,並減輕開發團隊的壓力。它是一個完全開源的服務網格,可以透明地分層到現有的分布式應用程序上。它也是一個平台,包括允許它集成到任何日志記錄平台、遙測或策略系統的 API。Istio 的多樣化功能集使您能夠成功高效地運行分布式微服務架構,並提供保護、連接和監控微服務的統一方法。
一、安裝
1.1 安裝 helm
- 下載二進制可執行文件,helm-releases
- 解壓壓縮包
tar -zxvf helm-v2.0.0-linux-amd64.tgz
- 找到 helm 文件,移動至 PATH 路徑上,
mv linux-amd64/helm /usr/local/bin/helm
1.2 安裝 istio
# 下載軟件包並解壓
$ curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.2.4 sh -
# 進入文件夾
cd istio-1.2.4
# 添加 istioctl 路徑到環境變量 PATH,或將其移動至 /usr/local/bin 下
sudo mv bin/istioctl /usr/local/bin
# 創建命名空間
kubectl create namespace istio-system
# 使用 kubectl apply 安裝所有的 Istio CRD
helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -
# 根據實際情況配置更新 values.yaml
vi install/kubernetes/helm/istio/values.yaml
# 部署 Istio 的核心組件
helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
1.2 驗證安裝
1、確保 istioctl 可正常工作
istioctl version
# 輸出如下:
client version: 1.2.4
citadel version: 1.2.4
egressgateway version: 94746ccd404a8e056483dd02e4e478097b950da6-dirty
galley version: 1.2.4
ingressgateway version: 94746ccd404a8e056483dd02e4e478097b950da6-dirty
pilot version: 1.2.4
policy version: 1.2.4
sidecar-injector version: 1.2.4
telemetry version: 1.2.4
2、確保所有 k8s 服務都已以部署並都分配到集群 ip 地址(jaeger-agent) 除外
kubectl get svc -n istio-system
結果如下
NAME | TYPE | CLUSTER-IP | EXTERNAL-IP | PORT(S) | AGE |
---|---|---|---|---|---|
istio-citadel | ClusterIP | 10.101.78.177 | <none> |
8060/TCP,15014/TCP | 2m28s |
istio-galley | ClusterIP | 10.100.76.11 | <none> |
443/TCP,15014/TCP,9901/TCP | 2m29s |
istio-ingressgateway | LoadBalancer | 10.106.32.13 | <pending> |
15020:31401/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31717/TCP,15030:30028/TCP,15031:31428/TCP,15032:30956/TCP,15443:30614/TCP | 2m29s |
istio-pilot | ClusterIP | 10.97.35.129 | <none> |
15010/TCP,15011/TCP,8080/TCP,15014/TCP | 2m28s |
istio-policy | ClusterIP | 10.99.93.221 | <none> |
9091/TCP,15004/TCP,15014/TCP | 2m29s |
istio-sidecar-injector | ClusterIP | 10.107.243.186 | <none> |
443/TCP | 2m28s |
istio-telemetry | ClusterIP | 10.96.117.90 | <none> |
9091/TCP,15004/TCP,15014/TCP,42422/TCP | 2m29s |
prometheus | ClusterIP | 10.96.219.44 | <none> |
9090/TCP | 2m28s |
3、 確保相關 k8s pod 都已部署,且狀態為 running
```bash
kubectl get pods -n istio-system
結果如下
NAME | READY | STATUS | RESTARTS | AGE |
---|---|---|---|---|
istio-citadel-7fff5797f-fckss | 1/1 | Running | 0 | 16m |
istio-cleanup-secrets-1.2.4-hz2rm | 0/1 | Completed | 0 | 16m |
istio-galley-74d4d7b4db-wnjds | 1/1 | Running | 0 | 16m |
istio-ingressgateway-686854b899-g4z9k | 1/1 | Running | 0 | 16m |
istio-init-crd-10-hhll9 | 0/1 | Completed | 0 | 30m |
istio-init-crd-11-ktb9j | 0/1 | Completed | 0 | 30m |
istio-init-crd-12-vrrr2 | 0/1 | Completed | 0 | 30m |
istio-pilot-7fdcbd6f55-rw9bm | 2/2 | Running | 0 | 16m |
istio-policy-79f647bb6-4fntc | 2/2 | Running | 3 | 16m |
istio-security-post-install-1.2.4-lr4nk | 0/1 | Completed | 0 | 16m |
istio-sidecar-injector-578bfd76d7-gtsdb | 1/1 | Running | 0 | 16m |
istio-telemetry-cb4486d94-j9gqf | 2/2 | Running | 4 | 16m |
prometheus-7d7b9f7844-kgtjn | 1/1 | Running | 0 | 16m |
二、 部署應用
以官方 Bookinfo Application 為例,它由四個單獨的微服務構成。這個應用模仿在線書店的一個分類,顯示一本書的信息。
2.1 Bookinfo Application 概述
Bookinfo 應用分為四個單獨的微服務:
- productpage :productpage 微服務會調用 details 和 reviews 兩個微服務,用來生成頁面。
- details :這個微服務包含了書籍的信息。
- reviews :這個微服務包含了書籍相關的評論。它還會調用 ratings 微服務。
- ratings :ratings 微服務中包含了由書籍評價組成的評級信息。
reviews 服務有3個版本
- v1 版本不會調用 ratings 服務。
- v2 版本會調用 ratings 服務,並使用 1 到 5 個黑色星形圖標來顯示評分信息。
- v3 版本會調用 ratings 服務,並使用 1 到 5 個紅色星形圖標來顯示評分信息。
Istio 注入之前的 Bookinfo 應用拓撲結構如下:
Bookinfo 由多個微服務組成,各自用不同的語言編寫。這些服務對 Istio 並無依賴,但是構成了一個有代表性的服務網格的例子:它由多個服務、多個語言構成,並且 reviews 服務具有多個版本。
2.2 部署 Bookinfo Application
要在 Istio 中運行這一應用,無需對應用自身做出任何改變。我們只要簡單的在 Istio 環境中對服務進行配置和運行,具體一點說就是把 Envoy sidecar 注入到每個服務之中。這個過程所需的具體命令和配置方法由運行時環境決定,而部署結果較為一致,如下圖所示:
所有的微服務都和 Envoy sidecar 集成在一起,被集成服務所有的出入流量都被 sidecar 所劫持,這樣就為外部控制准備了所需的 Hook,然后就可以利用 Istio 控制平面為應用提供服務路由、遙測數據收集以及策略實施等功能。
1、 創建命名空間用以部署 Bookinfo Application
# 創建命名空間
kubectl create ns bookinfo-application
2、 為這個命名空間大上 istio-injection=enabled
標簽
kubectl label namespace bookinfo-application istio-injection=enabled
3、 部署 bookinfo application
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo-application
安裝過程時長視網速而定,請耐心等待以下。
4、確認所有的服務和 Pod 都已經正確的定義和啟動
$ kubectl get services -n bookinfo-application
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.102.215.67 `<none>` 9080/TCP 2m58s
productpage ClusterIP 10.109.215.4 `<none>` 9080/TCP 2m57s
ratings ClusterIP 10.107.143.194 `<none>` 9080/TCP 2m58s
reviews ClusterIP 10.96.249.233 `<none>` 9080/TCP 2m57s
#---
$ kubectl get pods -n bookinfo-application
NAME READY STATUS RESTARTS AGE
details-v1-74f858558f-p8nwz 2/2 Running 0 4m24s
productpage-v1-8554d58bff-cgx74 2/2 Running 0 4m24s
ratings-v1-7855f5bcb9-tt5zn 2/2 Running 0 4m24s
reviews-v1-59fd8b965b-jvqvs 2/2 Running 0 4m24s
reviews-v2-d6cfdb7d6-zxk9w 2/2 Running 0 4m24s
reviews-v3-75699b5cfb-28dvd 2/2 Running 0 4m24s
要確認 Bookinfo 應用程序正在運行,請通過某個 pod 中的 curl 命令向其發送請求,例如來自 ratings:
kubectl exec -it ratings-v1-7855f5bcb9-tt5zn -n bookinfo-application -c ratings -- curl productpage:9080/productpage | grep "<title>.*</title>"
2.3 暴露服務入口
如果沒有外部負載均衡可以將名為 istio-ingressgateway
的 service 類型修改為 NodePort 類型,隨后通過 istio-ingressgateway
所在的服務器IP地址+端口的形式訪問服務。
istio 的 Gateway 允許外部流量進入 Istio 服務網,與 K8S 的 ingress 直接指定路由不同,istio 的路由規則不在 gateway 中指定,需要通過 VirtualService 單獨配置。執行下面命令創建 gateway 和 virtualservice。
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo-application
2.4 瀏覽器訪問 Bookinfo Application
可以在瀏覽器打開 http://NodeIp:NodePort/productpage
以瀏覽 Bookinfo Application 頁面,如果刷新幾次應用的頁面,就會看到 productpage 頁面中會隨機展示 reviews 服務的不同版本的效果(紅色、黑色的星形或者沒有顯示)。reviews 服務出現這種情況是因為我們還沒有使用 Istio 來控制版本的路由。
三、應用缺省目標規則
在使用 Istio 控制 Bookinfo 版本路由之前,你需要在目標規則中定義好可用的版本,命名為 subsets 。
kubectl apply -n bookinfo-application -f samples/bookinfo/networking/destination-rule-all.yaml
部署完成后可以通過以命令檢查詳情
kubectl get destinationrules -A
NAMESPACE NAME HOST AGE
bookinfo-application details details 2m54s
bookinfo-application productpage productpage 2m54s
bookinfo-application ratings ratings 2m54s
bookinfo-application reviews reviews 2m54s
可以看到我們成功創建了 4 個 destinationrule
更多有關流量管理的信息,可以查閱文檔 https://istio.io/
四、應用性能監控
istio 默認自帶相關監控組件(如:kiali)版本相對可能會稍有滯后,如果要安裝最新版可以在安裝時前配置不安裝相關組建,待istio 安裝完成后在單獨安裝監控組建。