前回は、マイクロサービス間の通信を統一的に制御するソフトウエア「Istio」の概要について説明しました。今回は、より理解を深めていくため、Istioを実際に触ってみましょう。

まず、Istioおよびサンプリアプリケーションをインストールし、複数のマイクロサービスから構成されるサービスメッシュを構築します。

サンプルアプリケーション(Bookinfo)/出典:公式サイト


上図を見ると、各マイクロサービスの脇に「Envoy」がサイドカーとして適用されており、各通信はサイドカーを通して管理されます。

その後、ダッシュボード経由でアクセス状況を確認することで、サービスメッシュ全体の状況をどのようなかたちで把握できるのか、実感できるはずです。

それでは早速、以下5つのステップで作業していきましょう。

事前準備

Istioのインストール

サンプルアプリケーションのインストール

サンプルアプリケーションの外部公開

ダッシュボードの確認

1. 事前準備 - minikubeのVM driverの設定

後続の手順で登場する「minikube tunnel」を正しく動作させるため、VM Driverにhyperkitを設定します※。VM driverの変更により、minikube環境の再構築が必要になる点にご注意ください。

$minikube config set driver hyperkit

$minikube delete

$minikube start --memory=6000 --cpus=4

なお、hyperkit以外に対応しているVM driverはIstio公式サイトをご参照ください。

※ 筆者の環境ではPCのメモリが8GBのため、公式サイトの指定(16GB)より小さい数値を指定しています。

2. Istioのインストール

Istioを利用するには、Istioの設定を管理する「istioctl」のセットアップも必要になります。

○2.1 istioctlのインストール

Istioをダウンロードし、istioctlをインストールします。

$curl -L https://istio.io/downloadIstio | sh -

~中略~

Istio 1.11.4 Download Complete!

~中略~

Begin the Istio pre-installation check by running:

istioctl x precheck

Need more information? Visit https://istio.io/latest/docs/setup/install/

istioctlコマンドへのパスを通します。

$cd istio-1.11.4

$export PATH=$PWD/bin:$PATH

○2.2 Istioコンポーネントのインストール

Istio core/Istiodや、Ingress/Egress Gatewayなどのコンポーネントをインストールします。

$istioctl install --set profile=demo -y

■ Istio core installed

■ Istiod installed

■ Ingress gateways installed

■ Egress gateways installed

■ Installation complete

Thank you for installing Istio 1.11. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/kWULBRjUv7hHci7T6

※ 「■」は「✔(チェックマーク)」。

後述のサンプルアプリをデプロイした際、Envoy Sidecarプロキシが動作するよう、「namespace label」を設定します。

$kubectl label namespace default istio-injection=enabled

namespace/default labeled

3. サンプルアプリのインストール

冒頭の図に示したBookinfoアプリをインストールします。

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

service/details created

serviceaccount/bookinfo-details created

deployment.apps/details-v1 created

service/ratings created

serviceaccount/bookinfo-ratings created

deployment.apps/ratings-v1 created

service/reviews created

serviceaccount/bookinfo-reviews created

deployment.apps/reviews-v1 created

deployment.apps/reviews-v2 created

deployment.apps/reviews-v3 created

service/productpage created

serviceaccount/bookinfo-productpage created

deployment.apps/productpage-v1 created

以下のサービスが構築されています。

$kubectl get services

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

details ClusterIP 10.99.240.217 9080/TCP 19s

kubernetes ClusterIP 10.96.0.1 443/TCP 191d

productpage ClusterIP 10.111.130.33 9080/TCP 18s

ratings ClusterIP 10.110.11.178 9080/TCP 19s

reviews ClusterIP 10.109.121.242 9080/TCP 19s

以下のPodが構築されています。冒頭の図に対応するかたちでPodが作成されていることがわかります。ここで注目してほしいのは、Reviews-v1, v2, v3の3種類のバージョンのPodが存在することです。

$kubectl get pods

NAME READY STATUS RESTARTS AGE

details-v1-56d5bd7bfb-6h4gf 2/2 Running 0 55s

productpage-v1-6b746f74dc-hgq8q 2/2 Running 0 54s

ratings-v1-64755c68dd-l2nzd 2/2 Running 0 55s

reviews-v1-545db77b95-cj55c 2/2 Running 0 55s

reviews-v2-7bf8c9648f-2d6ns 2/2 Running 0 55s

reviews-v3-84779c7bbc-mpkv9 2/2 Running 0 55s

