Istio 1.0 を試してみた!

Google Cloud でゲーム会社の技術支援をしているサミールです。

本日は最近ホットなトピックで、バージョン 1.0 が Cloud NEXT’18 でアナウンスされた Istio のお話をしたいと思います。

Istio を1行で説明すると、私は以下のように説明しています。

マイクロサービスを Kubernetes 上で管理・運用、そしてセキュアにする OSS のサービス

Istio については、まずド正式ドキュメントをご参照いただくことをオススメします。

Istio の概要

マイクロサービス間の通信(サービスメッシュ)を管理、監視、セキュリティ強化を可能とする OSS サービスです。

以下の図にある Service A と Service B の通信をコントロールしたり、通信によるメトリックなど収集したり、サービス間の通信を mTLS で暗号化したりするのが Istio の役割です。

Istio のアーキテクチャ

Istio には4つの主なコンポーネントがあります:

  1. Envoy (proxy): C++ で書かれたハイパフォーマンスプロキシ。Envoy の詳細はこちら
  2. Pilot: サービス通信ポリシー(トラフィック管理など)を管理・デプロイ
  3. Mixer: ポリシーの強制とメトリックの収集
  4. Citadel: サービス間の認証を管理(mTLS など)

では Istio をインストールして試してみましょう!

Kubernetes (k8s) クラスタの作成

Istio を試すには、まず Kubernetes クラスタにインストールする必要があります。k8s クラスタは GCP のマネージド k8s サービスである Google Kubernetes Engine (GKE) で作成します。GKE クラスタの作成手順はこちらから。

Istio の前提条件として、GCE のデフォルトサービスアカウント(XXXXXXXXXX-compute@developer.gserviceaccount.com)に以下のロールを追加する必要があります。

roles/container.admin (Kubernetes Engine Admin)
https://istio.io/docs/setup/kubernetes/quick-start-gke-dm/

Istio のインストール

Istio をインストールするには、まずは最新のビルドのソースをダウンロードする必要がります。

$ curl -L https://git.io/getLatestIstio | sh -

その後、Istio のパッケージディレクトリに移動し、Istio のコマンドラインツール(istioctl)を PATH に追加します。

$ cd istio-1.0.1
$ export PATH=$PWD/bin:$PATH

Istio 用の CRD を適用します。

kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml

Istio のインストールは2択あります:

[1] Proxy 同士の mTLS を利用する場合のインストール

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

[2] Proxy 同士の mTLS を利用しない場合のインストール。

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

注意点:以下の検証では mTLS なしのオプションを選択しました。

Istio インストールの確認

Istio のインストールが成功したことを確認するには、以下のコマンドを入力して画像に表示されているサービスが存在していることを確認します。

$ kubectl get svc -n istio-system
Istio 専用の namespace に追加された Service をリストする

同じく、以下のコマンドラインで Istio の Pod がちゃんと起動しているかを確認します。

$ kubectl get pods -n istio-system
Istio 専用の namespace に追加された Pod がちゃんと起動しているかを確認する

Envoy Proxy の自動注入を有効

Istio の Proxy をアプリと同じ Pod に自動注入するには、アプリをデプロイする予定の Namespace にあるラベルを定義する必要があります。

Istio の Proxy 自動注入はオススメです!以下のコマンドで有効にします。

$ kubectl label namespace <namespace> istio-injection=enabled

これで準備 OK です!Istio プロジェクトにあるサンプリアプリ(bookinfo)を次にデプロイしましょう。

Bookinfo アプリのデプロイ

Bookinfo アプリは4つのマイクロサービスでオンラインブックストアを再現したものです。

アプリの UI とマイクロサービスをマッピングすると:

注意点:Reviews サービスのみが3つのバージョンをもつ

ではサンプルアプリを kubectl でデプロイします。

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

デプロイが成功したかを確認するには、以下のサービスとポッドがちゃんと起動していることを確認します。

$ kubectl get services -n default
Bookinfo の4つのサービスが存在することを確認
$ kubectl get pods -n default
Bookinfo の6つのポッドが起動していることを確認

外部 IP からアプリにアクセスできるようにするには、Istio の ingress gateway をデプロイします。

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

Gateway がちゃんと作成されたのを確認します。

$ kubectl get gateway

作成された gateway の external IP と port を確認するのは、以下のコマンドで表示することができます。

$ kubectl get svc istio-ingressgateway -n istio-system
EXTERNAL-IP と PORT 31380

Bookinfo アプリにブラウザで以下の URL からアクセスできます。

http://<EXTERNAL-IP>:31380/productpage

ここまでは、GKE のクラスタに Istio をインストールして、Proxy の自動注入を有効にしてから、サンプルアプリである Bookinfo をデプロイしました。

モニタリング

Istio をインストールすると、デフォルトで Prometheus と Grafana をインストールします。そして自動的にメトリックが収集されます。

まずはサービスが起動していることを確認します。

kubectl -n istio-system get svc prometheus
kubectl -n istio-system get svc grafana

Grafana UI から Istio のダッシュボードを表示するには、まずは以下のコマンドでポート(3000)の転送を行います。

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath=’{.items[0].metadata.name}’) 3000:3000 &

ブラウザで以下の URL にアクセスします。

http://localhost:3000
Grafana UI から Mixer が収集したメトリックを見れます

注意点:将来的には GCP の Stackdriver と連携して、Istio で収集したメトリックを直接 Stackdriver から参照することができるようになります。

トラフィック管理

メトリックはデフォルトで収集されるため何も設定する必要はないですが、トラフィックの管理をコントロールするには Istio の設定ファイル(YAML)を書く必要があります。

Istio では新しい kind を2つ導入します。

Reviews サービス向けの DestinationRule

DestinationRule にはルートするトラフィックのの負荷分散方法などを指定することができます。

まずは一番シンプルの DestinationRule を適用します。

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
LB の設定がないため、デフォルトでは Round Robin になります

確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、v1 → v2 → v3 の順番で Reviews のバージョンが表示されます。Round Robin で負荷分散されていることが確認できす。

負荷分散の設定を Round Robin から Random に変更するには、以下の DestinationRule を適用します。

$ kubectl apply -f samples/bookinfo/networking/destination-rule-reviews.yaml
loadBalancer のパラメータを指定したので、Round Robin から Random の負荷分散に変更

確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、v1/v2/v3 のバージョンはランダムで表示されることが確認できます。

VirtualService

VirtualService でトラフィックをコントロールすることができます。

例えば、全てのトラフィックを Reviews の v1 に向けるには、以下の VirtualService を適用します。

$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
全てのトラフィックが v1 に転送されます

確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、いつも v1 バージョンが表示されます。(v1 バージョンは星が表示されない)

次には Product page からのトラフィックを v2 と v3 に 50–50 転送する場合を試しみます。

$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2-v3.yaml
トラフィックは v2/v3 に転送されます

確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、v2 と v3 バージョンが表示されるようになっています。

まとめ

大変長い記事になっちゃいましたが、いかがでしょうか?

Istio はまずポリシーなしで利用するのがファーストステップとしていいかと思います。GKE クラスタに Istio をインストールするだけでサービス間の重要なメトリック(エラーコード、レイテンシなど)が取れるようになるので、是非 Istio のインストール、そして Proxy 注入のみからスタートしてみてください!

Like what you read? Give Samir Hammoudi a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.