SpinnakerとKayentaを使えばカナリーリリースの結果を自動評価することができる。
Automated Canary Analysis at Netflix with Kayenta
https://medium.com/netflix-techblog/automated-canary-analysis-at-netflix-with-kayenta-3260bc7acc69
この自動分析をGKEで試そうとしていたが、Kubenetes(k8s)コンテナー(Stackdriver)からメトリクスが取れていなかった。 理由がわかったのでメモしておく。
2018/07/06追記
なお、この記事はSpinnaker v1.8.0を利用したときの記事である。
すでにこの問題はPRで対応されており、tagを見る限り1.9.0では改善される見込みだ。
- feat(stackdriver): Add support for legacy gke_container resource type.
コメントで教えていただきありがとうございました。
TL;DR
- Spinnaker1.8.0がサポートしているメトリクスのResource Typeに
gke_container
は含まれていない - そのため、k8sを
1.10
系にしてStackdriver k8s MonitoringのBeta版を有効にする必要がある。
GCP_PROJECT=$(gcloud info --format='value(config.project)')
CLUSTER_NAME=cluster-1
CLUSTER_VERSION=1.10.4-gke.2
ZONE=us-central1-a
CLOUDSDK_CONTAINER_USE_V1_API=false
CLOUDSDK_API_CLIENT_OVERRIDES_CONTAINER=v1beta1
gcloud beta container clusters create $CLUSTER_NAME \
--zone=$ZONE \
--project=$GCP_PROJECT \
--cluster-version=$CLUSTER_VERSION \
--enable-stackdriver-kubernetes \
--enable-legacy-authorization
Kayentaにメトリクスデータが入ってこない
先日GKE上に自動カナリー分析を有効にしたSpinnakerを構築した。
ただ、実際にパイプラインを動かしてもStackdriver上では見えるメトリクスがSpinnaker上からは見えず、ずっと自動カナリーリリースが失敗していた。
Spinnakerが使うメトリクスのリソースタイプを確認する。
2018/06/27現在のSpinnakerの最新バージョン(1.8.0)でstackdriverの自動カナリー分析の設定を有効にする(hal config canary google edit --gcs-enabled true --stackdriver-enabled true
)と、メトリクスのResource Type
は以下になっている。
gce_instance
aws_ec2_instance
gae_app
k8s_container
k8s_pod
k8s_node
global
ここでStackdriver MonitoringのResource Typeを確認すると、通常のGKEクラスターのResource Typeはgke_container
になっている。
Monitored Resource Types
https://cloud.google.com/monitoring/api/resources#tag_gke_container
Resource Typeが異なるため、メトリクスを収集することができていなかった。
k8sクラスターを1.10
系にしてStackdriver Monitoring Beta版を有効にする
GKE上のk8sクラスターのモニタリングResource Typeを有効にするにはStackdriver MonitoringをBeta版にすれば良い。
Migrating to Kubernetes Monitoring
https://cloud.google.com/monitoring/kubernetes-engine/migration
自分は新しくk8sクラスターを作り直した。
GCP_PROJECT=$(gcloud info --format='value(config.project)')
CLUSTER_NAME=cluster-1
CLUSTER_VERSION=1.10.4-gke.2
ZONE=us-central1-a
CLOUDSDK_CONTAINER_USE_V1_API=false
CLOUDSDK_API_CLIENT_OVERRIDES_CONTAINER=v1beta1
gcloud beta container clusters create $CLUSTER_NAME \
--zone=$ZONE \
--project=$GCP_PROJECT \
--cluster-version=$CLUSTER_VERSION \
--enable-stackdriver-kubernetes \
--enable-legacy-authorization
この状態でk8sでコンテナーを起動して、GCP ConsoleからStackdriver Loggingを確認する。
GKE Container
ではなく、Kubernetes Container
というResourceが選択できるようになったら変更成功だ。
これでSpinnakerからStackdriver経由でGKE上のメトリクスを参照できるようになった。
終わりに
なお、この新しいStackdriver k8s Monitoringは2018/06/27現在まだbeta releaseなのでSLAの対象外になっている。
https://cloud.google.com/monitoring/kubernetes-engine/migration
This is a Beta release of Stackdriver Kubernetes Monitoring. This feature is not covered by any SLA or deprecation policy and might be subject to backward-incompatible changes.
自分はお試しで触っているのでSLAなど気にしないのだが、本番環境で自動カナリーリリース分析をするにはPrometheus経由とかになるのかな?