透過 Google Compute Engine 使用 Istio

Istio 是可用於連結、監控和保護微服務的開放原始碼架構,能讓您在不需更改服務程式碼的情況下,為部署的服務建立具備負載平衡、服務對服務驗證、監控等功能的網路或「Mesh」。如要為服務新增 Istio 支援,您可以將特殊的 Envoy 補充 Proxy 部署至每個應用程式的 pod。Envoy Proxy 會攔截微服務之間的所有網路通訊,可供您透過 Istio 的控制層功能進行設定及管理。

Istio 的控制層目前只能在 Google Kubernetes Engine 這類採用 Kubernetes 系統的環境中安裝,不過 Istio 的 Mesh 擴充功能可讓您將執行於非 Kubernetes 平台的服務新增至服務 Mesh,包括在 Compute Engine VM 執行的服務。這項功能讓您將 Kubernetes 和 VM 服務整合為單一 Mesh 進行管理。本教學課程會說明如何設定 Istio 使用 Mesh 擴充功能,以及將 Compute Engine VM 新增至 Istio Mesh 的設定方式。本文預設您已在 Kubernetes Engine 上安裝了現有 Istio。

如要進一步瞭解 Istio 的資訊和運作方式,請造訪 Istio 網站:istio.io。如果您有興趣瞭解本教學課程使用的 Mesh 擴充設定如何運作,請參閱運作方式一節;即使不理解運作方式,您也能完成本教學課程中的各項操作。

目標

  • 更新在 Kubernetes Engine 上安裝的現有 Istio,藉此使用 Mesh 擴充功能
  • 設定 Compute Engine VM 以便加入 Istio 服務 Mesh
  • 在 Compute Engine VM 執行 Istio Mesh 服務

費用

本教學課程使用包括 Compute Engine 在內的 Cloud Platform 可計費元件。

Cloud Platform 的新使用者可能符合申請免費試用的資格。

事前準備

  • 您必須在 Kubernetes Engine 上安裝現有 Istio:請參閱在 Google Kubernetes Engine 上安裝 Istio 一文,瞭解安裝方式以及相關設定和需求。
  • 您必須安裝並執行 BookInfo 範例應用程式,相關做法同樣可以參閱在 Google Kubernetes Engine 上安裝 Istio 一文;您的 PATH 中也需要具有 istioctl
  • 您必須有足夠的 IP 位址和後端服務配額,才能執行四個內部負載平衡器 (每個負載平衡器需要一組 IP 位址) 和前文提及的 BookInfo 的輸入服務 (每個負載平衡器需要一組 IP 位址)。
  • 確認您的 kubectl 背景資訊已設為 Istio 叢集。

    kubectl config current-context              # Display the current-context
    kubectl config use-context [CLUSTER_NAME]   # set the default context to [CLUSTER_NAME]
    

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

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

設定擴充功能 Mesh

