Kubernetesを監視するためにDatadogを入れてダッシュボードを作成したときに、Namespace名とPod名をこうやっておけばよかったと反省したのでそのことを記録しておきます。
TL;DR
結論から言うと、
Namespace名やPod名に環境名(devとかstgとか)を入れるのはやめよう。環境ごとにクラスタを作ろう。
ということです。
君の名は
namespace名やpod名はどう命名しているでしょうか。
私の関わったプロジェクトでは下記のような感じでやっていました。
- Namespace名
hoge-dev
hoge-stg
hoge-prd
- Pod名(厳密にはDeployment名)
fuga-dev
fuga-stg
fuga-prd
名前に環境名を入れてました。
ちなみにクラスタは環境ごとに分かれていました。
何が問題か
Datadogのダッシュボードには Configure template variables (テンプレート変数設定)
というものがあります。
変数と、変数に入れる値を抽出する項目を指定すると、グラフなどを作成するクエリに変数を埋め込めるというものです。
これによって動的フィルタリングが可能になります。詳しくは下記URLを参照してください。
このテンプレート変数を利用すると何が便利かというと、 1つのダッシュボードで複数環境の状態を切り替えられる ようになります。
上記ドキュメントにも載ってますが、 env
という変数を指定しておいて dev/stg/prd
を切り替えて、1つのダッシュボードで、全ての環境のメトリクスを切り替えて見ることが可能です。
ですが、Namespace名やPod名に環境名が入っているとどうなるでしょうか。
例として、hogeアプリケーションが配置されているNamespaceで動いているPod数をカウントしてみましょう。
sum:kubernetes.pods.running{kube_namespace:hoge-prd}
こんなクエリになると思います。
このPod数、今回はprdですが、dev環境とstg環境のも見たいとします。
sum:kubernetes.pods.running{kube_namespace:hoge-dev}
sum:kubernetes.pods.running{kube_namespace:hoge-stg}
こんな感じで1つのダッシュボードに各環境用のものが必要になります。
もしくは各環境用のダッシュボードを作成する必要があります。
これは結構手間です。
解決策?
では、テンプレート変数にNamespace名を登録するとどうでしょうか。
一応Namespaceを切り替えることが可能になります。
sum:kubernetes.pods.running{$kube_namespace}
ですが、思い出してください。
Namespaceには default
kube-system
などが存在します。
hogeアプリケーションのNamespaceに配置されてるPod数をカウントしたいですが、余計なものが混じります。
解決策
Namespaceとして hoge
のみを登録します。
名前から環境名を抜くので、クラスタは環境ごとに用意してください。
Datadogのタグ機能を利用して、クラスタごとに環境が分かるタグを埋め込んでください。
datadog:
:
tags: env:dev
:
そしてそのタグ情報を env
などのテンプレート変数に割り当ててください。
そうすると、クエリは下記のようになります。
sum:kubernetes.pods.running{$env,kube_namespace:hoge}
これで、 env
を切り替えるだけで各環境のhogeアプリケーションNamespaceのPods数をカウントできるようになります。
まとめ
Namespace名やPod名に環境名を埋め込んでしまうと、Datadogでダッシュボードを作るときに面倒な感じになります。
例としてNamespaceを挙げましたが、Pod名に環境名が入っていると、さらに様々なところで面倒なことになります。
なので最初で述べたように、
Namespace名やPod名に環境名(devとかstgとか)を入れるのはやめよう。環境ごとにクラスタを作ろう。
というのが重要だと思います。