透過 Google Compute Engine 使用 Istio

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

Istio 的控制層目前只能安裝在 Google Kubernetes Engine (GKE) 等 Kubernetes 實作項目上,但其具備網格擴充功能,可將在非 Kubernetes 平台上執行的服務新增到服務網格中,包括在 Compute Engine VM 上執行的服務。這項功能讓您將 Kubernetes 和虛擬機器 (VM) 服務整合為單一網格進行管理。本教學課程說明如何設定 Istio 使用網格擴充功能,以及如何設定 Compute Engine VM 執行個體,才能將執行個體新增至 Istio 網格。本文假設您在 GKE 上現有安裝好的 Istio。

如要進一步瞭解 Istio 及其運作方式,請參閱 istio.io 的相關說明。如果您有興趣瞭解本教學課程使用的網格擴充功能設定如何運作,請參閱運作方式一節,但不需要閱讀該章節的說明,也能完成本教學課程中的各項操作。

目標

  • 更新系統上安裝之 GKE 上現有的 Istio,以使用網格擴充功能。
  • 設定 Compute Engine VM 執行個體,使其加入 Istio 服務網格。
  • 在 Compute Engine VM 執行個體上執行 Istio 網格服務。

費用

本教學課程使用 Google Cloud Platform 的計費元件,包括 Compute Engine。

初次使用 GCP 的使用者可能符合申請免費試用的資格。

事前準備

  • 您在 GKE 上必須現有安裝好的 Istio。詳情請參閱在 GKE 叢集上安裝 Istio一文。
  • 您必須安裝並執行 BookInfo 範例應用程式 (相關做法同樣可以參閱在 GKE 叢集上安裝 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 [COMPUTE_ENGINE_ZONE]

為網格進行擴充的設定

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

  1. 使用所提供的 mesh-expansion 部署項目,為 PilotMixer、Istio 憑證授權單位和 GKE Cloud 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 執行個體中使用的 Cloud 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

設定網格擴充功能 VM

在您將網格設定完畢並產生相關設定檔後,下一個步驟是設定 Compute Engine VM 執行個體,使其加入網格,過程中須將先前產生的檔案複製到 VM。就本教學課程而言,您可以再次使用所提供的 setupMeshEx.sh 指令碼來複製檔案及設定機器。不過,在將自己的 VM 新增至實際網格應用程式時,請按照相關步驟手動將執行個體整合到您自己的工作流程和佈建中。如需詳細步驟,請參閱 Istio 的網格擴充功能指南,並在 /install/tools/setupIstioVM.sh 中查看 setupMeshEx.sh 在每個 VM 上執行的指令碼。

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

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

    export SERVICE_NAMESPACE=vm
    

    然後建立命名空間:

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

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

    gcloud compute ssh istio-vm
    
  5. 在 Compute Engine VM 上,確認已設定的機器可以存取在 GKE 叢集中執行的服務。舉例來說,如果您在 Kubernetes Engine 叢集中執行在 GKE 上安裝 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. 請注意,這裡的產品頁面網址使用 default,這是因為在前一個教學課程中,BookInfo 範例是建立在預設命名空間中。如果您選擇使用不同的命名空間,請改為使用該命名空間。

  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

在網格擴充功能機器上執行服務

下列範例說明如何在網格擴充功能機器上執行服務。在本範例中,您會使用上一節設定的 VM,對在 GKE 上安裝 Istio一文中的 BookInfo 範例進行延伸,使其使用 Compute Engine VM 上執行的 MySQL 評分資料庫。

  1. 根據前文所述,確認 istio-vm 已針對執行 BookInfo 的叢集設為網格擴充功能 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 位址 (可透過 Console 的「VM Instance Details」(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 應用程式的評分服務就會使用新的網格擴充功能資料庫。請嘗試在 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 執行個體上的應用程式向網格中的其他服務提出要求時,該應用程式會使用 Cloud DNS 來解析名稱,此作業會傳回服務 IP (或叢集 IP,也就是指派給服務的 VIP)。在 Istio 的特別網格擴充功能 VM 設定中,VM 應用程式會使用 dnsmasq 來解析名稱,將所有 .cluster.local 位址重新導向至 GKE。dnsmasq 設定也會將 127.0.0.1 新增至 resolv.conf,並在必要時設定 DHCP,在每個 DHCP 解析後方插入 127.0.0.1

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

清除所用資源

如要避免系統向您的 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 說明文件