將非 Kubernetes 服務新增至 Istio Mesh 時,第一步須先設定您要安裝的 Istio 本身, 並產生可允許 Compute Engine VM 使用該 Istio 的設定檔。您下載的 Istio 會包含可協助您在 Kubernetes Engine 上進行這項設定的指令碼:您可以在 /install/tools/setupMeshEx.sh 中找到該指令碼。請找到您的 Istio 安裝目錄和叢集憑證所在的機器 (這是您的叢集管理機器),並按照機器上的步驟操作。

  1. 使用本文提供的 mesh-expansion 部署設定 PilotMixer、Istio 憑證授權單位和 Kubernetes DNS 伺服器的內部負載平衡器。藉此確保 VM 能存取這些服務。

    kubectl apply -f install/kubernetes/mesh-expansion.yaml
    
  2. 確認這些服務都已啟動且正在執行,所有內部負載平衡器皆顯示 EXTERNAL-IP 值 (可能需要稍等一下),然後再進行下一個步驟:

    $ kubectl -n istio-system get services
    NAME              TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                                  AGE
    istio-ca-ilb      LoadBalancer   10.47.245.69    10.150.0.9       8060:32174/TCP                                           3m
    istio-egress      ClusterIP      10.47.252.251   <none>           80/TCP                                                   7m
    istio-ingress     LoadBalancer   10.47.254.41    35.197.249.113   80:31822/TCP,443:30637/TCP                               7m
    istio-mixer       ClusterIP      10.47.244.179   <none>           9091/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP   8m
    istio-pilot       ClusterIP      10.47.241.19    <none>           8080/TCP,443/TCP                                         7m
    istio-pilot-ilb   LoadBalancer   10.47.243.136   10.150.0.6       8080:30064/TCP                                           3m
    mixer-ilb         LoadBalancer   10.47.242.213   10.150.0.8       9091:31278/TCP                                           3m
  3. 使用 Istio 安裝目錄中的輔助指令碼產生要在 VM 中部署的 Istio cluster.env 設定,並指定您自己的叢集名稱。這個設定檔會包含系統要攔截的叢集 IP 位址範圍。

    install/tools/setupMeshEx.sh generateClusterEnv [CLUSTER_NAME]
    

    這項操作會建立內含單行指令的檔案,範例如下:

    $ cat cluster.env
    ISTIO_SERVICE_CIDR=10.63.240.0/20
  4. 接著,使用相同的指令碼產生要在 VM 中使用的 DNS 設定檔,藉此允許 Compute Engine VM 上的應用程式使用 dnsmasq 解析叢集服務名稱,補充 Proxy 會攔截並轉送這類名稱。

    install/tools/setupMeshEx.sh generateDnsmasq
    

    這項操作產生的範例檔案如下:

    $ cat kubedns
    server=/svc.cluster.local/10.150.0.7
    address=/istio-mixer/10.150.0.8
    address=/istio-pilot/10.150.0.6
    address=/istio-ca/10.150.0.9
    address=/istio-mixer.istio-system/10.150.0.8
    address=/istio-pilot.istio-system/10.150.0.6
    address=/istio-ca.istio-system/10.150.0.9

設定 Mesh 擴充 VM

