部署 Bookinfo 範例
本頁說明如何部署範例應用程式,展示 Cloud Service Mesh。如尚未加入 Cloud Service Mesh,請參閱加入指南。
安裝 Cloud Service Mesh 時,系統會提供多個範例應用程式。本指南會逐步說明如何部署 BookInfo 範例。這是一個簡易的模擬書店應用程式,包含四項服務,可提供網頁產品頁面、書籍詳細資料、評論 (包含多個版本的評論服務) 和評分,所有服務都透過 Cloud Service Mesh 管理。您可以在 samples/bookinfo 的 Cloud Service Mesh 安裝目錄中,找到本範例使用的原始碼和所有其他檔案。
範例圖片的網路存取權
在核心網格安裝期間,asmcli 工具不會檢查或從 Docker Hub (docker.io) 提取任何內容。不過,在安裝後部署第三方容器映像檔會觸發 Kubelet,從 Docker Hub 和 Docker Hub 的備份 Cloudflare CDN 擷取範例應用程式映像檔。
在受限或氣隙網路中,除非明確配合,否則這些映像檔提取作業會失敗。
如要配合映像檔提取作業,請選擇下列其中一種做法:
允許輸出流量
更新防火牆或 Proxy,允許 HTTPS (通訊埠 443) 輸出至下列網域。請注意,Docker Hub 會使用 HTTP 307 重新導向來提供映像檔層,因此必須使用 Cloudflare 網域。
- docker.io
- hub.docker.com
- *.cloudflarestorage.com
鏡像至私人登錄檔
如果是完全受限的環境,請勿開啟防火牆通訊埠。請改為將所需範例映像檔鏡像到內部登錄檔,並設定叢集以使用內部登錄檔。
如需在 GDC 環境中設定這項功能的詳細操作說明,請參閱「使用登錄檔鏡像處理容器映像檔」。
啟用邊車自動插入功能
啟用命名空間以進行插入作業。實際步驟取決於控制層實作方式。
代管 (TD)
- 將預設插入標籤套用至命名空間:
kubectl label namespace default \ istio.io/rev- istio-injection=enabled --overwrite受管理 (Istiod)
建議:執行下列指令,將預設插入標籤套用至命名空間:
kubectl label namespace default \ istio.io/rev- istio-injection=enabled --overwrite如果您是使用受管理 Istiod 控制層的現有使用者: 建議使用預設注入功能,但系統也支援以修訂版本為準的注入功能。請按照下列指示操作:
執行下列指令,找出可用的發布管道:
kubectl -n istio-system get controlplanerevision輸出結果會與下列內容相似:
NAME AGE asm-managed-rapid 6d7h注意:如果上述清單中出現兩個控制層修訂版本,請移除其中一個。叢集不支援多個控制層通道。
在輸出內容中,「
NAME」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。將修訂版本標籤套用至命名空間:
kubectl label namespace default \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
叢集內
建議:執行下列指令,將預設插入標籤套用至命名空間:
kubectl label namespace default \ istio.io/rev- istio-injection=enabled --overwrite建議您使用預設的插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列指示操作:
使用下列指令,找出
istiod的修訂版本標籤:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'將修訂版本標籤套用至命名空間。在下列指令中,
REVISION_LABEL是您在上一步記下的istiod修訂版本標籤值。kubectl label namespace default \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
部署應用程式
現在 default 命名空間已啟用自動插入功能,因此部署 BookInfo 應用程式的服務時,系統會一併插入 Sidecar Proxy。
在安裝 Cloud Service Mesh 的電腦上,前往 Cloud Service Mesh 安裝目錄的根目錄。如有需要,請下載叢集內安裝檔案,其中包含 bookinfo 範例應用程式,並解壓縮檔案。
使用
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 應用程式是否正常運作,請將流量傳送至 Ingress 閘道。
如果您在 Google Distributed Cloud (僅限軟體) for VMware 上安裝 Cloud Service Mesh,請取得您在安裝 Cloud Service Mesh 後設定的 Ingress 閘道外部 IP 位址
如果您在 GKE 上安裝 Cloud Service Mesh,請按照下列步驟取得 Ingress 閘道的外部 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
在本例中,Ingress 服務的 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