【Istio】実際に動かしてざっくり理解するIstio

はじめに

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

プロファイルを設定することでインストールされるコンポーネントを選択できます。

Installation Configuration Profiles
Describes the built-in Istio installation configuration profiles.

インストールされたリソースを確認してみます。

❯ 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のリポジトリにあるサンプルアプリを使います。

istio/samples/bookinfo at master · istio/istio
Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.

まずはアプリをデプロイします。

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の設定

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"

ダッシュボードの追加

下記のディレクトリのマニフェストを利用してダッシュボードを追加します。

istio/samples/addons at master · istio/istio
Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.
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はサービスメッシュを実装する
  • ダッシュボードでトラフィックが可視化できる

参考

タイトルとURLをコピーしました