Istio是一個開源的服務網格,提供流量管理、可觀測性,以及安全和策略等能力。在Kubernetes中配合使用Istio,可以協助您更好地管理和控制容器應用,提高應用程式的效能、安全性和可靠性。本文以Bookinfo應用為例,介紹自建Kubernetes叢集通過VNode對接ECI的情境下,如何使用Istio。
背景資訊
Istio是一個開源的服務網格(Service Mesh)平台,用於管理微服務之間的流量以及處理各種網路通訊和安全問題。Istio可以與Kubernetes整合,提供標準、安全的流量管理,簡化部署和營運工作。
Bookinfo是一個範例應用,它模仿線上書店的一個目錄,可以顯示一本書的資訊,包括書籍描述,書籍詳細資料(ISBN、頁數等),以及關於這本書的一些評論。Bookinfo是一個異構應用,由四個使用不同語言編寫的微服務組成,可以示範多種Istio特性。Bookinfo包含的四個微服務如下:

-
Productpage:為Python服務,會調用Details和Reviews兩個服務,用來產生頁面。同時,Productpage還包含登入和登出功能。
-
Details:為Ruby服務,包含了書籍的資訊。
-
Reviews:為Java服務,包含了書籍相關的評論。Reviews包含3個版本:
-
v1版本不會調用Ratings服務。
-
v2版本會調用Ratings服務,並使用1到5個黑色星形表徵圖來顯示評分資訊。
-
v3版本會調用Ratings服務,並使用1到5個紅色星形表徵圖來顯示評分資訊。
-
-
Ratings:為Node.js服務,包含了由書籍評價組成的評級資訊。
更多資訊,請參見Istio Bookinfo。
前提條件
本文適用於自建Kubernetes叢集,請確保您的叢集滿足以下條件:
-
自建Kubernetes叢集中已部署VNode。
-
如果您的Kubernetes叢集部署線上下IDC,請確保已打通IDC與阿里雲的網路。
-
如果您的Kubernetes叢集部署在ECS上,且使用的網路外掛程式為Flannel,請確保已在叢集中部署CCM,保證ECI與標準節點上的Pod可以正常通訊。具體操作,請參見部署CCM。
準備工作
-
安裝Istio。具體操作,請參見Istio快速入門。
-
建立Namespace並配置Label。
kubectl create namespace istio-test kubectl label namespace istio-test istio-injection=enabled
操作步驟
部署Bookinfo應用
-
將以下內容儲存為bookinfo.yaml。
說明下述YAML樣本中已增加nodeSelector實現將Pod調度到VNode,您也可以配置eci-profile來實現。更多資訊,請參見將Pod調度到VNode和使用eci-profile調度Pod到VNode。
-
部署Bookinfo。
kubectl -n istio-test apply -f bookinfo.yaml預期返回:
xxx# kubectl -n istio-test apply -f bookinfo.yaml service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created -
查看Bookinfo運行情況。
kubectl -n istio-test get pods -o wide預期返回:
[xxx@xxx ~]# kubectl -n istio-test get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES details-v1-5f957dd5ff-kdvpc 2/2 Running 0 14m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> productpage-v1-85976f8df7-ht5dg 2/2 Running 0 72s 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> ratings-v1-69fb6864cf-9l7fp 2/2 Running 0 23m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v1-77f77b5-sssgw 2/2 Running 0 7m13s 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v2-5b9b5676c-bcjx9 2/2 Running 0 23m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v3-6ff46dbb9c-kf2gl 2/2 Running 0 13m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> -
檢查Services。
kubectl -n istio-test get services預期返回:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.96.1.xxx <none> 9080/TCP 25m productpage ClusterIP 10.96.2.xxx <none> 9080/TCP 25m ratings ClusterIP 10.96.1.xxx <none> 9080/TCP 25m reviews ClusterIP 10.96.1.xxx <none> 9080/TCP 25m
部署Gateway
-
將以下內容儲存為bookinfo-gateway.yaml。
-
部署Gateway。
kubectl -n istio-test apply -f bookinfo-gateway.yaml預期返回。
[root@xxx ~]# kubectl -n istio-test apply -f bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created -
查看Gateway。
kubectl -n istio-test get gateway預期返回:
NAME AGE bookinfo-gateway 88s
驗證Bookinfo服務
-
確定Istio Gateway的Host地址。
請根據叢集情況選擇Istio Ingress Service,本文使用LoadBalancer方式:
kubectl -n istio-system get service istio-ingressgateway預期返回:
[xxx@xxx ~]# kubectl -n istio-system get service istio-ingressgateway NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.96.xxx <pending> 15021:31682/TCP,80:32247/TCP,443:31049/TCP,31400:30519/TCP,15443:31511/TCP 43m通過返回資訊可以得到istio-ingressgateway的Host地址(
IP:Port格式)為10.96.XX.XX:80。 -
建立一個測試Pod,用於驗證服務。
-
將以下內容儲存為test-pod.yaml。
-
部署Pod。
kubectl apply -f test-pod.yaml
-
-
登入測試Pod,然後執行命令驗證服務。
kubectl exec -it centos -- bashcurl -s http://10.96.XX.XX:80/productpage | grep -o "<title>.*</title>"其中
10.96.XX.XX:80為步驟1擷取的Host地址。如果返回<title>Simple BookStore App<title>,則表示Istio已經成功運行在VNode上。