kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

KubernetesをDatadogで監視してみる①

引き続き自分用メモです。

kubernetesのモニタリングといえば、

  • kubernetes dashboard(視覚化)
  • prometheus+alert manager+grafana(メトリクス監視+通知+視覚化)
  • 何かしらnodeの監視

というのが一般的かなと思いますが、いろいろ複雑だし、構築・運用も面倒です。そこでDatadogのkubernetesモニタリングを試してみようというのが今回のお話。

前提

とりあえずDatadog使ったことなくてまずはお試ししてみたいということで、Vagrantでやります。よってdatadogの一部機能(例えば外形監視とか)については試せないのでご了承ください。(やろうと思えばできるかもですが、それならまあAWSとかでやるほうがいいと思います)

以下にVagrantfileとかありますのでgit clone、vagrant upしてください。

以下のようにmaster x 1、worker x 2の構成でubuntuサーバでクラスタが構築されます。

$ vagrant status
Current machine states:

master                    running (virtualbox)
worker-1                  running (virtualbox)
worker-2                  running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

masterに入ってkubectl get nodeしてもらうとわかるかと思います。

$ vagrant ssh master
vagrant@master:~$ kubectl get node
NAME       STATUS   ROLES    AGE     VERSION
master     Ready    master   14m     v1.18.0
worker-1   Ready    <none>   9m30s   v1.18.0
worker-2   Ready    <none>   4m51s   v1.18.0

datadog-agentの設定

とりあえずDatadogにログインします。

https://app.datadoghq.com/account/login

f:id:kun432:20200511164815p:plain

ログインするとこんな画面が表示されてます。(新規アカウントの場合は最初にチュートリアルっぽい画面が出たはずですが、もう思い出せない・・・多分やることはそんなに変わらないはずなので良しなに読んでいただけると助かります)

f:id:kun432:20200513001108p:plain

サイドバーから"Integrations"をクリックします。

f:id:kun432:20200511165236p:plain

色々出てきますが、上の検索フォームで"kubernetes"を検索すると出てきますので、"+Available"にカーソルを合わせると、

f:id:kun432:20200511165501p:plain

"+Install"に変わるのでクリックします。

f:id:kun432:20200511165822p:plain

Kubernetes Integrationの説明が表示されます。Configurationのタブをクリックします。

f:id:kun432:20200511170422p:plain

Configurationタブの一番下にある"Install Integration"をクリックします。

f:id:kun432:20200511185235p:plain

インストールされました。もう一度"+Install"をクリックします。

f:id:kun432:20200511185313p:plain

Configurationタブが表示されますので、その中にある"Instructions"リンクをクリックします。

f:id:kun432:20200511185404p:plain

新しいウインドウで、セットアップ手順が表示されますのでこれに従ってkubernetesクラスタ側で設定を行います。ちなみにこの手順の中にAPIキーが含まれていますのでご注意ください。

f:id:kun432:20200513001324p:plain

kubernetesクラスタ側の設定手順も流してみましょう。masterにsshしてください。

まずdatadog agentはHelmでchartが公開されていますので、まずはhelmをインストールします。今回はhelm3にしました。

$ wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
$ tar zxvf helm-v3.2.1-linux-amd64.tar.gz
$ sudo cp linux-amd64/helm /usr/local/bin/.
$ helm version
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

value.yamlは予め雛形が用意されているのでダウンロードしてきます。

$ wget https://raw.githubusercontent.com/helm/charts/master/stable/datadog/values.yaml -O datadog-values.yaml

これを編集すればカスタマイズができるのですが、このままとりあえずサクッと適用してしまいましょう。RELEASE_NAMEだけ適当に変えてください。

$ helm install datadog-monitoring -f datadog-values.yaml --set datadog.apiKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX stable/datadog 
NAME: datadog-monitoring
LAST DEPLOYED: Mon May 11 21:01:06 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Datadog agents are spinning up on each node in your cluster. After a few
minutes, you should see your agents starting in your event stream:
    https://app.datadoghq.com/event/stream

podがどうなっているか見てみます。

