Kekeの日記

エンジニア、読書なんでも

Kubernetes Downward APIを使ってDogStatsDにカスタムメトリクスを送れるようになる!

f:id:bobchan1915:20190418110421p:plain

動機

最近、比較的モダンなモニタリングに関する本が出ていたので読みました。

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

そこで、監視(モニタリング)の定義がされていました。

監視とは、あるシステムやそのシステムのコンポーネントの振る舞いいや出力を観察し、チェックし続ける行為である。

プロバイダがGoogle Cloud Platformでなかろうと、Kuberenetesクラスタをモニタリングをするのは簡単なことではありません。

DatadogはDatadog AgentというPod(コンテナ)を配置することによって、KuberenetesのHostを中心に、クラスタ全体のメトリクスを取得、可視化、そして探求をすることができます。

今回はDatadogを使ってGoogle Kuberenets Engineクラスタを監視します。そしてDatadog APMを中心に、新しい機能があるので調査していきます。注意点として、必ずDatadog Agentをインストールする必要はなくて、API経由でもメトリクスを監視することができます。

アジェンダ

今回の記事は以下のアジェンダになっています。クラスタ作成からやるので、興味のあるセクションに飛んでもらっても大丈夫です。

Datadogについて

Datadogについて、体系的にまとめようと思います。

公式サイト

以下のサイトが公式のサイトになります。

www.datadoghq.com

開発、運用する上で必要なドキュメントは以下の通りです。

docs.datadoghq.com

料金

料金体系が用途によって分かれます。

  • Infrastructure: Datadog Agentが集めるメトリクス
  • APM: Datadog APMをつかったアプリケーションのAPM用のメトリクス
  • Log Management: ログ収集、可視化
  • Synthetics: E2E ユーザー体験のモニタリング

変化が大きいので、直接公式ページで参照するのが安全かなと思います。

www.datadoghq.com

どの用途でも14日間のフリートライアルがあるので、導入を検討するときに試してみることができます。

アーキテクチャ

Datadog Agentと呼ばれるAgentはDaemonsetとして、各ノードに配置されます。

そして、配置されたDatadog AgentがDatadog Serverにデータを集めます。

f:id:bobchan1915:20190418132919p:plain
Datadog on Kubernetesのアーキテクチャ略図

APM用のメトリクスの取得方法はまた別なので、あとのセクションで解説をします。

分解能

Datadogでは、1秒の分解能でメトリクスのデータを保存います。

Datadogを導入する

これより構築をしてみようと思います。

1. GKEクラスタの作成

f:id:bobchan1915:20190418182401p:plain
クラスタを作成

まず、今回の対象となるクラスタを作成します。

gcloud container clusters create test-cluster --zone asia-northeast1 --machine-type g1-small --num-nodes 1

作成できたか、どうか確認します。

gcloud container clusters describe test-cluster --zone asia-northeast1

何か返ってきたら作成ができています。

2. Datadog Agentのデプロイ

Datadog Agent自体を実際にデプロイします。

API Keyを取得する

WebサイトでAPI Keyを取得する必要があります。「Integration」-> 「APIs」から新しく設定をすることができます。

Webサイトにアクセスして、API Keyを作成してコピーしてください。

f:id:bobchan1915:20190417192642p:plain

これの次のセクションのHelmのValueとして使用します。

Helmでインストールをする

今回はHelmを使ってDatadog Agentをインストールします。特に説明することはないので説明を省きます。

デプロイされると、以下のように確認をすることができます。

試しにPodをとると、以下のようようになります。

$ kubectl get pods 

すると、以下のようになります。

NAME                                         READY     STATUS    RESTARTS   AGE
datadog-2vclk                                1/1       Running   0          4m
datadog-5s2hf                                1/1       Running   0          4m
datadog-kube-state-metrics-b5c8c4d64-7npgd   1/1       Running   0          4m
datadog-l2mwj                                1/1       Running   0          4m

Datadogのサイトでは以下のようになっていて、ダッシュボードを確認できるようになります。

f:id:bobchan1915:20190417223423p:plain
Datadog Agentがデプロイすると進めるダッシュボード

Eventを確認

Eventはダッシュボードを誰が作成したか、設定をどう買えたかなど、Datadog内でどのようなことが起きているかを監視できるものです。

チームなどを運用しているときはオペレーションを確認したいときに便利です。

f:id:bobchan1915:20190417225639p:plain
Event

まとめると以下の表にできます。

Timeboard Screenboard
時間間隔 すべてのグラフが同じ(平均化されるなど) すべてのグラフが別々の時間間隔
レイアウト グラフがグリッド表示 グラフはどこでも配置をすることができる
グラフ個別で共有できる
ダッシュボードを共有できる
リードオンリーにできる

デフォルトでは、過去一時間のオペレーションが確認をすることができます。

Dashboardを作成

メトリクスを可視化するには、二つのダッシュボードがあります。2つのDashboardの違いを知るには、以下のドキュメントをご覧ください。

docs.datadoghq.com

左のサイドメニューの「Dashboard」->「Dashboard List」でDashboard一覧を見ることができます。

f:id:bobchan1915:20190417224631p:plain
Dashboardのリスト

ここの可視化方法は以下のリンクでご覧ください。

docs.datadoghq.com

A. Timeboardを作成

トラブルシューティングや関係性を知るのに適しています。特に時系列に対して強いです。

f:id:bobchan1915:20190417223953p:plain

どのようなことができるのかというのは、実際に作成するとわかります。

f:id:bobchan1915:20190418182947p:plain
Timeboardのできること

B. Screenboardを作成

データや状態を可視化して、共有することが適しています。

f:id:bobchan1915:20190417224003p:plain

例えば、Host mapを選択したときに色んな可視化方法を設定できます。

