開始使用 Istio

開始使用 IBM Cloud® Kubernetes Service 中的管理型 Istio 附加元件。 在這組步驟中,您會部署 BookInfo 範例應用程式,以練習使用 Istio 的幾項服務網狀功能。

開始之前,請檢閱 Istio 附加元件變更記錄,以瞭解版本資訊。

步驟 1:啟用 Istio 附加元件

在群集中設定受管理的 Istio 附加元件。

請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  1. 啟用 istio 附加程式。

    ibmcloud ks cluster addon enable istio --cluster CLUSTER_NAME_OR_ID
    
  2. 確認受管理的 Istio 附加元件的狀態為 Addon Ready。 請注意,附加程式可能需要幾分鐘才能備妥。

    ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID
    

    輸出範例

    Name            Version     Health State   Health Status
    istio           1.29       normal         Addon Ready
    
  3. 您也可以檢查此附加元件的各個組件,以確認「Istio」Pod 是否已部署。

    kubectl get pods -n istio-system
    
    kubectl get svc -n istio-system
    

如需 IBM Cloud Kubernetes Service 中 Istio 的詳細資訊,請參閱 關於受管理的 Istio 附加元件

步驟 2: 設定 BookInfo 範例應用程式

BookInfo 範例程式包含基本的 Istio 設定,讓您可以立即試用 Istio 的功能。

四個 BookInfo 微服務包括:

  • productpage 會呼叫 detailsreviews 微服務以移入頁面。
  • details 包含書籍資訊。
  • ratings 包含隨附書籍檢閱的書籍分級資訊。
  • reviews 包含書籍檢閱,並呼叫 ratings 微服務。 reviews 微服務具有多個版本:
    • v1 不會呼叫 ratings 微服務。
    • v2 會呼叫 ratings 微服務,並將評等顯示為 1 到 5 顆黑色星星。
    • v3 會呼叫 ratings 微服務,並將評等顯示為 1 到 5 顆紅色星星。

此外,BookInfo 應用程式已由 Istio 閘道在公用 IP 位址上公開。 若要查看 BookInfo 架構,請查看 Istio 文件

  1. 在叢集裡安裝 BookInfo。

    1. 請下載最新的 Istio 套件,其中包含 BookInfo 應用程式的設定檔。
        curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh -
        ```
    2. 導覽至 Istio 套件目錄。
    ```sh {: pre}
        cd istio-1.29.5
        ```
    3. Linux 和 macOS 使用者: 將 `istioctl` 用戶端新增至 `PATH` 系統變數。
    ```sh {: pre}
        export PATH=$PWD/bin:$PATH
        ```
    4. 標示自動 Sidecar 注入的 `default` 名稱空間。 任何部署到 `default` 的新 pod 現在都會自動使用 Envoy proxy sidecar 容器來建立。
    ```sh {: pre}
        kubectl label namespace default istio-injection=enabled
        ```
    5. 部署 BookInfo 應用程式、閘道及目的地規則。
    ```sh {: pre}
        kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
        kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
        kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
        ```
    6. 確保 BookInfo 微服務 Pod 是 `Running`。
    ```sh {: pre}
        kubectl get pods
        ```
        ```sh {: screen}
        NAME                                     READY     STATUS      RESTARTS   AGE
        details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
        productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
        ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
        reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
        reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
        reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
        ```
    
  2. 取得公開 BookInfo之 istio-ingressgateway 負載平衡器的公用位址。

    • 經典簇
      1. 將 Istio 輸入 IP 位址設定為環境變數。
        export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
        
      2. 將 Istio 輸入埠設定為環境變數。
        export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
        
      3. 建立使用 Istio Ingress 主機和埠的 GATEWAY_URL 環境變數。
        export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
        
    • VPC 叢集:建立使用 Istio Ingress 主機名稱的 GATEWAY_URL 環境變數。
        export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
        ```
    
  3. GATEWAY_URL 變數進行 Curl 處理,以確認 BookInfo 應用程式正在執行中。 200 回應表示 BookInfo 應用程式與 Istio 適當地執行中。

    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  4. 在瀏覽器中檢視 BookInfo 網頁。

    Mac OS 或 Linux

    open http://$GATEWAY_URL/productpage
    

    Windows

    start http://$GATEWAY_URL/productpage
    
  5. 嘗試多次重新整理頁面。 不同版本的檢閱區段循環式 ( reviewsv1 )、黑色星號 (v2) 及紅色星號 (v3)。

如需更多關於 Istio 中路由工作方式的資訊,請參閱 瞭解所發生的事情

步驟 3: 模擬 BookInfo 的逐步實施

