使用 Kubernetes 執行 Bookinfo

此模組向您展示一個由四個以不同程式設計語言撰寫的微服務組成的應用程式:productpagedetailsratingsreviews。我們將組成的應用程式稱為 Bookinfo,您可以在 Bookinfo 範例頁面上了解更多資訊。

Bookinfo 範例顯示應用程式的最終狀態,其中 reviews 微服務有三個版本:v1v2v3。在此模組中,應用程式僅使用 reviews 微服務的 v1 版本。接下來的模組將透過部署較新版本的 reviews 微服務來增強應用程式。

部署應用程式和測試 Pod

  1. 設定 MYHOST 環境變數以保存應用程式的 URL

    $ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
    
  2. 瀏覽 bookinfo.yaml。這是應用程式的 Kubernetes 部署規範。請注意服務和部署。

  3. 將應用程式部署到您的 Kubernetes 叢集

    $ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/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
    service/productpage created
    serviceaccount/bookinfo-productpage created
    deployment.apps/productpage-v1 created
    
  4. 檢查 Pod 的狀態

    $ kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    details-v1-6d86fd9949-q8rrf     1/1     Running   0          10s
    productpage-v1-c9965499-tjdjx   1/1     Running   0          8s
    ratings-v1-7bf577cb77-pq9kg     1/1     Running   0          9s
    reviews-v1-77c65dc5c6-kjvxs     1/1     Running   0          9s
    
  5. 在四個 Pod 達到 Running 狀態後,您可以擴展部署。為了讓每個微服務的每個版本在三個 Pod 中執行,請執行以下命令

    $ kubectl scale deployments --all --replicas 3
    deployment.apps/details-v1 scaled
    deployment.apps/productpage-v1 scaled
    deployment.apps/ratings-v1 scaled
    deployment.apps/reviews-v1 scaled
    
  6. 檢查 Pod 狀態。請注意,每個微服務都有三個 Pod

    $ kubectl get pods
    NAME                            READY   STATUS    RESTARTS   AGE
    details-v1-6d86fd9949-fr59p     1/1     Running   0          50s
    details-v1-6d86fd9949-mksv7     1/1     Running   0          50s
    details-v1-6d86fd9949-q8rrf     1/1     Running   0          1m
    productpage-v1-c9965499-hwhcn   1/1     Running   0          50s
    productpage-v1-c9965499-nccwq   1/1     Running   0          50s
    productpage-v1-c9965499-tjdjx   1/1     Running   0          1m
    ratings-v1-7bf577cb77-cbdsg     1/1     Running   0          50s
    ratings-v1-7bf577cb77-cz6jm     1/1     Running   0          50s
    ratings-v1-7bf577cb77-pq9kg     1/1     Running   0          1m
    reviews-v1-77c65dc5c6-5wt8g     1/1     Running   0          49s
    reviews-v1-77c65dc5c6-kjvxs     1/1     Running   0          1m
    reviews-v1-77c65dc5c6-r55tl     1/1     Running   0          49s
    
  7. 在服務達到 Running 狀態後,部署一個測試 Pod,curl,用於向您的微服務傳送請求

    $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml
    
  8. 為了確認 Bookinfo 應用程式正在執行,請從您的測試 Pod 使用 curl 命令向其傳送請求

    $ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -c curl -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
    <title>Simple Bookstore App</title>
    

啟用對應用程式的外部存取

當您的應用程式運行後,請啟用叢集外部的客戶端來存取它。成功設定以下步驟後,您就可以從筆記型電腦的瀏覽器存取該應用程式。

設定 Kubernetes Ingress 資源並存取您的應用程式網頁

  1. 建立一個 Kubernetes Ingress 資源

    $ kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: bookinfo
      annotations:
        kubernetes.io/ingress.class: istio
    spec:
      rules:
      - host: $MYHOST
        http:
          paths:
          - path: /productpage
            pathType: Prefix
            backend:
              service:
                name: productpage
                port:
                  number: 9080
          - path: /login
            pathType: Prefix
            backend:
              service:
                name: productpage
                port:
                  number: 9080
          - path: /logout
            pathType: Prefix
            backend:
              service:
                name: productpage
                port:
                  number: 9080
          - path: /static
            pathType: Prefix
            backend:
              service:
                name: productpage
                port:
                  number: 9080
    EOF
    

更新您的 /etc/hosts 設定檔

  1. 取得名為 bookinfo 的 Kubernetes ingress 的 IP 位址

    $ kubectl get ingress bookinfo
    
  2. 在您的 /etc/hosts 檔案中,將先前的 IP 位址新增到以下指令提供的主機條目中。您應該具有超級使用者權限,並可能使用sudo 來編輯 /etc/hosts

    $ echo $(kubectl get ingress istio-system -n istio-system -o jsonpath='{..ip} {..host}') $(kubectl get ingress bookinfo -o jsonpath='{..host}')
    

存取您的應用程式

  1. 從命令列存取應用程式的首頁

    $ curl -s $MYHOST/productpage | grep -o "<title>.*</title>"
    <title>Simple Bookstore App</title>
    
  2. 將以下指令的輸出貼到您的瀏覽器網址列中

    $ echo http://$MYHOST/productpage
    

    您應該會看到以下網頁

    Bookinfo Web Application
    Bookinfo 網頁應用程式
  3. 觀察微服務如何互相呼叫。例如,reviews 使用 http://ratings:9080/ratings URL 呼叫 ratings 微服務。請參閱 reviews 的程式碼

    private final static String ratings_service = "http://ratings:9080/ratings";
    
  4. 在另一個終端機視窗中設定一個無限迴圈,以將流量傳送到您的應用程式,模擬真實世界中持續的用戶流量

    $ while :; do curl -s $MYHOST/productpage | grep -o "<title>.*</title>"; sleep 1; done
    <title>Simple Bookstore App</title>
    <title>Simple Bookstore App</title>
    <title>Simple Bookstore App</title>
    <title>Simple Bookstore App</title>
    ...
    

您已準備好測試應用程式

這些資訊對您有幫助嗎?
您是否有任何改進建議?

感謝您的回饋!