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

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

  • Bookinfo

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

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

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

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

  1. 事前準備
  2. Istioのインストール
  3. サンプルアプリケーションのインストール
  4. サンプルアプリケーションの外部公開
  5. ダッシュボードの確認

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)を順に説明します。