Bookinfo 應用程式
此範例部署一個由四個獨立的微服務組成的範例應用程式,用於展示各種 Istio 功能。
此應用程式會顯示關於書籍的資訊,類似於線上書店的單一目錄條目。頁面上會顯示書籍的描述、書籍詳細資訊(ISBN、頁數等等)以及一些書評。
Bookinfo 應用程式被分解為四個獨立的微服務。
productpage
。productpage
微服務會呼叫details
和reviews
微服務來填充頁面內容。details
。details
微服務包含書籍資訊。reviews
。reviews
微服務包含書評。它也會呼叫ratings
微服務。ratings
。ratings
微服務包含與書評相關的書籍評級資訊。
reviews
微服務有 3 個版本。
- 版本 v1 不會呼叫
ratings
服務。 - 版本 v2 會呼叫
ratings
服務,並將每個評級顯示為 1 到 5 個黑色星星。 - 版本 v3 會呼叫
ratings
服務,並將每個評級顯示為 1 到 5 個紅色星星。
應用程式的端到端架構如下所示。
此應用程式是多語言的,也就是說,微服務是用不同的語言編寫的。值得注意的是,這些服務不依賴於 Istio,但它們是一個有趣的服務網格範例,特別是因為 reviews
服務有多種服務、語言和版本。
開始之前
如果您尚未設定 Istio,請依照安裝指南中的說明進行設定。
部署應用程式
要在 Istio 中執行此範例,無需變更應用程式本身。相反地,您只需在啟用 Istio 的環境中設定並執行服務,並在每個服務旁邊注入 Envoy Sidecar。最終的部署會如下所示。
所有微服務都將與 Envoy Sidecar 一起打包,該 Sidecar 會攔截服務的傳入和傳出呼叫,提供透過 Istio 控制平面從外部控制整個應用程式的路由、遙測收集和策略強制執行所需的掛鉤。
啟動應用程式服務
將目錄變更為 Istio 安裝的根目錄。
預設的 Istio 安裝使用自動 Sidecar 注入。使用
istio-injection=enabled
標籤標記將託管應用程式的命名空間。$ kubectl label namespace default istio-injection=enabled
使用
kubectl
命令部署您的應用程式。$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
此命令會啟動
bookinfo
應用程式架構圖中顯示的所有四個服務。所有 3 個版本的 reviews 服務 v1、v2 和 v3 都會啟動。確認所有服務和 Pod 都已正確定義並正在執行。
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.0.0.31 <none> 9080/TCP 6m kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 7d productpage ClusterIP 10.0.0.120 <none> 9080/TCP 6m ratings ClusterIP 10.0.0.15 <none> 9080/TCP 6m reviews ClusterIP 10.0.0.170 <none> 9080/TCP 6m
和
$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-1520924117-48z17 2/2 Running 0 6m productpage-v1-560495357-jk1lz 2/2 Running 0 6m ratings-v1-734492171-rnr5l 2/2 Running 0 6m reviews-v1-874083890-f0qf0 2/2 Running 0 6m reviews-v2-1343845940-b34q5 2/2 Running 0 6m reviews-v3-1813607990-8ch52 2/2 Running 0 6m
若要確認 Bookinfo 應用程式正在執行,請從某些 Pod 發送請求給它,例如從
ratings
。$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
判斷入口 IP 和連接埠
現在 Bookinfo 服務已啟動並正在執行,您需要使應用程式可以從您的 Kubernetes 叢集外部存取,例如從瀏覽器。閘道會用於此目的。
為 Bookinfo 應用程式建立閘道。
使用以下命令建立一個Istio 閘道。
$ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@ gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
確認閘道已建立。
$ kubectl get gateway NAME AGE bookinfo-gateway 32s
請依照這些說明設定
INGRESS_HOST
和INGRESS_PORT
變數,以便存取閘道。設定完成後請返回這裡。使用以下命令建立一個 Kubernetes 閘道。
$ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@ gateway.gateway.networking.k8s.io/bookinfo-gateway created httproute.gateway.networking.k8s.io/bookinfo created
因為建立 Kubernetes
Gateway
資源也會部署相關的 Proxy 服務,請執行以下命令等待閘道準備就緒。$ kubectl wait --for=condition=programmed gtw bookinfo-gateway
從 bookinfo 閘道資源取得閘道位址和埠。
$ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}') $ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
設定
GATEWAY_URL
。$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
確認應用程式可從叢集外部存取
若要確認可以從叢集外部存取 Bookinfo 應用程式,請執行以下 curl
命令。
$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
您也可以將瀏覽器指向 http://$GATEWAY_URL/productpage
以檢視 Bookinfo 網頁。如果您多次重新整理頁面,您應該會在 productpage
中看到不同版本的評論,以循環方式呈現(紅色星星、黑色星星、沒有星星),因為我們尚未透過 Istio 控制版本路由。
定義服務版本
在您可以使用 Istio 控制 Bookinfo 版本路由之前,您需要定義可用的版本。
Istio 使用目的地規則中的 *子集* 來定義服務的版本。執行以下命令,為 Bookinfo 服務建立預設的目的地規則。
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@
等待幾秒鐘,讓目的地規則傳播。
您可以使用以下命令顯示目的地規則。
$ kubectl get destinationrules -o yaml
與使用 DestinationRule
子集來定義服務版本的 Istio API 不同,Kubernetes Gateway API 使用後端服務定義來達到此目的。
執行以下命令,為 reviews
服務的三個版本建立後端服務定義。
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.yaml@
下一步
您現在可以使用此範例來試驗 Istio 的流量路由、故障注入、速率限制等功能。若要繼續,請參閱一個或多個Istio 工作,視您的興趣而定。設定請求路由對初學者來說是一個不錯的起點。
清除
當您完成 Bookinfo 範例的實驗後,請使用以下命令解除安裝並清理它。
$ @samples/bookinfo/platform/kube/cleanup.sh@