今回、詳細は割愛しますが、アプリケーションの仕様変更などの際、リクエストの一部のみ先行してv2やv3に振り分けることができます。これにより、品質が確保されていることを一部のリクエストで確認した上で、アプリケーションのバージョンアップを行うことができます。そのため、たとえ障害が発生したとしても、影響を一部のユーザーに限定できるのです。

なお、環境にもよりますが、全てのPodの「READY」が「2/2」、かつ「STATUS」が「PodInitializing」から「Running」になるまで5分程度かかります。

では、動作させてみましょう。

$kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o ".*"

Simple Bookstore App

4. サンプルアプリの外部公開

Istio Gatewayを構築し、サンプルアプリを外部からアクセス可能な状態にしましょう。

○4.1 Gatewayの設定

以下のコマンドにより、Gatewayを設定します。

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

gateway.networking.istio.io/bookinfo-gateway created

virtualservice.networking.istio.io/bookinfo created

○4.2 環境変数の設定

手順4.4でアクセスするURLなど、環境変数を設定します。

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

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

$export INGRESS_HOST=$(minikube ip)

$export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

○4.3 tunnelの起動

別ターミナルで以下コマンドを実行しし、tunnelを起動します。これにより、EXTERNAL-IPが付与されます。

$minikube tunnel

Password:

Status:

machine: minikube

pid: 11660

route: 10.96.0.0/12 -> 192.168.64.5

minikube: Running

services: [istio-ingressgateway]

errors:

minikube: no errors

router: no errors

loadbalancer emulator: no errors

○4.4 bookinfoアプリケーションへのアクセス

以下のコマンドで得られたURLを使ってブラウザにアクセスします。

$echo "http://$GATEWAY_URL/productpage"

http://192.168.49.2:32560/productpage



5. ダッシュボードの確認

ドレースをダッシュボードで確認するには、「kiali」やその他のaddonが必要になります。

○5.1 kialiのインストール

まず、kialiと、その他必要なaddonをインストールします。

$kubectl apply -f samples/addons

serviceaccount/grafana created

configmap/grafana created

service/grafana created

deployment.apps/grafana created

configmap/istio-grafana-dashboards created

configmap/istio-services-grafana-dashboards created

deployment.apps/jaeger created

service/tracing created

service/zipkin created

service/jaeger-collector created

serviceaccount/kiali created

configmap/kiali created

clusterrole.rbac.authorization.k8s.io/kiali-viewer created

clusterrole.rbac.authorization.k8s.io/kiali created

clusterrolebinding.rbac.authorization.k8s.io/kiali created

role.rbac.authorization.k8s.io/kiali-controlplane created

rolebinding.rbac.authorization.k8s.io/kiali-controlplane created

service/kiali created

deployment.apps/kiali created

serviceaccount/prometheus created

configmap/prometheus created

clusterrole.rbac.authorization.k8s.io/prometheus created

clusterrolebinding.rbac.authorization.k8s.io/prometheus created

service/prometheus created

deployment.apps/prometheus created

kialiをロールアウトします。

$kubectl rollout status deployment/kiali -n istio-system

deployment "kiali" successfully rolled out

○5.2 kialiの起動

kialiを起動します。

$istioctl dashboard kiali

http://localhost:20001/kiali

上記コマンドを実行すると、自動的にブラウザが立ち上がり、以下の画面が表示されます。



ナビゲーションメニューで[Graph]を選択し、[Namespace]ドロップダウンボックスで、[default]を選択します。

○5.3 トレースグラフの確認

この状態では、リクエストが発行されておらず、トレースのグラフを見ることはできません。

そこで、Bookinfoアプリケーションにリクエストを送ってみましょう。以下のコマンドを実行し、100リクエストを「productpage」に対して発行します。100リクエストも必要になる理由は、サンプリングレートがデフォルトで1%であり、トレースを見るためには少なくとも100リクエストが必要になるためです。

$for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done

上記のコマンドを実行してしばらく待つと、以下のような画面が表示されます。



* * *

今回はIstioをインストールし、Bookinfoアプリケーションを実行してみることで、Istioの具体的なイメージを掴んでいただきました。次回以降、Istioの3つの特徴(Traffic Management, Observability, Security)を順に説明します。

正野勇嗣 しょうのゆうじ 正野 勇嗣 (SHONO Yuji ) - NTTデータ 部長 2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。 最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。 この著者の記事一覧はこちら