今日は仕事の休みをとったので、家でぼーっとIstio触って遊んでる。
ということで、この続き。前回はIstio 1.5の設定をカスタマイズする方法を確認したので、今日はStackdriverを使いたい:
ちなみにStackdriverはGCPのモニタリング関係のツール群のこと。以前にGoogleに買収されてGCPと連携し始めたんだけど、最近GCPのコンソールとの統合が終わってStackdriverという名前はGCP上からはなくなったっぽい。IstioではStackdriverって名前はずっと使われるのかな?
Istio + Stackdriverでできること
色々ごにょごにょやってみて分かったのはIstio + Stackdriverでできるのはこういうこと:
トポロジーに関してはまだ限定公開ベータみたいで僕は見られないんだけど、個人的には来月のGoogle Cloud Nextぐらいで一般公開ベータになるんじゃないかなぁと期待している。
こんな感じのやつなのかな?楽しみ。出たら試してみよう。
Exploring the Service Mesh Dashboard | Service Mesh Documentation
## Mixerless?
Istio 1.4 までは Mixer というコンポーネントがテレメトリーを担当していたので、Mixer が istio-proxy の情報を集めて加工して Stackdriver に送っていたのかなと思っているんだけど、 Istio 1.5 からは Mixer なしで、istio-proxy 自身で情報を加工して直接 Stackdriver に送るっぽい。従来通り Mixer をデプロイして使うこともできるみたいだけど。
なので、今回は Mixer を使わずにやってみた。
## 設定
最終的にはこういう設定ファイルで動作確認をした:
apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: profile: default addonComponents: prometheus: enabled: false values: global: proxy: # 分散トレーシングにStackdriverを使う tracer: "stackdriver" pilot: # 動作確認のためトレーシングのサンプリングレートを100%にする # (デフォルトでは1%) traceSampling: 100.0 telemetry: v2: # こっちはテレメトリー用の設定 enabled: true prometheus: enabled: false stackdriver: enabled: true logging: true monitoring: true topology: true configOverride: {}
以前はStackdriver連携はちょっと面倒くさかったけど、今はフラグを設定するだけでいいから楽になったなぁ。
## 環境準備
上記の内容のconfig.yaml
ファイルを作って前回やった通りGKE上にデプロイした:
# Istioをカスタマイズしてデプロイ ❯ istioctl manifest apply -f config.yaml proto: tag has too few fields: "-" - Applying manifest for component Base... ✔ Finished applying manifest for component Base. - Applying manifest for component Pilot... ✔ Finished applying manifest for component Pilot. Waiting for resources to become ready... Waiting for resources to become ready... Waiting for resources to become ready... Waiting for resources to become ready... Waiting for resources to become ready... Waiting for resources to become ready... - Applying manifest for component IngressGateways... ✔ Finished applying manifest for component IngressGateways. ✔ Installation complete # サイドカーの自動インジェクションを有効に ❯ kubectl label namespace default istio-injection=enabled namespace/default labeled # 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 # Gatewayをデプロイ ❯ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created # LBのIPアドレスを取得 ❯ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') # アクセス ❯ for i in {0..1000}; do curl -s -o /dev/null $INGRESS_HOST/productpage ; done
## 分散トレーシング
こんな感じ。テスト用にサンプルレートを100%にしたからいっぱいでてる:
## メトリクス
こんな感じ:
この8つを取得してるんだろうな:
https://github.com/istio/proxy/blob/1.5.0/extensions/stackdriver/common/constants.h#L33-L40
// View names of metrics. constexpr char kServerRequestCountView[] = "server/request_count"; constexpr char kServerRequestBytesView[] = "server/request_bytes"; constexpr char kServerResponseBytesView[] = "server/response_bytes"; constexpr char kServerResponseLatenciesView[] = "server/response_latencies"; constexpr char kClientRequestCountView[] = "client/request_count"; constexpr char kClientRequestBytesView[] = "client/request_bytes"; constexpr char kClientResponseBytesView[] = "client/response_bytes"; constexpr char kClientRoundtripLatenciesView[] = "client/roundtrip_latencies";
## アクセスログ
server-accesslog-stackdriver
という名前でアクセスログが出力される。
内容はこんな感じ。ステータスコードやレイテンシーあたりは便利そう:
{ "insertId": "gxs01yfgejwt2", "httpRequest": { "requestMethod": "GET", "requestUrl": "http://reviews:9080/reviews/0", "requestSize": "702", "status": 200, "responseSize": "1618", "remoteIp": "10.52.2.12:47786", "serverIp": "10.52.2.10:9080", "latency": "0.007817202s", "protocol": "http" }, "resource": { "type": "k8s_container", "labels": { "namespace_name": "default", "location": "asia-northeast1-a", "project_id": "bufferings", "cluster_name": "cluster-1", "pod_name": "reviews-v2-ccffdd984-l5m6j", "container_name": "istio-proxy" } }, "timestamp": "2020-03-12T03:06:28.287206Z", "severity": "INFO", "labels": { "source_name": "productpage-v1-7d6cfb7dfd-478rm", "mesh_uid": "cluster.local", "request_id": "72ad4521-f84d-9c55-aebd-76db929a02c9", "destination_namespace": "default", "source_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-productpage", "destination_workload": "reviews-v2", "destination_version": "v2", "source_namespace": "default", "source_workload": "productpage-v1", "destination_name": "reviews-v2-ccffdd984-l5m6j", "destination_app": "reviews", "destination_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-reviews", "source_version": "v1", "response_flag": "-", "destination_service_host": "reviews.default.svc.cluster.local", "source_app": "productpage", "service_authentication_policy": "MUTUAL_TLS" }, "logName": "projects/bufferings/logs/server-accesslog-stackdriver", "trace": "projects/bufferings/traces/be637c6512ec684cb40e1bc53e4ede7a", "receiveTimestamp": "2020-03-12T03:06:36.676552707Z", "spanId": "65370afa2383d688", "traceSampled": true }
## フラグの使われてる場所
はこの辺だな:
{{- if not .Values.telemetry.v2.stackdriver.configOverride }} {"enable_mesh_edges_reporting": {{ .Values.telemetry.v2.stackdriver.topology }}, "disable_server_access_logging": {{ not .Values.telemetry.v2.stackdriver.logging }}, "meshEdgesReportingDuration": "600s", "disable_host_header_fallback": true} {{- else }} {{ toJson .Values.telemetry.v2.stackdriver.configOverride | indent 18 }} {{- end }}
自分で設定したければこんな風に書けるってことね:
configOverride: {} # e.g. # enable_mesh_edges_reporting: true # disable_server_access_logging: false # meshEdgesReportingDuration: 500s # disable_host_header_fallback: true
## monitoring
フラグは使われてなさそう
なので質問しておいた:
## 実装は
ここにあるやつっぽい:
https://github.com/istio/proxy/tree/1.5.0/extensions/stackdriver
C++なのかな?おー。雰囲気でしか読めない。
## 面白かった!
次で BlackHoleCluster
のメトリクスが取得できるようになってるかどうかを確認して一旦終わりにしようと思う。