Bookinfo 應用程式

此範例部署一個由四個獨立的微服務組成的範例應用程式,用於展示各種 Istio 功能。

此應用程式會顯示關於書籍的資訊,類似於線上書店的單一目錄條目。頁面上會顯示書籍的描述、書籍詳細資訊(ISBN、頁數等等)以及一些書評。

Bookinfo 應用程式被分解為四個獨立的微服務。

  • productpageproductpage 微服務會呼叫 detailsreviews 微服務來填充頁面內容。
  • detailsdetails 微服務包含書籍資訊。
  • reviewsreviews 微服務包含書評。它也會呼叫 ratings 微服務。
  • ratingsratings 微服務包含與書評相關的書籍評級資訊。

reviews 微服務有 3 個版本。

  • 版本 v1 不會呼叫 ratings 服務。
  • 版本 v2 會呼叫 ratings 服務,並將每個評級顯示為 1 到 5 個黑色星星。
  • 版本 v3 會呼叫 ratings 服務,並將每個評級顯示為 1 到 5 個紅色星星。

應用程式的端到端架構如下所示。

Bookinfo Application without Istio
沒有 Istio 的 Bookinfo 應用程式

此應用程式是多語言的,也就是說,微服務是用不同的語言編寫的。值得注意的是,這些服務不依賴於 Istio,但它們是一個有趣的服務網格範例,特別是因為 reviews 服務有多種服務、語言和版本。

開始之前

如果您尚未設定 Istio,請依照安裝指南中的說明進行設定。

部署應用程式

要在 Istio 中執行此範例,無需變更應用程式本身。相反地,您只需在啟用 Istio 的環境中設定並執行服務,並在每個服務旁邊注入 Envoy Sidecar。最終的部署會如下所示。

Bookinfo Application
Bookinfo 應用程式

所有微服務都將與 Envoy Sidecar 一起打包,該 Sidecar 會攔截服務的傳入和傳出呼叫,提供透過 Istio 控制平面從外部控制整個應用程式的路由、遙測收集和策略強制執行所需的掛鉤。

啟動應用程式服務

  1. 將目錄變更為 Istio 安裝的根目錄。

  2. 預設的 Istio 安裝使用自動 Sidecar 注入。使用 istio-injection=enabled 標籤標記將託管應用程式的命名空間。

    $ kubectl label namespace default istio-injection=enabled
    
  3. 使用 kubectl 命令部署您的應用程式。

    壓縮
    $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
    

    此命令會啟動 bookinfo 應用程式架構圖中顯示的所有四個服務。所有 3 個版本的 reviews 服務 v1、v2 和 v3 都會啟動。

  4. 確認所有服務和 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
    
  5. 若要確認 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 叢集外部存取,例如從瀏覽器。閘道會用於此目的。

  1. 為 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_HOSTINGRESS_PORT 變數,以便存取閘道。設定完成後請返回這裡。

  2. 設定 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

下一步

您現在可以使用此範例來試驗 Istio 的流量路由、故障注入、速率限制等功能。若要繼續,請參閱一個或多個Istio 工作,視您的興趣而定。設定請求路由對初學者來說是一個不錯的起點。

清除

當您完成 Bookinfo 範例的實驗後,請使用以下命令解除安裝並清理它。

壓縮
$ @samples/bookinfo/platform/kube/cleanup.sh@
此資訊是否實用?
您是否有任何改進建議?

感謝您的回饋!