前回は、マイクロサービス間の通信を統一的に制御するソフトウエア「Istio」の概要について説明しました。今回は、より理解を深めていくため、Istioを実際に触ってみましょう。
まず、Istioおよびサンプリアプリケーションをインストールし、複数のマイクロサービスから構成されるサービスメッシュを構築します。
上図を見ると、各マイクロサービスの脇に「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)を順に説明します。