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 には4つの主なコンポーネントがあります:
- Envoy (proxy): C++ で書かれたハイパフォーマンスプロキシ。Envoy の詳細はこちら。
- Pilot: サービス通信ポリシー(トラフィック管理など)を管理・デプロイ
- Mixer: ポリシーの強制とメトリックの収集
- 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)
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 の Pod がちゃんと起動しているかを確認します。
$ kubectl get pods -n istio-system
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
$ kubectl get pods -n default
外部 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
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 にアクセスします。
注意点:将来的には GCP の Stackdriver と連携して、Istio で収集したメトリックを直接 Stackdriver から参照することができるようになります。
トラフィック管理
メトリックはデフォルトで収集されるため何も設定する必要はないですが、トラフィックの管理をコントロールするには Istio の設定ファイル(YAML)を書く必要があります。
Istio では新しい kind を2つ導入します。
- VirtualService:リクエストのルーティングポリシー
- DestinationRule:バックエンドの設定
Reviews サービス向けの DestinationRule
DestinationRule にはルートするトラフィックのの負荷分散方法などを指定することができます。
まずは一番シンプルの DestinationRule を適用します。
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、v1 → v2 → v3 の順番で Reviews のバージョンが表示されます。Round Robin で負荷分散されていることが確認できす。
負荷分散の設定を Round Robin から Random に変更するには、以下の DestinationRule を適用します。
$ kubectl apply -f samples/bookinfo/networking/destination-rule-reviews.yaml
確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、v1/v2/v3 のバージョンはランダムで表示されることが確認できます。
VirtualService
VirtualService でトラフィックをコントロールすることができます。
例えば、全てのトラフィックを Reviews の v1 に向けるには、以下の VirtualService を適用します。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、いつも v1 バージョンが表示されます。(v1 バージョンは星が表示されない)
次には Product page からのトラフィックを v2 と v3 に 50–50 転送する場合を試しみます。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2-v3.yaml
確認事項:Bookinfo メインページにアクセスして、ページをリフレッシュすると、v2 と v3 バージョンが表示されるようになっています。
まとめ
大変長い記事になっちゃいましたが、いかがでしょうか?
Istio はまずポリシーなしで利用するのがファーストステップとしていいかと思います。GKE クラスタに Istio をインストールするだけでサービス間の重要なメトリック(エラーコード、レイテンシなど)が取れるようになるので、是非 Istio のインストール、そして Proxy 注入のみからスタートしてみてください!