はじめに
Istioとはどんなものなのか実際に使ってみて、ざっくり理解したいと思います。
Istioとは
Istionとは、サービスメッシュを実装するためのオープンソースです。
Istioには以下のような機能があります。
- ネットワークトラフィック管理
- セキュリティ
- 監視
サービスメッシュ
サービスメッシュとは、マイクロサービス同士が連携する通信を仲介し、制御するレイヤになります。
マイクロサービスでは、サービス間の通信が頻繁に行われます。その通信により発生する課題を解決するのがサービスメッシュとなります。
アーキテクチャ
Istioのアーキテクチャは下記のようになります。
EnvoyがProxyとしてサービス間の通信を仲介します。
Istioのドキュメントより
Istioでは、EnvoyコンテナをPodにサイドカーとして自動的に追加してくれます。
インストール
IstioをKubernetesにインストールしていきます。
まずはistioctl
をインストールします。
brew install istioctl
istioctl
でIstioをインストールします。
istioctl install --set profile=demo -y
プロファイルを設定することでインストールされるコンポーネントを選択できます。
インストールされたリソースを確認してみます。
❯ kubectl -n istio-system get all
NAME READY STATUS RESTARTS AGE
pod/istio-egressgateway-687f4db598-8x4ld 1/1 Running 0 51s
pod/istio-ingressgateway-78f69bd5db-bxx85 1/1 Running 0 51s
pod/istiod-76d66d9876-fxpxx 1/1 Running 0 56s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/istio-egressgateway ClusterIP 10.103.138.48 <none> 80/TCP,443/TCP 51s
service/istio-ingressgateway LoadBalancer 10.96.138.98 <pending> 15021:31085/TCP,80:31412/TCP,443:32435/TCP,31400:30649/TCP,15443:31312/TCP 51s
service/istiod ClusterIP 10.103.121.71 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 56s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/istio-egressgateway 1/1 1 1 52s
deployment.apps/istio-ingressgateway 1/1 1 1 52s
deployment.apps/istiod 1/1 1 1 56s
NAME DESIRED CURRENT READY AGE
replicaset.apps/istio-egressgateway-687f4db598 1 1 1 51s
replicaset.apps/istio-ingressgateway-78f69bd5db 1 1 1 51s
replicaset.apps/istiod-76d66d9876 1 1 1 56s
サイドカーの有効化
Podにistio-proxyというEnvoyコンテナが追加される設定を有効化します。
kubectl label namespace default istio-injection=enabled
サンプルアプリのデプロイ
下記のIstioのリポジトリにあるサンプルアプリを使います。
まずはアプリをデプロイします。
kubectl apply -f bookinfo/platform/kube/bookinfo.yaml
リソースを確認してみます。
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-gsp4w 2/2 Running 0 11s
productpage-v1-6b746f74dc-rtbll 2/2 Running 0 11s
ratings-v1-b6994bb9-stppc 2/2 Running 0 11s
reviews-v1-545db77b95-jpb2s 2/2 Running 0 11s
reviews-v2-7bf8c9648f-nz87t 2/2 Running 0 11s
reviews-v3-84779c7bbc-dgvsv 2/2 Running 0 11s
❯ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.97.22.212 <none> 9080/TCP 35s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m12s
productpage ClusterIP 10.105.76.38 <none> 9080/TCP 34s
ratings ClusterIP 10.98.161.119 <none> 9080/TCP 35s
reviews ClusterIP 10.96.79.48 <none> 9080/TCP 35s
アプリが正常に動いているか確認します。
❯ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
Ingressの設定
Gatewayを作成します。
kubectl apply -f bookinfo/networking/bookinfo-gateway.yaml
LoadBalancerを確認してみます。
❯ kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
istio-ingressgateway LoadBalancer 10.96.222.197 <pending> 15021:32492/TCP,80:32494/TCP,443:31883/TCP,31400:31822/TCP,15443:31222/TCP 73s
ポート番号や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=127.0.0.1
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
ポートフォワードします。
kubectl -n istio-system port-forward svc/istio-ingressgateway 32494:80
下記で確認できるURLにアクセスしてみます。
❯ echo "http://$GATEWAY_URL/productpage"
![]()
http://127.0.0.1:32494/productpage
ダッシュボードの追加
下記のディレクトリのマニフェストを利用してダッシュボードを追加します。
kubectl apply -f addons
kubectl rollout status deployment/kiali -n istio-system
ダッシュボードの確認
ダッシュボードにアクセスします。
istioctl dashboard kiali
下記でリクエストを送ります。
for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
リクエストが送られてくるとトラフィックがどのように流れているかが可視化されているのがわかります。
まとめ
- Istioはサービスメッシュを実装する
- ダッシュボードでトラフィックが可視化できる