若要模擬應用程式的釋出,您可以執行 BookInfo 的 reviews 微服務的分階段推出 v3

當您測試完應用程式並準備開始引導線上流量之後,您可以透過 Istio 逐步執行推出。 例如,您可以先將 v3 釋放至 10% 的使用者,然後再釋放至 20% 的使用者,依此類推。

  1. 配置虛擬服務,以將 0% 的資料流量配送至 v1,將 90% 的資料流量配送至 v2,並將 10% 的資料流量配送至 reviewsv3

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v1
          weight: 0
        - destination:
            host: reviews
            subset: v2
          weight: 90
        - destination:
            host: reviews
            subset: v3
          weight: 10
    
    kubectl apply -f <filename>.yaml
    
  2. 在 Mac OS 或 Linux 上執行 open http://$GATEWAY_URL/productpage,或在 Windows 上執行 start http://$GATEWAY_URL/productpage,在瀏覽器中檢視 BookInfo 網頁。

  3. 嘗試多次重新整理頁面。 請注意,不再顯示沒有星號 (v1) 的頁面,且大部分頁面重新整理會顯示黑色星號 (v2)。只有很少顯示含有紅色星號 (v3) 的頁面。

  4. 變更資料流量配送,以便所有資料流量僅傳送至 v3。 請注意,在實際實務範例中,您可能會透過將資料流量配送先變更為 80:20,然後變更為 70:30,以緩慢推出版本變更,直到所有資料流量都僅遞送至最新版本為止。

    1. 編輯 reviews 虛擬服務的配置檔。
        kubectl edit VirtualService reviews
        ```
    2. 將 `v2` 的 `weight` 變更為 `0`,並將 `v3` 的 `weight` 變更為 `100`。
    3. 儲存並關閉檔案。
    
    
  5. 請嘗試多次重新整理 BookInfo 頁面。 請注意,不再顯示含有黑色星星的頁面 (v2),只會顯示含有紅色星星的頁面 (v3)。

  6. 如果您已啟用特使存取日誌: 請驗證在您變更檢閱 VirtualService 的 YAML 檔案之後的時間內,對 v2 的要求沒有日誌存在。

    kubectl logs -l app=reviews,version=v2 -c istio-proxy
    

步驟 4: 使用 IBM Cloud Monitoring 監視 BookInfo

使用 Monitoring 預先定義的 Istio 面板之一來監控您的 BookInfo 微服務。

若要將監視代理程式部署至叢集,請完成下列步驟。

  1. 佈建 IBM Cloud Monitoring的實例。

  2. 在叢集裡配置監視代理程式。

  3. Monitoring 主控台中,按一下您所佈建實例的 開啟儀表板

  4. 在 Monitoring 使用者介面中,按一下 新增儀表板

  5. 搜尋「Istio」,並選取其中一個「Monitoring」預設的「Istio」儀表板。

如需進一步了解如何參考指標與儀表板、監控 Istio 內部元件,以及監控 Istio 的 A/B 測試部署與金絲雀部署,請參閱 如何監控 Istio —— Kubernetes 的服務網格 這篇部落格文章。

步驟 5: 啟用 mTLS 來保護叢集內資料流量

啟用命名空間中工作負載的加密功能,以在群集內部實現相互 TLS ( mTLS )。 在叢集裡 Pod 之間由 Envoy 遞送的資料流量會使用 TLS 進行加密。 mTLS 的憑證管理由 Istio 進行處理。 如需詳細資訊,請參閱 Istio mutual TLS 文件

  1. 建立名為 default.yaml 的鑑別原則檔案。 此政策適用於命名空間範圍,並設定服務網格中的工作負載僅接受使用 TLS 加密的請求。 請注意,此處未包含任何 targets 規格,因為此政策適用於此命名空間中網格內的全部服務。
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. 將鑑別原則套用至名稱空間。
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. 建立一個名為 destination-mtls.yaml 的目的地規則檔案。 此原則可設定命名空間中的服務網狀工作負載使用 TLS 傳送流量。 請注意,host: *.local 萬用字元會將此目的地規則套用於網格中的所有服務。
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. 套用目的地規則。
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. 若要為其他命名空間中的服務網格工作負載啟用 mTLS,請在每個命名空間中重複執行這些步驟。

此外,出於非鑑別原因(例如,將資料流量遞送到不同版本的服務),也會使用目的地規則。 為服務建立的任何目的地規則還必須包含設定為 mode: ISTIO_MUTUAL 的相同 TLS 區塊。 此區塊會封鎖規則置換在此部分中配置的網格範圍的 mTLS 設定。