$ kubectl get pod -o wide
NAME                                                     READY   STATUS    RESTARTS   AGE     IP                NODE       NOMINATED NODE   READINESS GATES
datadog-monitoring-5l4jn                                 2/2     Running   0          2m42s   192.168.133.193   worker-2   <none>           <none>
datadog-monitoring-kube-state-metrics-75bc6f498c-5r9v5   1/1     Running   0          2m42s   192.168.133.194   worker-2   <none>           <none>
datadog-monitoring-vplbn                                 2/2     Running   0          2m42s   192.168.226.65    worker-1   <none>           <none>
$ kubectl get ds
NAME                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
datadog-monitoring   2         2         2       2            2           <none>          3m36s

workerノード上でDaemonSetとしてpodが上がっていて、kube-state-metricsがメトリックスを取得しているようです。

Datadog側でも見てみましょう。管理画面で"Infrastructure" -> "Infrastructure List"をクリックします。

f:id:kun432:20200511222537p:plain

worker-1/2が見えていますね。試しにworker-1をクリックします。(muteになっているのがテストで試していたからです。気にしないでください。)

f:id:kun432:20200511222556p:plain

すでにworker-1のグラフができていますね!

f:id:kun432:20200513001547p:plain

が、masterがないですね・・・通常、masterにはpodはスケジュールされないようになっているので、あえてpodをスケジュールするためにはtolerationsを設定する必要があります。

ドキュメントはここ。 docs.datadoghq.com

ということで、manifestを修正します。

agents:
  ・・・
  tolerations:  # []
   - key: node-role.kubernetes.io/master
     effect: NoSchedule

更新します。helmの場合はhelm upgradeを使います。

$ helm upgrade datadog-monitoring -f datadog-values.yaml --set datadog.apiKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX stable/datadog
elease "datadog-monitoring" has been upgraded. Happy Helming!
NAME: datadog-monitoring
LAST DEPLOYED: Tue May 12 17:46:09 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
Datadog agents are spinning up on each node in your cluster. After a few
minutes, you should see your agents starting in your event stream:
    https://app.datadoghq.com/event/stream

podを見てみます。

$ kubectl get pod -o wide
NAME                                                     READY   STATUS    RESTARTS   AGE     IP                NODE       NOMINATED NODE   READINESS GATES
datadog-monitoring-8phft                                 2/2     Running   0          13s     192.168.226.69    worker-1   <none>           <none>
datadog-monitoring-fzddq                                 2/2     Running   0          71s     192.168.219.68    master     <none>           <none>
datadog-monitoring-kube-state-metrics-75bc6f498c-74wfb   1/1     Running   0          2m29s   192.168.226.68    worker-1   <none>           <none>
datadog-monitoring-r8pkg                                 2/2     Running   0          5s      192.168.133.197   worker-2   <none>           <none>

masterにもagentのpodが立ちました。しばらくInfrastructure Listを見ていると、masterも追加されて、なんかいろいろAppsのところが増えてますね。

f:id:kun432:20200512175651p:plain

で、masterも取れたのはいいのですが、Appsのところのmasterのetcdやworkerのkubeletがエラーになっているようです。これは手元の環境にもよるかもしれません。

f:id:kun432:20200512175930p:plain

しばらく見ているとなぜかetcdは消えてしまいました。etcd自体はmasterで動いているのですが、このあたり自動で追加されたり削除されたり、というのはちょっとよくわかりませんね。ただ、kubeletだけは引き続きエラーになっています。

f:id:kun432:20200512200534p:plain

これはkubernetesのバージョンが新しくなったことでkubeletで認証なしに使えていた10255ポートが廃止になったため、情報が取れないということのようです。いくつか対処法はあるようなのですが、私の環境だと以下にある通りkubeletの起動オプション--read-only-portを追加することでエラーを回避できました。根本解決ではないので微妙ですが、とりあえず。

起動オプションを追加

$ sudo vi /etc/default/kubelet
KUBELET_EXTRA_ARGS="--node-ip=10.240.0.11 --read-only-port=10255"

kubelet再起動します。本来ならdrainして一旦切り離すべきですが、まあテストなので。

$ sudo systemctl daemon-reload   ※多分いらないです
$ sudo systemctl restart kubelet

しばらく待ってると、kubeletの警告が消えました!

f:id:kun432:20200512210003p:plain

というかkubelet自体が消えてしまいました・・・なのですが、実はちゃんと問題は解決されています。datadog-agentのpodに対してkubectl exec で agent statusコマンドを実行すると、agentのステータスが確認できます。

datadog-agentのpodを確認します。

$ kubectl get pod -o wide
NAME                                                     READY   STATUS    RESTARTS   AGE    IP                NODE       NOMINATED NODE   READINESS GATES
datadog-monitoring-8phft                                 2/2     Running   0          152m   192.168.226.69    worker-1   <none>           <none>
datadog-monitoring-fzddq                                 2/2     Running   0          152m   192.168.219.68    master     <none>           <none>
datadog-monitoring-kube-state-metrics-75bc6f498c-74wfb   1/1     Running   0          154m   192.168.226.68    worker-1   <none>           <none>
datadog-monitoring-r8pkg                                 2/2     Running   0          151m   192.168.133.197   worker-2   <none>           <none>

datadog-agentのpodに対してagent statusコマンドを実行します。

$ kubectl exec -ti datadog-monitoring-r8pkg -- agent status
Defaulting container name to agent.
Use 'kubectl describe pod/datadog-monitoring-r8pkg -n default' to see all of the containers in this pod.
Getting the status from the agent.

===============
Agent (v7.19.0)
===============

  Status date: 2020-05-12 11:19:21.505410 UTC
  Agent start: 2020-05-12 08:47:50.332647 UTC
  Pid: 1
  Go Version: go1.13.8
  Python Version: 3.8.1
  Build arch: amd64
  Check Runners: 4
  Log Level: INFO
・・・

    kubelet (4.0.0)
    ---------------
      Instance ID: kubelet:d884b5186b651429 [OK]
      Configuration Source: file:/etc/datadog-agent/conf.d/kubelet.d/conf.yaml.default
      Total Runs: 492
      Metric Samples: Last Run: 181, Total: 23,526
      Events: Last Run: 0, Total: 0
      Service Checks: Last Run: 4, Total: 520
      Average Execution Time : 122ms
      Last Execution Date : 2020-05-12 11:57:32.000000 UTC
      Last Successful Execution Date : 2020-05-12 11:57:32.000000 UTC

・・・

ステータスがOKになっていますね。逆にエラーが起きていたときの状態はこんな感じでした。

    kubelet (4.0.0)
    ---------------
      Instance ID: kubelet:d884b5186b651429 [ERROR]
      Configuration Source: file:/etc/datadog-agent/conf.d/kubelet.d/conf.yaml.default
      Total Runs: 339
      Metric Samples: Last Run: 0, Total: 0
      Events: Last Run: 0, Total: 0
      Service Checks: Last Run: 0, Total: 0
      Average Execution Time : 0s
      Last Execution Date : 2020-05-12 11:19:17.000000 UTC
      Last Successful Execution Date : Never
      Error: Unable to detect the kubelet URL automatically.
      Traceback (most recent call last):
        File "/opt/datadog-agent/embedded/lib/python3.8/site-packages/datadog_checks/base/checks/base.py", line 820, in run
          self.check(instance)
        File "/opt/datadog-agent/embedded/lib/python3.8/site-packages/datadog_checks/kubelet/kubelet.py", line 291, in check
          raise CheckException("Unable to detect the kubelet URL automatically.")
      datadog_checks.base.errors.CheckException: Unable to detect the kubelet URL automatically.

これ、Infrastructure Listに出ていたメッセージと同じですね。こんな感じでagentの監視状態がDatadogに送信されているということがわかります。

etcdは引き続きエラーになっていますが、ちょっと一旦おいておきます。

ダッシュボード

せっかくデータが取れるようになったらグラフとか見たいですよね。ダッシュボード機能を見てみましょう

"Dashboards" -> "Dashboard List" をクリックします。

f:id:kun432:20200512211943p:plain

ダッシュボードの一覧が表示されますが、これ自分で作ったわけじゃなくて勝手に追加されてます!おそらく監視対象やIntegrationなどから最適なものをPresetから用意してくれるようなのですが、これはとても楽ちんです。

そしてkubernetesダッシュボードも用意されています。見てみましょう。

f:id:kun432:20200512212400p:plain

おお!やっぱりダッシュボードを見るとちょっとリッチ感ありますね!kubernetesのイベントや各podごとのリソース消費なども確認できます。

f:id:kun432:20200512212802p:plain

もちろん、ダッシュボードやグラフを1から作ることもできますし、PresetをCloneしてカスタマイズすることもできます。

監視設定と通知

最後は監視のキモである通知です。一定のしきい値を超えたらSlackに通知するというのをやってみましょう。

