BookinfoデモでIstioを体感する

2018年10月30日(火)
樽澤 広亨(たるさわひろゆき)
サンプル・アプリケーション「Bookinfo」でIstioの基本的な機能を体験してみます。

Istioの導入

Istioの導入に際しては、まずデスクトップ環境にIstioのコンポーネント一式をダウンロードします。LinuxやMacの場合、導入用スクリプトをcurlでダウンロード、実行します。するとホーム・ディレクトリー直下に「istio-<バージョン名>」というサブディレクトリーが作成されます。これ以降ディレクトリー「istio-<バージョン名>」を「ISTIO_HOME」と記載します。

リスト5:Istioの導入

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

Windowsの場合、GitHub上のIstio Releaseページ(https://github.com/istio/istio/releases)からダウンロードし、適当な場所に解凍します。ISTIO_HOMEは、次のようなサブディレクトリー構造で成り立っています。

  • install:Kubernetes等各プラットフォームごとの導入用コンポーネント(YAMLファイル等)が格納されているディレクトリー
  • samples:Bookinfoを含むサンプル・アプリケーションが格納されているディレクトリー
  • bin:IstioのCLI、istioctlが格納されています

ISTIO_HOME/binディレクトリーをパスに追加します。

リスト6:ISTIO_HOME/binをパスに追加

export PATH=<ISTIO_HOME>/bin:$PATH

デスクトップ環境の準備が完了したら、KubernetesクラスターにIstioの各コンポーネントを導入します。2018年10月時点では、IstioのWebサイト(https://istio.io/docs/setup/kubernetes/quick-start/)にて、次に挙げる4つの導入方法が紹介されています。

  1. Istioが提供するKubernetes構成ファイルを元に導入する方法(相互TLS認証あり)
  2. Istioが提供するKubernetes構成ファイルを元に導入する方法(相互TLS認証なし)
  3. HelmチャートのテンプレートをKubernetesのマニフェストに変換してkubectlで導入する方法
  4. Helm(helm installコマンド)の利用

今回は、3番のHelmチャートのテンプレートをマニフェストに変換して導入する方法をご紹介します。はじめに、helm templateコマンドで、HelmチャートのテンプレートをKubernetesマニフェストに変換します。ホーム・ディレクトリーにistio.yamlという名称でマニフェストが作成されます。

リスト7:マニフェストの作成

helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml

Istio導入用にKubernetesのネームスペースとして「istio-system」を作成します。

リスト8:Kubernetesのネームスペースを作成

kubectl create namespace istio-system

マニフェストを元にKubernetesリソースを作成します。

リスト9:Kubernetesリソースの作成

kubectl apply -f $HOME/istio.yaml

KubernetesリソースとしてIstioが導入され、稼働していることを確認します(図12)。コントロール・プレーンを構成するコンポーネントがデプロイされたpod群が稼動していることを確認できるはずです。

リスト10:Istioの稼働を確認

kubectl get po -n istio-system
図12:Istioの稼働を確認

図12:Istioの稼働を確認

Bookinfoの導入

最初に、カレントディレクトリーをISTIO_HOMEディレクトリーに変更します。

リスト11:カレントディレクトリーをISTIO_HOMEに

cd ~/<ISTIO_HOME>

アプリケーションの導入方法は、Envoyの導入方法の違い(マニュアル・サイドカー・インジェクションとオートマチック・サイドカー・インジェクション)により、二通りあります。今回はオートマチック・サイドカー・インジェクションを利用します。Bookinfoアプリケーションを導入する「default」ネームスペースに「istio-injection=enabled」とラベル付けします。

リスト12:オートマチック・サイドカー・インジェクションによりアプリケーションを導入

kubectl label namespace default istio-injection=enabled

Kubernetes用の構成ファイルを指定して、Bookinfoを導入します。

リスト13:Bookinfoの導入

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

Bookinfoが正常に導入できているか、まずサービスを確認しましょう。

リスト14:Bookinfoの導入を確認

kubectl get services

Bookinfoを構成する各サービス(productpage、details、reviews、ratings)に応じて、4つのサービスが作成されていれば正常です(図13)。

図13:Bookinfoの導入を確認

図13:Bookinfoの導入を確認

次にpodを確認してみます。

リスト15:podの状態を確認

kubectl get po

各サービスとバージョンのバリエーションに応じて、podが作成されて稼動していれば(Running)正常です(図14)。

図14:podの状態を確認

図14:podの状態を確認

Bookinfoを正常に導入することができたら、次はKubernetesクラスターの外部からBookinfoアプリケーションにアクセスできるように、サービス・メッシュのエッジ(境界)にIstio gatewayを作成します。次のコマンドを実行して、Bookinfoモジュールに含まれている構成を適用します。

リスト16:Istio gatewayの作成

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

Gatewayの作成結果を確認します。

リスト17:Gatewayの作成を確認

kubectl get gateway

bookinfo-gatewayが作成されていれば成功です(図15)。

図15:Gatewayの作成を確認

図15:Gatewayの作成を確認

これでIngress gatewayを介してBookinfoアプリケーションにアクセスできるようになっているはずです。今後のCLIでの作業にあたってIPアドレスやポート番号を毎回入力する手間を省くために、環境変数に設定します。まずIngress gatewayのホスト・アドレスを環境変数に設定します。

リスト18:Ingress gatewayのアドレスを環境変数に設定

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

次に、ポートを環境変数に設定します。

リスト19:Ingress gatewayのポートを環境変数に設定

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')

続けて、Gatewayのホストとポートとの組み合わせを環境変数に設定します。

リスト20:ホストとポートの組み合わせを環境変数に設定

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

Bookinfoアプリケーションが正常に稼動しているか、今設定した環境変数を利用して確認してみます。コマンド実行結果として、標準出力にHTTPステータスの「200」が返ってくるようであれば正常に稼動しています。

リスト21:確認のため、設定した環境変数を利用してみる

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage

Istioのトラフィック管理機能を体験するに先立って、省略時のルーティング・ルールを構成します。

リスト22:ルーティング・ルールの構成

kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

ブラウザーでURL「http://\${GATEWAY_URL}/productpage」を指定して、Bookinfoにアクセスしてみましょう。\${GATEWAY_URL}の部分は、次のコマンドを実行して確認することができます。

リスト23:環境変数GATEWAY_URLの確認

echo $GATEWAY_URL

何度かアクセスを繰り返すと、レイティングが「なし」「黒い星」「赤い星」のいずれかで表示され、3つのバージョンのサービスが呼び出されていることを確認できます。

単一バージョンのみへのルーティング

デフォルトのルーティング・ルールでは、レイティングは3つのバージョンのいずれかが呼び出される状態となっています。ここで、特定のバージョンのみ表示されるようにルーティング・ルールを変更してみましょう。以下のコマンドを実行します。

リスト24:特定のバージョンのみ表示されるように変更

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

何回かブラウザーでBookinfoアプリケーション(http://${GATEWAY_URL}/productpage)にアクセスしてみてください。今度は、常にレイティングが表示されないWebページが返ってきます。すなわち先ほど実行したコマンドの引数に指定した構成情報は、V1のサービスにルーティングされるようにルールを変更するものだったのです。ルールの定義を確認してみましょう(コード1、オリジナルはhttps://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/networking/virtual-service-all-v1.yaml)。

リスト25:コード1

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1

各サービス(productpage、details、reviews、ratings)に関して「VirtualService」というオブジェクトが定義されています。VirtualServiceとはサービスに対するルーティング・ルールを制御する定義体です。Spec > hosts要素で宛先となるサービスの宛先情報を、http > route > destination以下でルーティングの仕様を定義しています。この構成(virtual-service-all-v1.yaml)では、全てのサービスについて「v1」にルーティングされるよう定義されている(subset要素)ので、常にレイティングのないWebページが返るというわけです。

ユーザーIDに応じたルーティング

次は、特定のユーザーのリクエストのみV2にルーティングされるようにルールを変更してみましょう。次のコマンドを実行します。

リスト26:ユーザーIDに応じたルーティング

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

ルールの構成定義を確認してみましょう(コード2、オリジナルはhttps://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml)。

リスト27:コード2

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

reviewsサービスへのルーティング・ルールのみが記載されています。virtual-service-all-v1.yamlと同じように、http > route > destination以下でV1のreviewsサービスへのルーティング・ルールが定義されていますが、これに加えて、http > match以下で新たなルールが追加されています。matchは条件を表す要素で、このケースではHTTPの「end-user」ヘッダーの値が「jason」の場合は、V2のreviewsサービスにルーティングすることを規定しています。実際にブラウザーでBookinfoアプリケーションにアクセスして確かめてみましょう。何度アクセスしてもレイティングが表示されないので、各サービスのV1が呼び出されていることが分かります。そこで、ブラウザーに表示されている画面の右上「Sign in」ボタンをクリックします。ダイアログ・ボックスが表示されたら、ユーザー名に「jason」、パスワードは任意の文字列(なくてもかまいません)を設定してサイン・インし(図16)、何度かproductpageにアクセスしてみてください。何度アクセスしても今度は黒い星で表現されるレイティングが表示されます(図17)。これによって、常にV2のreviewsサービスが呼び出されていることが分かります。

図16:「jason」でサイン・イン

図16:「jason」でサイン・イン

図17:V2のreviewsサービスが呼び出されている

図17:V2のreviewsサービスが呼び出されている

著者
樽澤 広亨(たるさわひろゆき)
日本アイ・ビー・エム株式会社クラウド・テクニカル・セールス所属 エグゼクティブ・テクニカル・スペシャリスト
IBMソフトウェア製品(WebSphere)のエバンジェリスト、テクニカル・サポート、米IBMソフトウェア開発研究所所属の開発エンジニアを経て現職。IBM Academy of Technologyメンバー。また、情報処理学会 情報企画調査会 SC38専門委員として、ISO IEC JTC1/SC38によるクラウドコンピューティングの国際標準策定に従事している。

連載バックナンバー

運用・管理技術解説
第3回

BookinfoデモでIstioを体感する

2018/10/30
サンプル・アプリケーション「Bookinfo」でIstioの基本的な機能を体験してみます。
運用・管理技術解説
第2回

Istioの全貌

2018/9/18
Istioが備える特徴や提供する機能、またそれを実現するためのアーキテクチャーを紹介いたします。
運用・管理技術解説
第1回

マイクロサービスとサービス・メッシュ(Istioが求められる背景)

2018/8/3
マイクロサービスによる巨大な超分散システムの運用管理ソリューションとして注目されているIstioが必要とされる背景を解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています