在 Kubernetes Engine 上安裝 Istio

Istio 是可用於連結、監控和保護微服務的開放原始碼架構,這些微服務包括在 Kubernetes Engine 上執行的服務。能讓您在不更改服務程式碼的情況下,為部署的服務建立一個網路,提供負載平衡、服務對服務驗證、監控等功能。如要為服務新增 Istio 支援,您可以將特殊的 Envoy 補充 Proxy 部署至應用程式的每個 pod。Envoy Proxy 會攔截微服務之間的所有網路通訊。您可以透過 Istio 的控制層功能設定及管理 Envoy Proxy。本教學課程將示範如何在 GKE 上安裝和設定 Istio,並部署啟用 Istio 的多服務應用程式。

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud會包含在 Google Cloud SDK 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 來安裝 kubectl
    gcloud components install kubectl

設定 gcloud 指令列工具的預設設定

為了節省您在 gcloud 指令列工具中輸入專案 IDCompute Engine 區域選項的時間,建議您採用以下預設設定:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

建立 GKE 叢集

如要建立本教學課程的叢集,請執行下列指令。以下我們稱此教學叢集為 istio-tutorial

gcloud container clusters create istio-tutorial \
    --machine-type=n1-standard-2 \
    --num-nodes=4

使用您自己的叢集

如要在本教學課程中使用現有叢集,請使用 GKE 預設的 Kubernetes 版本,並啟用角色型存取控制 (RBAC)。根據預設,會在執行 Kubernetes 1.6 以上版本的叢集啟用 RBAC。若要在較舊版本上啟用 RBAC,請使用選項 --no-enable-legacy-authorization 更新叢集。

請確認您已安裝 kubectl,而且版本與您的叢集相同或更新。您可以透過執行 kubectl version 來確認您使用的是最新版本。

步驟 1:安裝 Istio

現在讓我們安裝 Istio。Istio 是安裝在自己的 istio-system 命名空間,而且可管理所有其他命名空間中的微服務。此安裝包括 Istio 核心元件、工具和樣本。

在含有叢集憑證的機器中執行以下步驟: 這會是您的叢集管理員機器。

  1. 前往 Istio 版本頁面,下載對應到您要執行 Istio 用戶端的作業系統的安裝檔案。

  2. 將下載的安裝檔案解壓縮。安裝目錄包含:

    • Kubernetes 適用的安裝檔案 .yaml (位於 install/)
    • 應用程式範例 (位於 samples/)
    • istioctl 用戶端二進位檔 (位於 bin/ 目錄)。將 Envoy 手動置入為補充 Proxy 時,以及建立轉送規則與政策時,會使用 istioctl
    • istio.VERSION 設定檔
  3. 確認目前是在 Istio 安裝的根目錄中。

  4. istioctl 用戶端新增到您的 PATH:

    export PATH=$PWD/bin:$PATH
  5. 將叢集管理員權限授予目前使用者。您需要這些權限來為 Istio 建立必要的角色型存取控制 (RBAC) 規則:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    
  6. 安裝 Istio 的核心元件:

    kubectl apply -f install/kubernetes/istio-demo-auth.yaml

    這會進行以下操作:

    • 建立 istio-system命名空間以及所需的 RBAC 權限
    • 部署核心 Istio 元件:

      • Istio-Pilot:負責服務探索,以及在 Istio 服務網狀網路中設定 Envoy 補充 Proxy。
      • Mixer 元件 Istio-Policy 與 Istio-Telemetry:強制執行使用政策,並跨服務網狀網路收集遙測資料。
      • Istio-Ingressgateway:為叢集外的流量提供輸入點。
      • Istio-Citadel:自動管理 Istio 的金鑰和憑證。
    • 為指標、記錄檔及追蹤記錄部署外掛程式。

    • 在兩個 Envoy 補充 Proxy 之間啟用雙向 TLS 驗證。請注意,此驗證選項可能不適用於所有應用程式:您可以在 Istio 設定指南中瞭解如何在沒有此選項的情況下安裝 Istio,以及執行這種安裝的時機。

步驟 2:驗證 Istio 安裝

  1. 確認已部署以下 Kubernetes 服務:istio-citadelistio-pilotistio-ingressgatewayistio-policyistio-telemetry (您也會看到其他部署的服務):

    kubectl get service -n istio-system
    
    輸出:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-egressgateway        ClusterIP      10.19.242.139           80/TCP,443/TCP                                                        40s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. 確認已部署對應的 Kubernetes Pod,且所有的容器都已啟動並執行:istio-pilot-*istio-policy-*istio-telemetry-*istio-ingressgateway-*istio-citadel-*

    kubectl get pods -n istio-system
    
    輸出:
    NAME                                        READY     STATUS      RESTARTS   AGE
    grafana-6995b4fbd7-mp7ps                    1/1       Running     0          12m
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-egressgateway-c68bcd889-p52rb         1/1       Running     0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-grafana-post-install-6dwhp            0/1       Completed   3          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-statsd-prom-bridge-55965ff9c8-x6sqd   1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    servicegraph-684c85ffb9-9cd4x               1/1       Running     0          12m

步驟 3:部署 BookInfo 範例應用程式

安裝好 Istio 且所有元件都正常運作後,您就可以嘗試部署安裝檔案所提供的範例應用程式。在本教學課程中,我們會安裝 BookInfo。 這是一個簡單的模擬書店應用程式,包含四個服務:產品網頁、書籍詳細資料、評論 (包含數個版本的評論服務) 及評分。這些服務皆使用 Istio 管理。您可以在 Istio 安裝檔中的 samples/bookinfo 目錄找到本範例使用的原始碼和所有其他檔案。

按照這些步驟,在啟用 Istio 的環境中部署 BookInfo 應用程式的服務,並在每個服務置入 Envoy 補充 Proxy 以提供 Istio 功能。

  1. 確認您仍在叢集管理員機器上的 Istio 安裝根目錄中。

  2. 使用 kubectl applyistioctl kube-inject 部署應用程式。kube-inject 指令更新 BookInfo 部署,以便在每個應用程式 Pod 和服務中部署補充 Proxy。

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. 執行下列指令,確認應用程式已正確部署:

    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 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
  4. 最後,為應用程式定義輸入閘道轉送:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

步驟 4:驗證應用程式部署

部署完成,接下來讓我們實際操作 BookInfo 應用程式。

取得輸入 IP 和通訊埠

要使用 BookInfo,首先您要取得輸入 IP 和通訊埠,如下所示:

kubectl get svc 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

這會提供您輸入服務的位址,如下 (使用第一個通訊埠):

export GATEWAY_URL=35.239.7.64:80

試用應用程式

取得位址和通訊埠後,使用 curl 檢查 BookInfo 應用程式是否正在執行:

curl -I http://${GATEWAY_URL}/productpage

如果回應顯示 200,表示應用程式正常運作 Istio。

然後將瀏覽器指向 http://$GATEWAY_URL/productpage 查看 BookInfo 網頁。請重新整理頁面幾次,您應該會看到產品頁面中顯示不同版本的評論,以循環配置方式呈現 (紅色星號、黑色星號、無星號),因為我們尚未使用 Istio 來控制版本轉送。

部署自己的應用程式

如果您想嘗試部署自己的應用程式,只要在相同的程序中使用您自己的 YAML 部署即可:您不需要變更應用程式即可使用 Istio。請注意,應用程式必須在所有 HTTP 流量上使用 HTTP/1.1 or HTTP/2.0 通訊協定,因為 Envoy Proxy 不支援 HTTP/1.0:Envoy Proxy 需要的轉送標頭在 HTTP/1.0 中並不存在。

清除資源

如要避免系統向您的 Google Cloud Platform 帳戶收取您在本教學課程中使用資源的相關費用:

如果您不想在後續步驟一節中繼續探索 BookInfo 應用程式,請執行以下操作,避免系統向您的 Google Cloud Platform 帳戶收取您在本教學課程中使用資源的相關費用:

  1. 刪除 istio-ingressgateway 輸入服務。

    kubectl -n istio-system delete service istio-ingressgateway
  2. 查看下列指令的輸出,等待 istio-ingressgateway 負載平衡器刪除作業完成:

    gcloud compute forwarding-rules list
  3. 刪除容器叢集:

    gcloud container clusters delete istio-tutorial

後續步驟

雖然 Istio 控制層只能安裝在 Kubernetes 上,但 Istio 的網狀網路擴充功能允許您將非 Kubernetes 的機器 (如 Compute Engine VM) 新增到 Istio 服務網狀網路中。您可以在使用 Istio 搭配 Compute Engine 中查看如何操作,並擴充我們的 BookInfo 範例。

如果您想進一步探索 Istio,Istio 網站的指南部分有更多教學課程,讓您試用 BookInfo 的 Istio 功能。其中包括:

  • 智慧型轉送:示範如何將 Istio 的各種流量管理功能與 BookInfo 搭配使用,這也是很適合在結束本教學課程後進行的後續步驟。
  • 深入遙測:示範如何使用 Istio Mixer 和 Envoy Proxy 在各項 BookInfo 服務間取得統一指標、記錄檔以及追蹤記錄。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 教學課程