まず最初にSlack Integrationをインストールします。"Integrations" -> "Integraions" をクリックします。

f:id:kun432:20200512214834p:plain

Integrations画面が開いたら、検索フォームでSlackを検索し、”+Availabe" -> "+Install"をクリックします。

f:id:kun432:20200512215212p:plainf:id:kun432:20200512215218p:plain

Slackの設定画面が開いたら"Configuration"をクリックします。

f:id:kun432:20200512215415p:plain

"Add Account+"をクリックします。

f:id:kun432:20200512215704p:plain

Slackアカウントの設定画面が開きます。ここにSlackで作成したアカウント情報を設定することになりますので、先にSlack側で設定を行います。

f:id:kun432:20200512221018p:plain

Slack開いて通知を行いたいワークスペースのAppメニューから”Datadog"を検索し、"追加"をクリックします。

f:id:kun432:20200512220744p:plain

"Slackに追加"をクリックします。

f:id:kun432:20200512221844p:plain

"Add Datadog Integration"をクリックします。

f:id:kun432:20200512221850p:plain

Datadog Integrationが追加されました。少し下にスクロールして・・・

f:id:kun432:20200512221903p:plain

SlackのサービスフックURLが表示されますので、これをコピーします。

f:id:kun432:20200512221916p:plain

Datadogに戻って、サービスフックURLをSlack Account Hookにペーストします。Slack Account NameはSlackでのアカウント名と同じである必要はないので適当に入力します(Datadog側でアカウントを指定する際の名称です)。最後に"Save"をクリックします。

f:id:kun432:20200512222514p:plain

その下のところで、"Add Channel"をクリックして、通知を送るチャネルを設定します。今回は"#general"にしました。

f:id:kun432:20200512232022p:plain

これでSlack連携の設定が完了しました!では、監視項目の追加と通知設定を行いましょう。サイドメニューから"Monitors" -> "New Monitors"をクリックします。

f:id:kun432:20200512222723p:plain

監視設定の新規作成画面が開きます。いろいろな監視が行なえますが、今回はメトリクス監視で少しkubernetesに関連したメトリクスを選んでみたいと思います。

f:id:kun432:20200512223354p:plain

メトリクス監視追加画面が表示されます。順にやっていきましょう。

f:id:kun432:20200513000736p:plain

最初に異常を検知する基準の設定です。今回はしきい値を超えた場合を条件としますので、"Threshold Alert"を選択します。

f:id:kun432:20200512223751p:plain

メトリクスの設定です。色々細かく設定できますが、今回はrunning状態のpodの数をメトリクスとしましょう。"kubernetes.pod.running"を選択、runnningなpodの総数をチェックしたいので"Sum by"に変更します。

f:id:kun432:20200512232259p:plain

しきい値の設定です。現時点でpodは17個ほど上がっているのでそれを踏まえて、通常とは逆になるかもしれませんが、20を超えたらwarning、25を超えたらalertに設定します。

f:id:kun432:20200512235337p:plain

最後に通知先と通知メッセージを設定します。先に通知先を設定しましょう。リストの中から"slack-アカウント名-チャネル名"を選択します。これが先程設定したslackの通知先になります。

f:id:kun432:20200512233951p:plain

すると上のメッセージの中にSlackのメンションっぽい設定が入ったのがわかるでしょうか。これでSlackへ通知されるようになります。

f:id:kun432:20200512235649p:plain

通知本文は、Datadog独自のmarkdownのような形で設定します。ここはちょっと割愛しますが、alert/warn/normalなどパターンごとにかけるようです。

f:id:kun432:20200512235745p:plain

最後に"Save"して終了です。"Test Notification"でテスト通知ができますのでやってみましょう。

f:id:kun432:20200512235917p:plain

テスト通知を行う通知レベルを選択し、"Run Test"をクリックします。

f:id:kun432:20200513000136p:plain

Slackを見てみると、ちゃんと飛んでますね!グラフも表示されてるし、色もわかりやすいですね!

f:id:kun432:20200513000429p:plain

まとめ

ちょっとkubernetes監視というよりもDatadog入門っぽい感じになってしまいましたが、いろいろ便利そうというのは伝わったのではないでしょうか?

次回は、もう少しkubernetesの監視に特化した形でDatadogのいろんな機能を見ていく予定です。