この記事は、Kubernetes3 Advent Calendar 2020 22日目の記事です。
サービスメッシュが雰囲気しかわからないので自身の勉強も兼ねて、kindのKubernetesクラスターにIstioとOnline Boutiqueを導入し、サービスメッシュとマイクロサービスアプリケーションを体験してみます。
マイクロサービスアーキテクチャ
概要
マイクロサービスアーキテクチャは、ソフトウェアアーキテクチャの1つで、従来のモノリシックアーキテクチャと比較されて語られることが多いです。こちらのドキュメントがわかりやすいかもしれません。
マイクロサービスは、アプリケーション構築のアーキテクチャ・スタイルです。マイクロサービス・アーキテクチャが従来のモノリシックなアプローチと異なるのは、アプリケーションをコア機能ごとに細分化するという点です。各機能はサービスと呼ばれ、独立して構築およびデプロイすることができます。つまり、個々のサービスが正常に機能してもしなくても、他のサービスに悪影響を及ぼすことはありません。
引用元: https://www.redhat.com/ja/topics/microservices/what-are-microservices
利点
マイクロサービスでは、コンポーネントに分割し疎結合にしておき、それらをステートレスに相互通信することで、1つのアプリケーションとして機能させる構成を取ります。メリットとしては以下のものがあります。
- 市場投入期間の短縮: マイクロサービス・アーキテクチャでは開発サイクルが短縮されるため、より俊敏なデプロイメントと更新が可能になります。
- 優れたスケーラビリティ: ニーズの高い特定のサービスは、複数のサーバーやインフラストラクチャにわたってデプロイできるため、ニーズに対応することができます。
- 耐障害性: これらの独立したサービスは、適切に構築されていれば、相互に影響しません。つまり、モノリシックなアプリケーション・モデルとは異なり、ある部分に障害が生じてもアプリケーション全体がダウンすることはありません。
- 容易なデプロイ: マイクロサービスベースのアプリケーションは、従来のモノリシックなアプリケーションと異なり小型でモジュール化されるため、デプロイメントに伴う心配がありません。これにはいくらかの調整が必要ですが、大きなメリットにつながります。
- アクセス可能: 大規模なアプリケーションを小さなパーツに分割できるため、開発者は各部をより簡単に理解、更新、強化することができ、特にアジャイル開発手法と組み合わせることによって、開発サイクルが短縮されます。
- オープン性の向上: 多言語 API を使用するため、開発者は、必要な機能に最適な言語とテクノロジーを自由に選択することができます。
引用元: https://www.redhat.com/ja/topics/microservices/what-are-microservices
マイクロサービス化することで、開発のアジリティや柔軟性、アプリケーションの耐障害性、スケーラビリティが向上しそうです。
課題
いいことばかりなのかというと、そういうわけではありませんです。例えば、以下の点が課題として挙げられます。
- 構築:時間をかけてサービス間の依存関係を特定する必要があります。1 つの構築を完了すると、依存関係により、他の構築も必要になる可能性があります。また、マイクロサービスがデータに及ぼす影響についても考慮する必要があります。
- テスト:統合テストとエンドツーエンド・テストは、これまで以上に複雑かつ重要になります。アーキテクチャの一部で障害が起きると、サービス間のサポートをどのように構築したかに応じて、少し離れた部分で障害が発生することもあります。
- バージョン管理:新しいバージョンに更新すると、下位互換性が失われる可能性があります。下位互換性に対応する条件付きロジックを使用して構築することもできますが、扱いが困難になります。あるいは、各クライアント向けに複数のライブバージョンを立ち上げることもできますが、メンテナンスや管理が複雑化するおそれがあります。
- デプロイメント:これもまた、少なくとも初期セットアップの段階では課題となります。マイクロサービスの複雑さから、手動でのデプロイメントは困難であるため、デプロイメントを容易にするために、まずは多くの自動化に投資しなければなりません。サービスを導入する方法と順序を考える必要があります。
- ロギング:分散システムでは、すべてのログを一元化する必要があります。これがなければ、スケーリングを管理することができません。
- 監視:問題の原因を突き止めるために、システムを一元的に把握することが重要です。
- デバッグ:リモートデバッグを行うことはできず、数十、数百のサービスに対しては機能しません。残念ながら、現時点ではデバッグ方法はありません。
- 接続性:一元型または統合型を問わず、サービスディスカバリーを検討する必要があります
引用元: https://www.redhat.com/ja/topics/microservices/what-are-microservices
関連する情報
Online Boutique
Online Boutiqueは、マイクロサービスアーキテクチャに基づいて開発されたデモアプリケーションです。後ほどデモで使おうと思います。
Sock Shop
Sock Shopは、マイクロサービスアーキテクチャに基づくデモアプリケーションです。Weaveworksが中心となってメンテナンスされています。最新の更新が2年前らしく、もう更新しないのかな?
Bookinfo
Bookinfoも、マイクロサービスアーキテクチャに基づくデモアプリケーションです。Istioと同じリポジトリに入っているマニフェストを、Kubernetesにapplyしていくことで気軽に試せます。
Awesome Microservices
Awesome Microservicesは、実際にマイクロサービスのアプリケーションを開発するときに役立つ技術情報がまとめられているリポジトリです。開発言語ごとに項目が分かれていて、見やすいです。(知らない単語ばかりで頭が痛くなりました)
サービスメッシュ
概要
マイクロサービス・アーキテクチャのアプリケーションは、細かいコンポーネントに分割され、それらが相互に通信すると書きました。利点も多い一方で、細かく分かれているがゆえに、監視やロギング、サービスディスカバリーなど難しくなるという課題もあります。マイクロサービスの課題の対応策として登場したのがサービスメッシュです。
サービスメッシュとは、各マイクロサービスが互いにどのように通信するかを制御する仕組みです。各マイクロサービスにはサイドカープロキシが挿入され、そのプロキシを介して相互に連携します。こちらのドキュメントがわかりやすいかもしれません。
サービスメッシュでは、リクエストはそれぞれのインフラストラクチャ層内のプロキシを通じてマイクロサービス間を転送されます。この理由で、サービスメッシュを構成する個々のプロキシを「サイドカー」と呼ぶことがあります。各サービスの内部ではなく、並んで実行されるからです。まとめると、各サービスから切り離されたこのような「サイドカー」プロキシが、メッシュネットワークを形成します。
引用元: https://www.redhat.com/ja/topics/microservices/what-is-a-service-mesh
上の図のようにサービスを互いに線でつないでみると網目状になるので、サービスメッシュという名前がついています。
関連技術
Istio
サービスメッシュを実現するOSSはいくつかありますが、Istioが最も有名だと思います。GoogleやIBM、Lyftが関わっています。後ほどのデモで使おうと思います。
Istioのアーキテクチャは公式ドキュメントにも載っている以下の図がわかりやすいです。
引用元: https://istio.io/latest/docs/concepts/what-is-istio/
まず大きく分けて2つの要素があります。コントロールプレーンとデータプレーンです。データプレーンは、各マイクロサービスに付随するプロキシの集合です。サービス間の通信やクラスタ外部との通信を中継します。コントロールプレーンは、サービスメッシュ内の各プロキシの設定やポリシー管理を行います。またテレメトリーの収集も行います。
さらに、Istioコントロールプレーンには、主に以下のコンポーネントが含まれます。
- Pilot: 各プロキシの設定管理を行う
- Citadel: 各プロキシに対して、TLS証明書の作成やローテーションを行う。砦という意味
- Galley: Istioに構成管理サービスを提供
- Mixer: 統計情報の取得や認証を行う。「Adapter」と呼ばれるプラグイン機構を使う
Isiod
コントロールプレーンのコンポーネント、よくわからんけどたくさんありますね。ただIstioのドキュメントを眺めた限り、2020年3月ごろにリリースされたIstio 1.5あたりから状況が少し変わっているように感じました。
まずIstio 1.5のUpgrade Notesによれば、Istio 1.5からIstiod
が導入されています。Istioコントロールプレーンのコンポーネントが統合されて、istiod
という1つのDeploymentとして動くようになったそうで、d
はおなじみのデーモンのdです。この記事の後半で後ほどIstioをインストールしますが、今回の手順だとこのIstiodがKubernetesクラスターのデプロイされます。
またAnnouncing Istio 1.8によれば、MixerくんはIstio 1.7でdeprecatedとなり、1.8では削除されたそうです。さようなら。このページの注意書きによれば、Mixerが担っていた機能は、後述のEnvoyプロキシに移行されたそうです。
Envoy
Envoyは、オープンソースで利用できる軽量なプロキシです。サービスメッシュの文脈では、先程から何度か出てきているデータプレーンの「サイドカープロキシ」として使います。IstioもKumaも、プロキシはEnvoyです。マイクロサービスを構成するPodに、サイドカーコンテナとしてEnvoyプロキシのコンテナを挿入し、サービス間やクラスタ外からのトラフィックをEnvoyがインターセプトします。
Jaeger
Jaegerは、分散サービス間のトランザクションをトレースするためのOSSです。マイクロサービスアーキテクチャのアプリケーションの監視やトラブルシューティングに使用されます。読み方はイェーガーです。巨人を駆逐する人と同じです。また、ロゴが可愛いことで知られています。
かわいいよねこれ pic.twitter.com/vQKFXv7R8D
— nishipy (@iamnishipy) December 10, 2020
Kiali
Kialiは、マイクロサービス間のトラフィックのフローや通信状態などを可視化できるOSSです。障害時にどこのサービスがうまく動いていないか確認したりするのに役立ちそうです。GrafanaやJaegerとの連携もできるらしい。
引用元: https://kiali.io/documentation/latest/architecture/
Kuma
Kumaは、Istioと同様にサービスメッシュを実現するOSSの1つです。まったく使ったことはありませんが、名前が可愛くていいですね。Kongという会社が開発しているらしく、こちらのブログポストで概要を知ることができます。
気軽なデモ
ここからはデモアプリをデプロイして、トラフィックを観察するだけの気軽なデモをやります。分散トレーシングを試したり、サービス間の通信にmTLSを適用したり、ネットワークポリシーを設定したり、A/Bテストしたり、JWT認証をつけたり、できることはいろいろありますが今回はやりません。
クラスタの用意
自宅にクラスターがないので、前回を使ったkindでKubernetesクラスタを用意します。予めDocker Desktopの設定で多めにリソースを割り当てておき、Master1台、Worker1台構成のクラスタを作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
$ kind version kind v0.9.0 go1.15.2 darwin/amd64 $ echo "--- kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker " > $HOME/kind-config.yaml $ kind create cluster --name=istio-demo --config=$HOME/kind-config.yaml Creating cluster "istio-demo" ... ✓ Ensuring node image (kindest/node:v1.19.1) 🖼 ✓ Preparing nodes 📦 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 ✓ Joining worker nodes 🚜 Set kubectl context to "kind-istio-demo" You can now use your cluster with: kubectl cluster-info --context kind-istio-demo Thanks for using kind! 😊 $ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE default/api-ocp-rhtest-tk:6443/kube:admin api-ocp-rhtest-tk:6443 kube:admin default * kind-istio-demo kind-istio-demo kind-istio-demo mkdocs-test/api-ocp-rhtest-tk:6443/kube:admin api-ocp-rhtest-tk:6443 kube:admin mkdocs-test $ kubectl version Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:50:19Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.1", GitCommit:"206bcadf021e76c27513500ca24182692aabd17e", GitTreeState:"clean", BuildDate:"2020-09-14T07:30:52Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"} |
Istioのインストール
Kubernetesクラスターができたので、Installation Guidesに沿って、Istioをインストールします。いくつか方法があるのですが、宗教上の理由からIstio Operatorを使ったインストール方法でやってみます。
Istioctlコマンドのインストール
こちらを見てインストールします。
1 2 |
$ curl -sL https://istio.io/downloadIstioctl | sh - $ export PATH=$PATH:$HOME/.istioctl/bin |
Istio Operatorのデプロイ
以下のコマンドでIstio Operatorをデプロイします。必要なコントローラーとCRDに加え、ServiceやRBAC関連リソースを、名前空間istio-operator
に作成してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ istioctl operator init Installing operator controller in namespace: istio-operator using image: docker.io/istio/operator:1.8.1 Operator controller will watch namespaces: istio-system ✔ Istio operator installed ✔ Installation complete $ kubectl get all -n istio-operator NAME READY STATUS RESTARTS AGE pod/istio-operator-7f476cbd6-xhvcc 1/1 Running 0 2m23s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/istio-operator ClusterIP 10.96.223.234 8383/TCP 2m23s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/istio-operator 1/1 1 1 2m23s NAME DESIRED CURRENT READY AGE replicaset.apps/istio-operator-7f476cbd6 1 1 1 2m23s $ kubectl get clusterrole,clusterrolebinding -l operator.istio.io/component=IstioOperator NAME CREATED AT clusterrole.rbac.authorization.k8s.io/istio-operator 2020-12-15T16:26:30Z NAME ROLE AGE clusterrolebinding.rbac.authorization.k8s.io/istio-operator ClusterRole/istio-operator 5m35s |
Istioのインストール
これもドキュメントの通り、istio-system
というNamespaceに、IstioOperator
というカスタムリソースを作成します。これをIstio Operatorのコントローラーが検知して、Istioのコンポーネントをインストールしてくれます。.spec.profile
でdemo
を指定していますが、他にもdefault
やminimal
などがあり、プロファイルによってインストールされるコンポーネントが変わるみたい)です。
何分か待つと、Podが上がってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ kubectl create ns istio-system namespace/istio-system created $ kubectl apply -f - <<EOF apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: istio-system name: example-istiocontrolplane spec: profile: demo EOF istiooperator.install.istio.io/example-istiocontrolplane created $ kubectl get pod -n istio-system NAME READY STATUS RESTARTS AGE istio-egressgateway-d84f95b69-fbhsp 1/1 Running 0 21s istio-ingressgateway-75f6d79f48-rhxd7 1/1 Running 0 21s istiod-7c67c6b6c8-vsm7n 1/1 Running 0 33s |
それぞれのPodはDeploymentで管理されていますが、それぞれ以下のような役割があります。
- istiod: Istioコントロールプレーンのコンポーネントが統合されて、1つのプロセスとして動いています。
d
はもちろんデーモンのdです。 - istio-ingressgateway: KubernetesのIngress機能に加え、Istioが管理する監視やルーティングルールをクラスタ外からの通信に適用します。
- istio-egressgateway: ingressgatewayの逆です。クラスタ外へのトラフィックを対象とします。
Prometheus, Grafana, Kialiのインストール
こちらのドキュメントを参考にして、それぞれインストールしておきます。
3つ目のKialiのインストールで、no matches for kind "MonitoringDashboard" in version "monitoring.kiali.io/v1alpha1"
というエラーが出る場合があるそうです。その場合は同じコマンドをもう一度実行すればよいらしいので、お試しください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml 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 $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml serviceaccount/grafana created configmap/grafana created service/grafana created deployment.apps/grafana created configmap/istio-grafana-dashboards created configmap/istio-services-grafana-dashboards created $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/kiali.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition customresourcedefinition.apiextensions.k8s.io/monitoringdashboards.monitoring.kiali.io unchanged serviceaccount/kiali unchanged configmap/kiali unchanged clusterrole.rbac.authorization.k8s.io/kiali-viewer unchanged clusterrole.rbac.authorization.k8s.io/kiali unchanged clusterrolebinding.rbac.authorization.k8s.io/kiali unchanged service/kiali unchanged deployment.apps/kiali unchanged monitoringdashboard.monitoring.kiali.io/envoy created monitoringdashboard.monitoring.kiali.io/go created monitoringdashboard.monitoring.kiali.io/kiali created monitoringdashboard.monitoring.kiali.io/micrometer-1.0.6-jvm-pool created monitoringdashboard.monitoring.kiali.io/micrometer-1.0.6-jvm created monitoringdashboard.monitoring.kiali.io/micrometer-1.1-jvm created monitoringdashboard.monitoring.kiali.io/microprofile-1.1 created monitoringdashboard.monitoring.kiali.io/microprofile-x.y created monitoringdashboard.monitoring.kiali.io/nodejs created monitoringdashboard.monitoring.kiali.io/quarkus created monitoringdashboard.monitoring.kiali.io/springboot-jvm-pool created monitoringdashboard.monitoring.kiali.io/springboot-jvm created monitoringdashboard.monitoring.kiali.io/springboot-tomcat created monitoringdashboard.monitoring.kiali.io/thorntail created monitoringdashboard.monitoring.kiali.io/tomcat created monitoringdashboard.monitoring.kiali.io/vertx-client created monitoringdashboard.monitoring.kiali.io/vertx-eventbus created monitoringdashboard.monitoring.kiali.io/vertx-jvm created monitoringdashboard.monitoring.kiali.io/vertx-pool created monitoringdashboard.monitoring.kiali.io/vertx-server created |
インストールできたら、istioctl dashboard
コマンドで、それぞれのWebコンソールにアクセスできます。以下は、Kialiのコンソールにアクセスする例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ istioctl dashboard -h Access to Istio web UIs Usage: istioctl dashboard [flags] istioctl dashboard [command] Aliases: dashboard, dash, d Available Commands: controlz Open ControlZ web UI envoy Open Envoy admin web UI grafana Open Grafana web UI jaeger Open Jaeger web UI kiali Open Kiali web UI prometheus Open Prometheus web UI zipkin Open Zipkin web UI [...] $ istioctl dashboard kiali |
Online Boutiqueのデプロイ
サービスメッシュのスタックがインストールできたので、次はマイクロサービスのデモアプリケーションOnline Boutiqueをデプロイします。Namespaceは適当に作って、あとはREADMEを見ながらやりました。5分くらいでPodが立ち上がるので気長に待ちます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
$ git clone https://github.com/GoogleCloudPlatform/microservices-demo.git $ cd microservices-demo $ kubectl create ns demo-app namespace/demo-app created $ kubectl apply -f ./release/kubernetes-manifests.yaml -n demo-app deployment.apps/emailservice created service/emailservice created deployment.apps/checkoutservice created service/checkoutservice created deployment.apps/recommendationservice created service/recommendationservice created deployment.apps/frontend created service/frontend created service/frontend-external created deployment.apps/paymentservice created service/paymentservice created deployment.apps/productcatalogservice created service/productcatalogservice created deployment.apps/cartservice created service/cartservice created deployment.apps/loadgenerator created deployment.apps/currencyservice created service/currencyservice created deployment.apps/shippingservice created service/shippingservice created deployment.apps/redis-cart created service/redis-cart created deployment.apps/adservice created service/adservice created $ watch kubectl get pod -n demo-app NAME READY STATUS RESTARTS AGE adservice-5f6f7c76f5-556ch 1/1 Running 0 6m15s cartservice-675b6659c8-hjmks 1/1 Running 4 6m16s checkoutservice-85d4b74f95-pjbxs 1/1 Running 0 6m17s currencyservice-6d7f8fc9fc-l8xhv 1/1 Running 0 6m16s emailservice-798f4f5575-mw6w7 1/1 Running 0 6m17s frontend-6b64dc9665-x2vcs 1/1 Running 0 6m17s loadgenerator-7747b67b5-qhrt8 1/1 Running 6 6m16s paymentservice-98cb47fff-z8xqr 1/1 Running 0 6m16s productcatalogservice-7f857c47f-8jx4l 1/1 Running 0 6m16s recommendationservice-5bf5bcbbdf-5hmnr 1/1 Running 0 6m17s redis-cart-74594bd569-6lwvg 1/1 Running 0 6m15s |
ドキュメントはGKE前提で書かれていますが、今回はkindでKubernetesクラスタを作っているので、frontend-external
というLoadBalancerタイプのServiceは機能してません。代わりにkubectl port-forward
を使ってお茶を濁します。
1 2 3 4 5 6 |
$ kubectl get pod -n demo-app frontend-6b64dc9665-xwlh8 --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' 8080 $ kubectl port-forward -n demo-app frontend-6b64dc9665-xwlh8 7000:8080 Forwarding from 127.0.0.1:7000 -> 8080 Forwarding from [::1]:7000 -> 8080 |
これで、ブラウザからhttp://localhost:7000/
でアクセスできるようになります。
Envoyサイドカーの挿入
デモアプリとIstioとその仲間たちを導入したから準備完了!とはなりません。Online Boutiqueをデプロイしましたが、まだプロキシ(Envoy)がいません。この記事の前半に載せた下図でいうところのサイドカーがいないので、サービスメッシュにはなっていません。
(再掲)
引用元: https://www.redhat.com/ja/topics/microservices/what-is-a-service-mesh
サイドカープロキシを挿入するために、今回はAutomatic sidecar injection
の手順を使います。Namespaceにistio-injection=enabled
とつけると、そのNamespaceに属する各PodにサイドカープロキシとしてEnvoyのコンテナが挿入されます。不思議ですね。
これは、Understanding what happenedとして丁寧に書いてある通り、Istio
が提供するMutatingAdmissionWebhook istio-sidecar-injector
によるものです。よって、Podを作成するタイミングにEnvoyサイドカーコンテナが追加されます。今回は一度デモアプリ用のPodをすべて削除してから再作成し、kubectl get pod
したときのREADY
列を改めて見ると、Pod内のコンテナが1つ増えている事がわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$ kubectl get pod -n demo-app NAME READY STATUS RESTARTS AGE adservice-5f6f7c76f5-2t4hd 1/1 Running 0 4m44s cartservice-675b6659c8-8fv72 1/1 Running 2 4m44s checkoutservice-85d4b74f95-h4vqp 1/1 Running 0 4m45s currencyservice-6d7f8fc9fc-2qh8s 1/1 Running 0 4m44s emailservice-798f4f5575-sfqr8 1/1 Running 0 4m45s frontend-6b64dc9665-xwlh8 1/1 Running 0 4m45s loadgenerator-7747b67b5-xwvv8 1/1 Running 5 4m44s paymentservice-98cb47fff-8qpfg 1/1 Running 0 4m44s productcatalogservice-7f857c47f-swclh 1/1 Running 0 4m44s recommendationservice-5bf5bcbbdf-rdxgw 1/1 Running 0 4m45s redis-cart-74594bd569-pv4kl 1/1 Running 0 4m44s shippingservice-75f7f9dc6c-fj9d9 1/1 Running 0 4m44s $ kubectl -n demo-app delete pod --all pod "adservice-5f6f7c76f5-556ch" deleted pod "cartservice-675b6659c8-hjmks" deleted pod "checkoutservice-85d4b74f95-pjbxs" deleted pod "currencyservice-6d7f8fc9fc-l8xhv" deleted pod "emailservice-798f4f5575-mw6w7" deleted pod "frontend-6b64dc9665-x2vcs" deleted pod "loadgenerator-7747b67b5-qhrt8" deleted pod "paymentservice-98cb47fff-z8xqr" deleted pod "productcatalogservice-7f857c47f-8jx4l" deleted pod "recommendationservice-5bf5bcbbdf-5hmnr" deleted pod "redis-cart-74594bd569-6lwvg" deleted pod "shippingservice-75f7f9dc6c-mt2l4" deleted $ kubectl -n watch kubectl get pod -n demo-app NAME READY STATUS RESTARTS AGE adservice-5f6f7c76f5-f2rrr 2/2 Running 0 97s cartservice-675b6659c8-ppqzt 2/2 Running 2 97s checkoutservice-85d4b74f95-rccd8 2/2 Running 0 97s currencyservice-6d7f8fc9fc-vdkq2 2/2 Running 0 97s emailservice-798f4f5575-z8qg5 2/2 Running 0 96s frontend-6b64dc9665-pmkq2 2/2 Running 0 96s loadgenerator-7747b67b5-lftnw 2/2 Running 3 96s paymentservice-98cb47fff-4xhjb 2/2 Running 0 95s productcatalogservice-7f857c47f-xg8ts 2/2 Running 0 95s recommendationservice-5bf5bcbbdf-vflqj 2/2 Running 0 95s redis-cart-74594bd569-ctxmm 2/2 Running 0 95s |
トラフィックの観察
KialiでOnline Boutiqueのトラフィックを眺めて終わりたいと思います。まずkialiのWebコンソールを開きます。
1 |
$ istioctl dashboard kiali |
[Graph]を押して、Namespace demo-app
を選んだらそれっぽい図が現れます。Online Boutiqueを構成する11個のマイクロサービスが表示されています。さらにTraffic Animationにチェックを入れます。このOnline Boutiqueにはloadgenerator
というDeploymentがいて、その名の通り、いい感じにデモアプリに負荷をかけ続けてくれるので、すぐにトラフィックの流れを観察できます。フロントエンドへ入るトラフィックがHTTPで、その他のサービス間はgRPCで通信していることもわかります。その他、毎秒のリクエスト数やレスポンスタイムの表示もできます。
では、今日は疲れたのでこの辺で。
これ買うくらい疲れてるMonday pic.twitter.com/8vGAxTQy5E
— nishipy (@iamnishipy) December 21, 2020
皆さまよいお年を。2021年もどうぞよろしくお願いいたします。
Reference
- マイクロサービスとは – Red Hat
- Online Boutique
- Sock Shop
- Bookinfo
- Awesome Microservices
- サービスメッシュとは – Red Hat
- Istio
- Envoy
- Jaeger
- Kiali
- Kuma
以上.
コメント