在您將 Mesh 設定完畢並產生相關設定檔後,下一步就要設定 Compute Engine VM 以便加入 Mesh,過程中須將先前產生的檔案複製到 VM。為了達到教學目的,您可以再次使用本文提供的 setupMeshEx.sh 指令碼來複製檔案及設定機器。不過,在將您的 VM 新增至實際 Mesh 應用程式時,您應按照相關步驟手動操作,才能依個人工作流程和佈建情況整合 VM。您可以在 Istio 的 Mesh 擴充功能指南中找到詳細步驟,並在 /install/tools/setupIstioVM.sh 中查看 setupMeshEx.sh 在每個 VM 上執行的指令碼。

  1. 先確認您有可在相同專案中做為 Mesh 擴充機器使用的 Compute Engine VM,以及可用於 Istio 安裝的網路。如果您沒有 VM,請先建立:

    gcloud compute instances create istio-vm
    
  2. Istio 可管理多個 Kubernetes 命名空間中的服務:在本範例中,您會將 VM 服務 (即使不是屬於 Kubernetes 平台) 置入 vm 命名空間,因為本文提供的 BookInfo 轉送規則會在該命名空間尋找 VM 服務。按照這個方式使用不同的命名空間可協助您區別 VM 服務和一般 Kubernetes 服務。如要針對 Mesh 擴充機器使用非預設的命名空間,您必須在執行設定程式碼前指定該命名空間。請先在叢集管理員機器上的 Istio 安裝目錄中設定 SERVICE_NAMESPACE 變數:

    export SERVICE_NAMESPACE=vm
    

    然後建立命名空間:

    kubectl create namespace $SERVICE_NAMESPACE
    
  3. 繼續在叢集管理機器上使用 setupMeshEx.sh 設定指令碼執行下列指令,藉此進行以下操作:

    • 將先前產生的檔案和 VM 設定指令碼複製到 VM
    • 調整及驗證 DNS 設定,讓 VM 能連結至 Istio 元件
    • 將 Istio 驗證密鑰複製到 VM
    • 在 VM 上安裝 Istio Debian 檔案,包括 Istio 補充 Proxy
    install/tools/setupMeshEx.sh machineSetup istio-vm
  4. 使用 gcloud 或「VM 執行個體詳細資料」主控台頁面 (可在您的 VM 執行個體頁面找到連結) 中的任何其他選項,透過 SSH 登入 Compute Engine VM:

    gcloud compute ssh istio-vm
    
  5. 在 Compute Engine VM 上,確認已設定的機器可以存取在 Kubernetes Engine 叢集中執行的服務。舉例來說,如果您在 Kubernetes Engine 叢集中執行在 Google Kubernetes Engine 上安裝 Istio 一文說明的 BookInfo 範例應用程式,則可以從該 VM 透過 curl 存取 productpage 服務,如同下列範例所示:

    $ curl -v -w "\n" http://productpage.default.svc.cluster.local:9080/api/v1/products/0/ratings
    *   Trying 10.63.251.156...
    * Connected to productpage.default.svc.cluster.local (10.63.251.156) port 9080 (#0)
    > GET /api/v1/products/0/ratings HTTP/1.1
    > Host: productpage.default.svc.cluster.local:9080
    > User-Agent: curl/7.47.0
    > Accept: /
    >
    < HTTP/1.1 200 OK
    < content-type: application/json
    < content-length: 54
    < server: envoy
    < date: Sun, 15 Oct 2017 00:04:49 GMT
    < x-envoy-upstream-service-time: 17
    <

    • Connection #0 to host productpage.default.svc.cluster.local left intact {"ratings": {"Reviewer2": 4, "Reviewer1": 5}, "id": 0}
  6. 請注意,這裡用來在產品頁面網址中表示 BookInfo 範例應用程式的 default 是建立於前文提及的預設命名空間之中;如要選擇使用不同的命名空間,請使用該命名空間取代 default。

  7. 繼續在 VM 上檢查 Istio 程序是否正在執行:

    $ sudo systemctl status istio-auth-node-agent
    istio-auth-node-agent.service - istio-auth-node-agent: The Istio auth node agent
      Loaded: loaded (/lib/systemd/system/istio-auth-node-agent.service; disabled; vendor preset: enabled)
      Active: active (running) since Fri 2017-10-13 21:32:29 UTC; 9s ago
      Docs: http://istio.io/
    Main PID: 6941 (node_agent)
      Tasks: 5
      Memory: 5.9M
      CPU: 92ms
      CGroup: /system.slice/istio-auth-node-agent.service
              └─6941 /usr/local/istio/bin/node_agent --logtostderr
    
    Oct 13 21:32:29 demo-vm-1 systemd[1]: Started istio-auth-node-agent: The Istio auth node agent.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469314    6941 main.go:66] Starting Node Agent
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469365    6941 nodeagent.go:96] Node Agent starts successfully.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.483324    6941 nodeagent.go:112] Sending CSR (retrial #0) ...
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.862575    6941 nodeagent.go:128] CSR is approved successfully. Will renew cert in 29m59.137732603s

在 Mesh 擴充機器上執行服務

這一節將說明在 Mesh 擴充機器上執行服務的必要操作。在本範例中,您會使用上一節設定的 VM 對在 Google Kubernetes Engine 上安裝 Istio一文說明的 BookInfo 範例應用程式進行擴充,納入在 Compute Engine VM 上執行的 MySQL 評分資料庫。

  1. 根據前文所述,確認 istio-vm 已針對 BookInfo 執行的所在叢集設為 Mesh 擴充 VM。

  2. 在 Compute Engine VM 上安裝 MySQL 伺服器:

    sudo apt-get update && sudo apt-get install --no-install-recommends -y mariadb-server
    
  3. 為了達到教學目的 (請勿運用於實際工作環境),設定 MySQL 伺服器,將「root」使用者的密碼設為「password」。

    sudo mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'password'; flush privileges"
    
  4. 然後使用本文提供的 mysqldb-init.sql 結構定義來設定 BookInfo 評分資料庫。

    curl https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/src/mysql/mysqldb-init.sql| mysql -u root --password=password -h 127.0.0.1
    
  5. 接著,使用 istioctl 為您安裝的 Istio 註冊新服務。請先取得 VM 的主要內部 IP 位址 (可透過主控台的「VM 執行個體詳細資料」頁面或使用 hostname --ip-address 查看),然後在叢集管理機器上執行下列指令,取代適當的 IP 位址:

    $ istioctl register -n vm mysqldb 10.150.0.5 3306
    I1014 22:54:12.176972   18162 register.go:44] Registering for service 'mysqldb' ip '10.150.0.5', ports list [{3306 mysql}]
  6. 繼續在叢集管理機器上將 BookInfo 部署作業更新為使用 MySQL 資料庫的評分服務版本,並更新向 BookInfo 傳送流量的路徑。

    $ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-ratings-v2-mysql-vm.yaml)
    deployment "ratings-v2-mysql-vm" created
    $ kubectl get pods -lapp=ratings
    NAME                                   READY     STATUS    RESTARTS   AGE
    ratings-v1-3016823457-mqbfx            2/2       Running   0          24m
    ratings-v2-mysql-vm-1319199664-9jxkp   2/2       Running   0          19s
    $ istioctl create -f samples/bookinfo/kube/route-rule-ratings-mysql-vm.yaml
    Created config route-rule/default/ratings-test-v2-mysql-vm at revision 4398
    Created config route-rule/default/reviews-test-ratings-v2-vm at revision 4399
  7. 最後,返回 Compute Engine VM 並設定 istio-vm 的 Istio Proxy 補充資訊,藉此攔截相關通訊埠 (本範例在註冊服務時指定的通訊埠為 3306) 的流量。如要在 /var/lib/istio/envoy/sidecar.env 中進行設定,請將以下三行指令新增至檔案。

    $ sudo vi /var/lib/istio/envoy/sidecar.env
    ...
    ISTIO_INBOUND_PORTS=3306
    ISTIO_SERVICE=mysqldb
    ISTIO_NAMESPACE=vm
    

    設定變更完畢後,您必須重新啟動補充 Proxy。

    sudo systemctl restart istio
    
  8. 完成上述所有操作後,BookInfo 應用程式的評分服務應該會使用新的 Mesh 擴充資料庫。請嘗試在 VM 上變更評分資料庫中的值,並查看這些值是否會在 BookInfo 應用程式的產品頁面中顯示。

    $ mysql -u root -h 127.0.0.1 --password=password test -e "select * from ratings"
    +----------+--------+
    | ReviewID | Rating |
    +----------+--------+
    |        1 |      5 |
    |        2 |      4 |
    +----------+--------+
    # Change to 1 star:
    $ mysql -u root --password=password test -e "update ratings set rating=1 where reviewid=1"
    

    UI 中已更新的評分

運作方式

VM 上的應用程式要向 Mesh 中的其他服務提出要求時,該應用程式必須使用 DNS 解析服務名稱,才能傳回服務 IP (或叢集 IP,也就是指派給服務的 VIP)。在 Istio 的特別 Mesh 擴充 VM 設定中,VM 會使用 dnsmasq 解析名稱,將所有 .cluster.local 位址重新導向 Kubernetes.。dnsmasq 設定也會將 127.0.0.1 新增至 resolv.conf,並在必要時設定 DHCP,在每個 DHCP 解析後方插入位址。

當應用程式實際提出要求時,Istio VM 設定會使用 ipnames 透過 Envoy Proxy 將要求重新導向。接著 Proxy 會連線至 Istio-Pilot 服務取得端點清單,並在套用規則後將要求轉送至適當的 Mesh 端點。

清理

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

如果您不想在後續步驟一節中繼續探索 BookInfo 應用程式,請執行以下操作:

  1. 刪除在範例中使用的各種內部負載平衡器:

    kubectl -n istio-system delete service --all
    kubectl -n kube-system delete service dns-ilb
    
  2. 等到看見系統輸出以下指令時,即表示所有負載平衡器皆已刪除:

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

    gcloud container clusters delete [CLUSTER_NAME]
    
  4. 刪除資料庫 VM:

    gcloud compute instances delete istio-vm
    

後續步驟

Istio 網站 還有更多內含 Istio 有效示範用法的指南和範例可供您嘗試,其中包括:

  • 智慧型轉送:示範如何將 Istio 的各種流量管理功能與 BookInfo 合併使用,包括本教學課程最後一節中使用的轉送規則。

  • 深入遙測:示範如何使用 Istio Mixer 和 Istio 補充 Proxy 在各項 BookInfo 服務中取得統一指標、記錄檔和追蹤記錄。

本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁
Compute Engine 說明文件