BookinfoデモでIstioを体感する
Istioの導入
Istioの導入に際しては、まずデスクトップ環境にIstioのコンポーネント一式をダウンロードします。LinuxやMacの場合、導入用スクリプトをcurlでダウンロード、実行します。するとホーム・ディレクトリー直下に「istio-<バージョン名>」というサブディレクトリーが作成されます。これ以降ディレクトリー「istio-<バージョン名>」を「ISTIO_HOME」と記載します。
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ディレクトリーをパスに追加します。
export PATH=<ISTIO_HOME>/bin:$PATH
デスクトップ環境の準備が完了したら、KubernetesクラスターにIstioの各コンポーネントを導入します。2018年10月時点では、IstioのWebサイト(https://istio.io/docs/setup/kubernetes/quick-start/)にて、次に挙げる4つの導入方法が紹介されています。
- Istioが提供するKubernetes構成ファイルを元に導入する方法(相互TLS認証あり)
- Istioが提供するKubernetes構成ファイルを元に導入する方法(相互TLS認証なし)
- HelmチャートのテンプレートをKubernetesのマニフェストに変換してkubectlで導入する方法
- Helm(helm installコマンド)の利用
今回は、3番のHelmチャートのテンプレートをマニフェストに変換して導入する方法をご紹介します。はじめに、helm templateコマンドで、HelmチャートのテンプレートをKubernetesマニフェストに変換します。ホーム・ディレクトリーにistio.yamlという名称でマニフェストが作成されます。
helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml
Istio導入用にKubernetesのネームスペースとして「istio-system」を作成します。
kubectl create namespace istio-system
マニフェストを元にKubernetesリソースを作成します。
kubectl apply -f $HOME/istio.yaml
KubernetesリソースとしてIstioが導入され、稼働していることを確認します(図12)。コントロール・プレーンを構成するコンポーネントがデプロイされたpod群が稼動していることを確認できるはずです。
kubectl get po -n istio-system
Bookinfoの導入
最初に、カレントディレクトリーをISTIO_HOMEディレクトリーに変更します。
cd ~/<ISTIO_HOME>
アプリケーションの導入方法は、Envoyの導入方法の違い(マニュアル・サイドカー・インジェクションとオートマチック・サイドカー・インジェクション)により、二通りあります。今回はオートマチック・サイドカー・インジェクションを利用します。Bookinfoアプリケーションを導入する「default」ネームスペースに「istio-injection=enabled」とラベル付けします。
kubectl label namespace default istio-injection=enabled
Kubernetes用の構成ファイルを指定して、Bookinfoを導入します。
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
Bookinfoが正常に導入できているか、まずサービスを確認しましょう。
kubectl get services
Bookinfoを構成する各サービス(productpage、details、reviews、ratings)に応じて、4つのサービスが作成されていれば正常です(図13)。
次にpodを確認してみます。
kubectl get po
各サービスとバージョンのバリエーションに応じて、podが作成されて稼動していれば(Running)正常です(図14)。
Bookinfoを正常に導入することができたら、次はKubernetesクラスターの外部からBookinfoアプリケーションにアクセスできるように、サービス・メッシュのエッジ(境界)にIstio gatewayを作成します。次のコマンドを実行して、Bookinfoモジュールに含まれている構成を適用します。
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
Gatewayの作成結果を確認します。
kubectl get gateway
bookinfo-gatewayが作成されていれば成功です(図15)。
これでIngress gatewayを介してBookinfoアプリケーションにアクセスできるようになっているはずです。今後のCLIでの作業にあたってIPアドレスやポート番号を毎回入力する手間を省くために、環境変数に設定します。まずIngress gatewayのホスト・アドレスを環境変数に設定します。
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
次に、ポートを環境変数に設定します。
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
続けて、Gatewayのホストとポートとの組み合わせを環境変数に設定します。
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
Bookinfoアプリケーションが正常に稼動しているか、今設定した環境変数を利用して確認してみます。コマンド実行結果として、標準出力にHTTPステータスの「200」が返ってくるようであれば正常に稼動しています。
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
Istioのトラフィック管理機能を体験するに先立って、省略時のルーティング・ルールを構成します。
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
ブラウザーでURL「http://\${GATEWAY_URL}/productpage」を指定して、Bookinfoにアクセスしてみましょう。\${GATEWAY_URL}の部分は、次のコマンドを実行して確認することができます。
echo $GATEWAY_URL
何度かアクセスを繰り返すと、レイティングが「なし」「黒い星」「赤い星」のいずれかで表示され、3つのバージョンのサービスが呼び出されていることを確認できます。
単一バージョンのみへのルーティング
デフォルトのルーティング・ルールでは、レイティングは3つのバージョンのいずれかが呼び出される状態となっています。ここで、特定のバージョンのみ表示されるようにルーティング・ルールを変更してみましょう。以下のコマンドを実行します。
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)。
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にルーティングされるようにルールを変更してみましょう。次のコマンドを実行します。
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)。
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サービスが呼び出されていることが分かります。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- コンテナ上のマイクロサービスの認証強化 ~IstioとKeycloak~
- Kubernetesをサービスメッシュ化するIstioとは?
- サービスメッシュを使ってみよう
- コンテナ上のマイクロサービスの認証強化 ~QuarkusとKeycloak~
- コンテナ上のマイクロサービスの認証強化 ~StrimziとKeycloak~
- Kubernetesの新しいネットワーク機能、Gateway APIを理解する(前編)
- CloudNative Days Fukuoka 2023、GoogleによるGKE上のGateway APIの解説セッションを紹介
- Kubeflowを構築する
- コマンドラインツールを用いずにCI/CDを行うGitOpsとは?
- NGINX Ingress Controllerの柔軟なアプリケーション制御、具体的なユースケースと設定方法を理解する