引き続き自分用メモです。
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
ログインするとこんな画面が表示されてます。(新規アカウントの場合は最初にチュートリアルっぽい画面が出たはずですが、もう思い出せない・・・多分やることはそんなに変わらないはずなので良しなに読んでいただけると助かります)
サイドバーから"Integrations"をクリックします。
色々出てきますが、上の検索フォームで"kubernetes"を検索すると出てきますので、"+Available"にカーソルを合わせると、
"+Install"に変わるのでクリックします。
Kubernetes Integrationの説明が表示されます。Configurationのタブをクリックします。
Configurationタブの一番下にある"Install Integration"をクリックします。
インストールされました。もう一度"+Install"をクリックします。
Configurationタブが表示されますので、その中にある"Instructions"リンクをクリックします。
新しいウインドウで、セットアップ手順が表示されますのでこれに従ってkubernetesクラスタ側で設定を行います。ちなみにこの手順の中にAPIキーが含まれていますのでご注意ください。
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"をクリックします。
worker-1/2が見えていますね。試しにworker-1をクリックします。(muteになっているのがテストで試していたからです。気にしないでください。)
すでにworker-1のグラフができていますね!
が、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のところが増えてますね。
で、masterも取れたのはいいのですが、Appsのところのmasterのetcdやworkerのkubeletがエラーになっているようです。これは手元の環境にもよるかもしれません。
しばらく見ているとなぜかetcdは消えてしまいました。etcd自体はmasterで動いているのですが、このあたり自動で追加されたり削除されたり、というのはちょっとよくわかりませんね。ただ、kubeletだけは引き続きエラーになっています。
これは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の警告が消えました!
というか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" をクリックします。
ダッシュボードの一覧が表示されますが、これ自分で作ったわけじゃなくて勝手に追加されてます!おそらく監視対象やIntegrationなどから最適なものをPresetから用意してくれるようなのですが、これはとても楽ちんです。
そしてkubernetesのダッシュボードも用意されています。見てみましょう。
おお!やっぱりダッシュボードを見るとちょっとリッチ感ありますね!kubernetesのイベントや各podごとのリソース消費なども確認できます。
もちろん、ダッシュボードやグラフを1から作ることもできますし、PresetをCloneしてカスタマイズすることもできます。
監視設定と通知
最後は監視のキモである通知です。一定のしきい値を超えたらSlackに通知するというのをやってみましょう。
まず最初にSlack Integrationをインストールします。"Integrations" -> "Integraions" をクリックします。
Integrations画面が開いたら、検索フォームでSlackを検索し、”+Availabe" -> "+Install"をクリックします。
Slackの設定画面が開いたら"Configuration"をクリックします。
"Add Account+"をクリックします。
Slackアカウントの設定画面が開きます。ここにSlackで作成したアカウント情報を設定することになりますので、先にSlack側で設定を行います。
Slack開いて通知を行いたいワークスペースのAppメニューから”Datadog"を検索し、"追加"をクリックします。
"Slackに追加"をクリックします。
"Add Datadog Integration"をクリックします。
Datadog Integrationが追加されました。少し下にスクロールして・・・
SlackのサービスフックURLが表示されますので、これをコピーします。
Datadogに戻って、サービスフックURLをSlack Account Hookにペーストします。Slack Account NameはSlackでのアカウント名と同じである必要はないので適当に入力します(Datadog側でアカウントを指定する際の名称です)。最後に"Save"をクリックします。
その下のところで、"Add Channel"をクリックして、通知を送るチャネルを設定します。今回は"#general"にしました。
これでSlack連携の設定が完了しました!では、監視項目の追加と通知設定を行いましょう。サイドメニューから"Monitors" -> "New Monitors"をクリックします。
監視設定の新規作成画面が開きます。いろいろな監視が行なえますが、今回はメトリクス監視で少しkubernetesに関連したメトリクスを選んでみたいと思います。
メトリクス監視追加画面が表示されます。順にやっていきましょう。
最初に異常を検知する基準の設定です。今回はしきい値を超えた場合を条件としますので、"Threshold Alert"を選択します。
メトリクスの設定です。色々細かく設定できますが、今回はrunning状態のpodの数をメトリクスとしましょう。"kubernetes.pod.running"を選択、runnningなpodの総数をチェックしたいので"Sum by"に変更します。
しきい値の設定です。現時点でpodは17個ほど上がっているのでそれを踏まえて、通常とは逆になるかもしれませんが、20を超えたらwarning、25を超えたらalertに設定します。
最後に通知先と通知メッセージを設定します。先に通知先を設定しましょう。リストの中から"slack-アカウント名-チャネル名"を選択します。これが先程設定したslackの通知先になります。
すると上のメッセージの中にSlackのメンションっぽい設定が入ったのがわかるでしょうか。これでSlackへ通知されるようになります。
通知本文は、Datadog独自のmarkdownのような形で設定します。ここはちょっと割愛しますが、alert/warn/normalなどパターンごとにかけるようです。
最後に"Save"して終了です。"Test Notification"でテスト通知ができますのでやってみましょう。
テスト通知を行う通知レベルを選択し、"Run Test"をクリックします。
Slackを見てみると、ちゃんと飛んでますね!グラフも表示されてるし、色もわかりやすいですね!
まとめ
ちょっとkubernetes監視というよりもDatadog入門っぽい感じになってしまいましたが、いろいろ便利そうというのは伝わったのではないでしょうか?
次回は、もう少しkubernetesの監視に特化した形でDatadogのいろんな機能を見ていく予定です。