Google Compute Engine で Istio を使用する

Istio は、マイクロサービスを接続、モニタリング、保護するためのオープンソース フレームワークです。サービスコードの変更を必要とせずに、負荷分散、サービス間認証、モニタリングなどを使用して、デプロイされたサービスのネットワーク(または「メッシュ」)を構築できます。サービスに Istio サポートを追加するには、特殊な Envoy サイドカー プロキシを各アプリケーションのポッドにデプロイします。Envoy プロキシは、マイクロサービス間のすべてのネットワーク通信をインターセプトします。このプロキシは、Istio のコントロール プレーン機能を使用して設定および管理します。

現在、Istio のコントロール プレーンは、Google Kubernetes Engine などの Kubernetes が実装された環境にしかインストールできませんが、Istio のメッシュ拡張機能を使用すれば、非 Kubernetes プラットフォームで実行されるサービスをサービス メッシュ(Compute Engine VM で実行されるサービスなど)に追加することができます。つまり、Kubernetes と VM サービスを 1 つのメッシュとして制御できます。このチュートリアルでは、メッシュ拡張機能を使用するように Istio を設定する方法、および Compute Engine VM を Istio メッシュに追加できるように設定する方法について説明します。すでに Kubernetes Engine に Istio インストール環境が構築されていることを前提としています。

Istio の詳細、および Istio を独自のウェブサイトで機能させる方法については、istio.io をご覧ください。このチュートリアルで使用されているメッシュ拡張機能の設定がどのように機能するかについて知りたい場合は、機能の紹介をご覧ください。こちらの情報を確認しなくても、このチュートリアルは実行できます。

目標

  • メッシュ拡張機能を使用するために、Kubernetes Engine インストール環境の既存の Istio を更新する
  • Istio サービス メッシュに参加するように Compute Engine VM を設定する
  • Compute Engine VM で Istio メッシュ サービスを実行する

料金

このチュートリアルでは、Cloud Platform の課金対象となるコンポーネント(Compute Engine を含む)を使用しています。

Cloud Platform を初めて使用する方は、無料トライアルをご利用いただけます。

始める前に

  • Kubernetes Engine に Istio インストール環境が構築されている必要があります。これを行う方法、および関連する設定と要件については、Google Kubernetes Engine への Istio のインストールをご覧ください。
  • BookInfo サンプル アプリケーションをインストールし、実行中の状態にしておく必要があります(これについても Google Kubernetes Engine への Istio のインストールをご覧ください)。また、PATHistioctl を設定しておく必要もあります。
  • 前のチュートリアルの 4 つの内部ロードバランサ(それぞれに 1 つのロードバランサと 1 つの IP アドレス)と BookInfo のイングレス サービス(1 つのロードバランサと 1 つの IP アドレス)を実行するために、十分な数の 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

拡張するためのメッシュの設定

非 Kubernetes サービスを Istio メッシュに追加する最初のステップは、Istio インストール環境自体を設定し、Compute Engine VM から使用できるように設定ファイルを生成することです。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. 次の手順に進む前に、サービスが実行されていることを確認し、すべての ILB に 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]
    

    これにより、次のような 1 行が含まれているファイルが作成されます。

    $ cat cluster.env
    ISTIO_SERVICE_CIDR=10.63.240.0/20
  4. ここで、同じスクリプトを使用して、VM で使用する DNS 設定ファイルを生成します。これにより、Compute Engine VM 上のアプリは、dnsmasq を使用してクラスタ サービス名を解決できます。これらは、サイドカーによってインターセプトおよび転送されます。

    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 の設定

