部署 Bookinfo 範例
本頁面說明如何部署範例應用程式,以示範 Cloud Service Mesh。如果您尚未安裝 Cloud Service Mesh,請參閱安裝指南。
Cloud Service Mesh 安裝程序會隨附多個範例應用程式。本指南會逐步引導您部署 BookInfo 範例。這是一個簡單的模擬書店應用程式,包含四個服務:產品網頁、書籍詳細資料、評論 (包含數個版本的評論服務) 及評分。這些服務皆使用 Cloud Service Mesh 管理。您可以在 samples/bookinfo
中 Cloud Service Mesh 安裝檔的目錄中找到本範例使用的原始碼和所有其他檔案。
啟用補充自動注入功能
如要啟用側邊車自動注入功能,您必須為命名空間加上標籤,讓側邊車注入器 webhook 將注入的側邊車與特定控制平面修訂版本建立關聯。如果您設定預設代碼,請使用預設插入標籤為命名空間加上標籤。否則,請使用修訂版本標籤為命名空間加上標籤。此外,您新增的標籤也取決於您是部署代管 Cloud Service Mesh 還是安裝叢集內控制層。
代管
您可以使用預設的插入標籤,也可以使用命名空間的修訂標籤
預設注入標籤
將預設的注入標籤套用至命名空間。
kubectl label namespace NAMESPACE istio-injection=enabled istio.io/rev-
修訂版本標籤
在部署應用程式之前,請從命名空間中移除所有先前的
istio-injection
標籤,並改為設定istio.io/rev=REVISION_LABEL
標籤。如要變更為特定修訂版本標籤,請按一下
REVISION_LABEL
,然後將其替換為適用的標籤:asm-managed-rapid
代表快速管道、asm-managed
代表一般管道,或是asm-managed-stable
代表穩定管道。修訂版本標籤對應至發布管道:
修訂版本標籤 管道 asm-managed
一般 asm-managed-rapid
快速 asm-managed-stable
穩定 kubectl label namespace NAMESPACE istio-injection- istio.io/rev=REVISION_LABEL --overwrite
如果您也部署了選用的受管理資料平面,請在
NAMESPACE
命名空間中加上註解,如下所示:kubectl annotate --overwrite namespace NAMESPACE \ mesh.cloud.google.com/proxy='{"managed":"true"}'
叢集內
使用下列指令,找出
istiod
上的標籤:kubectl -n istio-system get pods -l app=istiod --show-labels
輸出看起來類似以下內容:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-1253-8,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-1253-8,istio=istiod,pod-template-hash=5788d57586
在輸出內容的
LABELS
欄下,請記下istiod
修訂版本標籤的值,該值位於前置字串istio.io/rev=
之後。在這個範例中,這個值為asm-1253-8
。將修訂版本標籤套用至預設命名空間。在下列指令中,
REVISION
是您在上一個步驟中記下的istiod
修訂版本標籤值。kubectl label namespace default istio-injection- istio.io/rev=REVISION --overwrite
您可以忽略輸出內容中的訊息
"istio-injection not found"
。這表示命名空間先前沒有istio-injection
標籤,而 Cloud Service Mesh 的新安裝作業或新部署作業應會包含此標籤。由於命名空間同時具有istio-injection
和修訂版本標籤時,自動插入行為並未定義,因此 Cloud Service Mesh 說明文件中的所有kubectl label
指令都會明確確保只設定一個。
部署應用程式
由於 default
命名空間已啟用自動注入功能,因此在您部署 BookInfo 應用程式的服務時,系統會在每個服務旁邊注入補充 Proxy。
在已安裝 Cloud Service Mesh 的電腦上,使用指令列前往 Cloud Service Mesh 安裝目錄的根目錄。如有需要,請下載安裝檔案。
使用
kubectl
將應用程式部署至預設命名空間:kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
執行下列指令,確認應用程式已正確部署:
kubectl get services
輸出:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE details 10.0.0.31 <none> 9080/TCP 6m kubernetes 10.0.0.1 <none> 443/TCP 7d productpage 10.0.0.120 <none> 9080/TCP 6m ratings 10.0.0.15 <none> 9080/TCP 6m reviews 10.0.0.170 <none> 9080/TCP 6m
和
kubectl get pod
輸出:
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
最後,為應用程式定義輸入閘道轉送:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
輸出:
gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
驗證應用程式部署作業
如要查看 BookInfo 應用程式是否正常運作,您必須將流量傳送至入口網關。
如果您在 Google Distributed Cloud 上安裝了 Cloud Service Mesh,請取得安裝 Cloud Service Mesh 後設定的入口閘道外部 IP 位址
如果您已在 GKE 上安裝 Cloud Service Mesh,請按照下列步驟取得輸入閘道的外部 IP 位址:
kubectl get service istio-ingressgateway -n istio-system
輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
在這個範例中,輸入服務的 IP 位址為
35.239.7.64
。
試用應用程式
使用
curl
檢查 BookInfo 應用程式是否正在執行:curl -I http://EXTERNAL_IP/productpage
如果回應顯示
200
,表示應用程式正常運作 Cloud Service Mesh。如要查看 BookInfo 網頁,請在瀏覽器中輸入下列網址:
http://EXTERNAL_IP/productpage
請重新整理頁面幾次,你應該會看到產品頁面中顯示不同版本的評論,以循環配置方式呈現 (紅色星號、黑色星號、無星號)。
應用程式現在會產生流量,您可以前往 Google Cloud 主控台探索 Cloud Service Mesh 頁面,查看指標和其他可觀察性功能。
正在清除所用資源
實驗 Bookinfo 範例後,請從叢集中移除該範例。
使用下列指令碼解除安裝 Bookinfo:
samples/bookinfo/platform/kube/cleanup.sh
確認關機:
kubectl get virtualservices #-- there should be no virtual services kubectl get destinationrules #-- there should be no destination rules kubectl get gateway #-- there should be no gateway kubectl get pods #-- the Bookinfo pods should be deleted