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 です。

Pod labels as tags

まとめ

  • Argo Rollouts の Ephemeral Metadata を使えば、label や annotation で見分けることができる
  • Datadog で比較するには Pod の label を Datadog の tag にする必要がある

Argo Rollouts で canary デプロイメントを導入するのは比較的簡単だと思いますが、運用まで考えるといろいろ検証が必要ですね。