f:id:bobchan1915:20190418183310p:plain
可視化方法

Monitorを作成

Prometheusでいうアラートにあたるものです。

f:id:bobchan1915:20190417224216p:plain

いくつも種類があり、ここに一覧を表示します。

f:id:bobchan1915:20190418181516p:plain

Monitorの種類

Monitorにもいくつかあるので、今回はMetricsに注目しようと思います。

Metrics Monitorの設定
  • Threshold Alter: ある閾値を超えたらアラートを発火させるもので、最も一般的。
  • Change Alter: 変化量がある閾値を超えたら発火するアラートです。
  • Anomaly Detection: アルゴリズムベースの異常検知機能。強い傾向のある繰り返しパターンを持ったメトリクスに適しています。
  • Outlier Section: アルゴリズムベースの異常検知機能。グループ内の特定の個体に他とは異なる挙動がみられた際に外れ値データ(Outlier)として検出することができます。
1. メトリクスとその対象範囲(スコープ)の設定
  1. Metrics: 何を

f:id:bobchan1915:20190418181619p:plain

以下のように最初は「どんなメトリクス」をMonitorするかを設定します。

  1. From: 誰の

Fromで、誰のメトリクスを取得するのかを定義します。

f:id:bobchan1915:20190418181808p:plain

例えば、今選択しているのはクラスタを構成しているNodeです。

次にアラートを設定をします。特に重要なのは閾値の設定です。

f:id:bobchan1915:20190418182048p:plain

次に誰に通知するか、どのように通知をするのかを設定します。

f:id:bobchan1915:20190418182222p:plain

テンプレートを使用することになり、ビルドイン変数を使うことができます。

Infrastrutureを確認する

大きく以下の種類に分けることができます。

  • HostMap
  • Infrastruture List
  • Container
  • Process
  • Cloud Functions

1. Host Map: GCEインスタンス(=Host)ごとのCPU使用率などを表示

f:id:bobchan1915:20190417225111p:plain
Host map

2. Infrastructure List: リスト表示でNodeを表示

f:id:bobchan1915:20190417224914p:plain
Infrastructure List

3. Container: コンテナごとの情報を表示

f:id:bobchan1915:20190417225338p:plain
Process

Tagやコンテナ名でソートできるなど、非常に高機能です。

Fluentdなどをはじめ、システム的なコンテナはいくつかあります。そのようなものは、ほとんど制御する機会がないので使いません。

そのため、自分がデプロイしたコンテナを使いたい場合は左のImage名で検索できる箇所があるので、自分のImageにチェックをいれます。

f:id:bobchan1915:20190418112823p:plain

Notebook: 説明とグラフを一体化する

f:id:bobchan1915:20190418001757p:plain

Markdownかグラフを書くことができる。

Jupyter Notebookのように、解析とNotebookの相性は非常に良いです。DatadogのNotebookもメトリクスを使うことによって使用することができるため、データを探求したいときに便利です。

他にも用途としては

  • 障害や復旧手順の記述
  • ドキュメント管理
  • データを探求

アプリケーション固有のメトリクスを収集したいとき

やっと本題です。

f:id:bobchan1915:20190419083054p:plain
DogStatDにカスタムメトリクスを送る

DogStatsDを使うとアプリケーションのカスタムメトリクスを集計できます。別途、収集することができます。Deploymentとして別途、デプロイされるPodです。

DogStatsDは、Datadog Agent 3.0以上に同胞されているメトリクス集約サーバです。DogStatsDは、StatsDプロトコルをサポートすると共に、datadog専用の機能にも対応するよう拡張されています。

UDPポートを公開しているケースがあります。。アプリケーション側からは同PodでなければDownword APIを使って、環境変数を指定してアクセスします。

...
ports:
        - containerPort: 8125
          {{- if .Values.daemonset.useHostPort }}
          hostPort: 8125
          {{- end }}
          name: dogstatsdport
          protocol: UDP
...

つまり、Valueファイルは以下の通りにします。

## @param useHostPort - boolean - optional
  ## Sets the hostPort to the same value of the container port. Needs to be used
  ## to receive traces in a standard APM set up. Can be used as for sending custom metrics.
  ## The ports need to be available on all hosts.
  ##
  ## WARNING: Make sure that hosts using this are properly firewalled otherwise
  ## metrics and traces are accepted from any host able to connect to this host.
  #
  # ここのコメントを外す
  useHostPort: true

DaemonSetsなので、必ず同Nodeにあります。もちろん同じPodであれば普段通り、開発環境と同様にアクセスしてください。

またDownwardAPIについて知らなければ、いかの記事を参照してください。

www.1915keke.com

DogSt​​atsDの主な機能は、所定の時間間隔(デフォルトでは10秒)に発生するデータポイントの情報を、単一のメトリクスに集計/集約することです。

アプリケーション側のことは、ここでは詳しく解説しませんが、いくつもライブラリがあるので、使ってみてください。

docs.datadoghq.com

まとめ

Datadogは簡単に導入できる一方で、信頼性が高く、たかがDaemonset一つだけで済むので、非常に楽であると思いました。Nodeやコンテナの状態の可視化は、エンジニアとしては誰もが助かる要素である。

遠いところだと、アンドロイドエンジニアも、どのAPI Versionなのかをすぐ見つけられて、APIの更新があっても即座にフィードバックを受けることができる。バックエンドエンジニアも同様です。

このような面で、費用対効果が直感的なのでSRE的には導入しやすく、開発体験を向上させることができると感じました。

Cloud Runにも対応しているので、いつかCloud Run with Datadogをしようと思います。

最後まで、ありがとうございました。

参考文献

docs.datadoghq.com

docs.datadoghq.com