Istio 1.5.0 + Mixerless Stackdriverの設定は楽だった

今日は仕事の休みをとったので、家でぼーっとIstio触って遊んでる。

ということで、この続き。前回はIstio 1.5の設定をカスタマイズする方法を確認したので、今日はStackdriverを使いたい:

bufferings.hatenablog.com

ちなみにStackdriverはGCPのモニタリング関係のツール群のこと。以前にGoogleに買収されてGCPと連携し始めたんだけど、最近GCPのコンソールとの統合が終わってStackdriverという名前はGCP上からはなくなったっぽい。IstioではStackdriverって名前はずっと使われるのかな?

Istio + Stackdriverでできること

色々ごにょごにょやってみて分かったのはIstio + Stackdriverでできるのはこういうこと:

トポロジーに関してはまだ限定公開ベータみたいで僕は見られないんだけど、個人的には来月のGoogle Cloud Nextぐらいで一般公開ベータになるんじゃないかなぁと期待している。

こんな感じのやつなのかな?楽しみ。出たら試してみよう。

Exploring the Service Mesh Dashboard  |  Service Mesh Documentation

f:id:bufferings:20200312121447p:plain

## 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%にしたからいっぱいでてる:

f:id:bufferings:20200312122818p:plain

f:id:bufferings:20200312122837p:plain

## メトリクス

こんな感じ:

f:id:bufferings:20200312123857p:plain

この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 という名前でアクセスログが出力される。

f:id:bufferings:20200312124538p:plain

内容はこんな感じ。ステータスコードレイテンシーあたりは便利そう:

{
  "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
}

## フラグの使われてる場所

はこの辺だな:

https://github.com/istio/istio/blob/1.5.0/manifests/istio-control/istio-discovery/templates/telemetryv2_1.5.yaml#L406-L410

                  {{- 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 }}

自分で設定したければこんな風に書けるってことね:

https://github.com/istio/istio/blob/1.5.0/manifests/istio-control/istio-discovery/values.yaml#L189-L194

      configOverride: {}
      #  e.g.
      #  enable_mesh_edges_reporting: true
      #  disable_server_access_logging: false
      #  meshEdgesReportingDuration: 500s
      #  disable_host_header_fallback: true

## monitoring フラグは使われてなさそう

なので質問しておいた:

Istio 1.5: Isn't `telemetry.v2.stackdriver.monitoring` flag used? - Policies and Telemetry - Discuss Istio

## 実装は

ここにあるやつっぽい:

https://github.com/istio/proxy/tree/1.5.0/extensions/stackdriver

C++なのかな?おー。雰囲気でしか読めない。

## 面白かった!

次で BlackHoleCluster のメトリクスが取得できるようになってるかどうかを確認して一旦終わりにしようと思う。