Datadog で canary デプロイメントの状態を監視する
Posted on
Argo Rollouts を使って canary デプロイメントを導入しようとしているのですが、Datadog で stable と canary の比較をどうやって実現するか検証しました。
Ephemeral Metadata で label を付ける
Argo Rollouts には Ephemeral Metadata という機能があります。 Ephemeral Metadata という名前からわかる通り、ロールアウトの間だけ一時的な label や annotation を付けることができます。
たとえば、次のように定義すれば canary の Pod には role=canary
、stable の Pod には role=stable
の label が付き、最後のステップで 100 % まで進めば role=stable
の label に置き換わります。
spec:
replicas: 5
strategy:
canary:
stableMetadata:
labels:
role: stable
canaryMetadata:
labels:
role: canary
steps:
- setWeight: 20
- pause: {}
- setWeight: 50
- pause: {}
実際に Pod の状態を見ながら試してみます。 canary が始まる前はすべて role=stable
です。
$ k get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo-6668595956-67mp7 1/1 Running 0 8m48s app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-jm4l5 1/1 Running 0 8m48s app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-ktcfj 1/1 Running 0 8m48s app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-twvfq 1/1 Running 0 8m48s app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-xnhzl 1/1 Running 0 8m48s app=demo,role=stable,rollouts-pod-template-hash=6668595956
canary を 20 % まで進めると、ひとつの Pod が role=canary
になりました。
$ k argo rollouts get rollout demo
Name: demo
Namespace: default
Status: ॥ Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 1/4
SetWeight: 20
ActualWeight: 20
Images: argoproj/demo:blue (stable)
argoproj/demo:yellow (canary)
Replicas:
Desired: 5
Current: 5
Updated: 1
Ready: 5
Available: 5
(snip)
$ k get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo-6668595956-67mp7 1/1 Running 0 16m app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-jm4l5 1/1 Running 0 16m app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-ktcfj 1/1 Running 0 16m app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-6668595956-xnhzl 1/1 Running 0 16m app=demo,role=stable,rollouts-pod-template-hash=6668595956
demo-75f756d67b-kb6xq 1/1 Running 0 80s app=demo,role=canary,rollouts-pod-template-hash=75f756d67b
canary を 100 % まで進めると、さっきまで role=canary
だった Pod も含めてすべて role=stable
に変わりました。
$ k get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo-75f756d67b-j9hjg 1/1 Running 0 2m23s app=demo,role=stable,rollouts-pod-template-hash=75f756d67b
demo-75f756d67b-kb6xq 1/1 Running 0 6m31s app=demo,role=stable,rollouts-pod-template-hash=75f756d67b
demo-75f756d67b-mzxgt 1/1 Running 0 3m38s app=demo,role=stable,rollouts-pod-template-hash=75f756d67b
demo-75f756d67b-r9pwm 1/1 Running 0 2m23s app=demo,role=stable,rollouts-pod-template-hash=75f756d67b
demo-75f756d67b-vdx59 1/1 Running 0 3m38s app=demo,role=stable,rollouts-pod-template-hash=75f756d67b
この label を使えば stable と canary の状態を比較できます。
Pod の label を Datadog の tag にする
Datadog Agent は Pod の label を収集してくれますが、そのままでは Datadog の tag として使えません。てっきり Pod の label のままクエリが書けると思って四苦八苦していましたが、クエリとして使うには Datadog の tag でなければいけません。
Pod の label を Datadog の tag として使うには、"Pod labels as tags" を参考に DD_KUBERNETES_POD_LABELS_AS_TAGS
を設定します。
DD_KUBERNETES_POD_LABELS_AS_TAGS='{"role":"kube_role"}'
公式の Helm chart を使っている場合は values で podLabelsAsTags
を定義すれば DD_KUBERNETES_POD_LABELS_AS_TAGS
に設定されます。
podLabelsAsTags:
role: kube_role
正しく設定できていれば、クエリの候補に出てくるはずです。あとは stable と canary で絞り込んだグラフを並べれば OK です。
まとめ
- Argo Rollouts の Ephemeral Metadata を使えば、label や annotation で見分けることができる
- Datadog で比較するには Pod の label を Datadog の tag にする必要がある
Argo Rollouts で canary デプロイメントを導入するのは比較的簡単だと思いますが、運用まで考えるといろいろ検証が必要ですね。