メッシュを設定して関連する設定ファイルを生成したら、次に、生成されたファイルを VM にコピーするなど、メッシュと結合されるように Compute Engine VM を設定します。チュートリアルを行うために、提供された setupMeshEx.sh スクリプトをもう一度使用し、ファイルをコピーしてマシンを設定することができます。ただし、独自の VM を実際のメッシュ アプリケーションに追加する場合は、以下の手順を手動で実行して、それらの VM を独自のワークフローとプロビジョニングに統合する必要があります。詳細な手順については、Istio のメッシュ拡張機能ガイドをご覧ください。setupMeshEx.sh が各 VM に対して実行するスクリプトについては、/install/tools/setupIstioVM.sh をご覧ください。

  1. まず、Istio インストール環境と同じプロジェクトおよびネットワークに、メッシュ拡張マシンとして使用する Compute Engine VM があることを確認します。まだ用意していない場合は、以下を実行して作成します。

    gcloud compute instances create istio-vm
    
  2. Istio は複数の Kubernetes 名前空間にわたってサービスを管理することができます。この例では、Kubernetes 上ではなく、vm 名前空間に VM サービスを配置します(提供されている BookInfo ルーティング ルールによって検索されます)。このように異なる名前空間を使用すると、VM サービスを通常の Kubernetes サービスと分けて管理することができます。メッシュ拡張マシンにデフォルト以外の名前空間を使用するには、設定スクリプトを実行する前に、その名前空間を指定する必要があります。まず、クラスタ管理マシン上の Istio インストール ディレクトリ内に SERVICE_NAMESPACE 変数を設定します。

    export SERVICE_NAMESPACE=vm
    

    次に、名前空間を作成します。

    kubectl create namespace $SERVICE_NAMESPACE
    
  3. クラスタ管理マシンでは、setupMeshEx.sh セットアップ スクリプトで次のコマンドを実行します。これにより、以下が実行されます。

    • 生成されたファイルと VM セットアップ スクリプトを VM にコピーします。
    • VM が Istio コンポーネントに接続できるように DNS 設定を設定し、検証します。
    • Istio 認証シークレットを VM にコピーします。
    • Istio サイドカー プロキシを含む Istio Debian ファイルを VM にインストールします。
    install/tools/setupMeshEx.sh machineSetup istio-vm
  4. gcloud または Console の [VM インスタンスの詳細] ページ([VM インスタンス] ページからリンクされています)のその他のオプションを使用して、Compute Engine VM に SSH 接続します。

    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 サンプルがデフォルトの名前空間に作成されたため、ここでは製品ページ URL の 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

メッシュ拡張マシンでのサービスの実行

ここでは、メッシュ拡張マシンでサービスを実行するために必要な作業について考えてみましょう。この例では、前のセクションで設定した VM を使用しつつ、Compute Engine VM 上で動作する MySQL レーティング データベースを使用して、Google Kubernetes Engine に Istio をインストールした BookInfo サンプルを拡張します。

  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. このチュートリアル用に、ユーザーを「root」、パスワードを「password」として MySQL サーバーを構成します(本番環境ではこのように構成しないでください)。

    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 インスタンスの詳細] ページで確認するか、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. 続けてクラスタ管理マシンで、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 に戻り、関連するポート(この例ではサービス登録時に指定した 3306)でトラフィックをインターセプトするように istio-vm の Istio プロキシ サイドカーを構成します。これは、/var/lib/istio/envoy/sidecar.env のファイルに、次の 3 行を追加することによって設定します。

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

    設定を変更した後、サイドカーを再起動する必要があります。

    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 上のアプリケーションで、メッシュ内の別のサービスへのリクエストを作成する場合は、DNS を使用して名前を解決し、サービス IP(またはクラスタ IP、サービスに割り当てられた VIP)を戻す必要があります。Istio の特別なメッシュ拡張 VM 設定では、VM アプリケーションは dnsmasq を使用して名前を解決します。これにより、すべての .cluster.local アドレスは Kubernetes にリダイレクトされます。また、dnsmasq の設定で、127.0.0.1resolv.conf に追加します。必要に応じて、各 DHCP の解決後に挿入されるように DHCP を設定します。

アプリケーションが実際にリクエストを行うと、Istio VM の設定は ipnames を使用して Envoy プロキシ経由でリクエストをリダイレクトします。プロキシは、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 のサンプルが含まれており、実際に試してみることができます。

  • Intelligent Routing: この例では、BookInfo で Istio のさまざまなトラフィック管理機能(このチュートリアルの最後のセクションで使用したルーティング ルールを含む)を使用する方法を示します。

  • In-Depth Telemetry: この例では、Istio Mixer と Istio サイドカー プロキシを使用して BookInfo のサービス全体で均一な指標、ログ、トレースを取得する方法を示します。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント