🐶

Kubernetesの情報をDatadogで収集してみる

2024/02/19に公開

概要

こんにちは🙌
今回は、KubernetesクラスターでDatadog Agentを実行して、クラスタ、メトリクス、ログの収集ができるところまで確認してみます。

Minikubeを使ってローカル環境でKubernetesを実行し、NginxのログをDatadogにデータを連携します。

ゴール

  • Podに出力されるログをDatadogに送信ができること

環境

PC MacBook Pro 2023
チップ Apple M2 Pro
メモリ 32GB
OS macOS Ventura13.4
  • Minikubeは、既にインストールが完了していることを前提としています。
  • MinikubeのDriverには、Docker Desktopを利用します。
  • Datadogを利用するには、Sign upが必要となります。検証、学習で使うのであれば、14日の無料トライアルもあります。

Nginxを事前に準備する

Kubernetesマニフェストファイルの作成

KubernetesのDeploymentとServiceを作成していきます。

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

Kubernetesクラスターにマニフェストを適用して、デプロイします。

$ kubectl apply -f deployment.yaml
deployment.apps/nginx created

$ kubectl apply -f service.yaml
service/nginx created

アプリケーションの動作確認をしてみます。
NodePortがないとの出力がありますが、特に今回の検証において問題になるような部分ではないため、そのまま進めていきます。

$ minikube service nginx --url
😿  サービス default/nginx は NodePort がありません
http://127.0.0.1:55814
❗  Docker ドライバーを darwin 上で使用しているため、実行するにはターミナルを開く必要があります。
$ curl -I http://127.0.0.1:55814
HTTP/1.1 200 OK
Server: nginx/1.25.4
Date: Sat, 17 Feb 2024 10:58:55 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 14 Feb 2024 16:03:00 GMT
Connection: keep-alive
ETag: "65cce434-267"
Accept-Ranges: bytes

これでKubernetesクラスタの準備が整いましたので、Datadogと連携をしていきます!

Datadogエージェントを導入する

続いて、Datadogエージェントをインストールしていきます。
公式サイト手順を参考にしながら進めていきます。
Kubernetes に Datadog Agent をインストールする

公式の手順を見ると、インストール方法はいくつかオプションがあるようです。

Kubernetes に Datadog Agent をインストールするには、以下のオプションがあります。

  • Datadog Operator、Kubernetes Operator (推奨)
  • Helm
  • 手動インストール。Kubernetes 上の Datadog Agent を DaemonSet で手動でインストール、構成するを参照してください。

今回は、Helmを使ってインストールしてみます。

  1. まずHelmのDatadogリポジトリを追加してアップデートします。
$ helm repo add datadog https://helm.datadoghq.com
"datadog" 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 "datadog" chart repository
Update Complete. ⎈Happy Helming!
  1. 空のdatadog-values.yamlファイルを作成します。
    このファイルで指定しないパラーメータは、values.yaml がデフォルトで設定されます。

  2. DatadogのAPIキーを保存するKubernetes Secretを作成します。

# $DD_API_KEY は各自DatadogコンソールからAPIキーを取得して入れます。
$ kubectl create secret generic datadog-secret --from-literal api-key=$DD_API_KEY
secret/datadog-secret created
  1. datadog-values.yamlにパラメータを設定します。
datadog-values.yaml
datadog:
  apiKeyExistingSecret: datadog-secret
  site: ap1.datadoghq.com

  logs:
    enabled: true
    containerCollectAll: true
  1. KubernetesクラスタにDatadog Agentをデプロイします。
# Cluster-Agentを高可用性にしろ という警告が出ますが、検証であれば無視してよいです。
$ helm install datadog-agent -f datadog-values.yaml datadog/datadog

これでDatadogからMinikubeの状態が見れるようになりました🙌

  1. インテグレーションを有効にしておきます。
    インテグレーションとは、Datadogが提供する監視サービスを他のソフトウェアやサービスと連携させるための機能や手段のこととなります。インテグレーションを利用することで、インフラストラクチャーからすべてのメトリクスとログを収集して、統合システムを全体として把握することができるようになります。
    有効化しておくことで、関連するメトリクスやログを自動的に収集し分析することができるようになるので、データを取り込む対象となるサービスは有効化しておきます。

実際にどんなことができるのかは、Overviewを見てもらった方が早いかと思います。

  • Kubernetes

Metrics,Logを確認する

まずは、ダッシュボードから確認します。
インテグレーションを設置すると自動作成されるダッシュボードとなります。

コンテナごと情報を確認することができます。タブを切り替えることで、Resource Metrics、Logsと表示が切り替わります。

ここで、Nginxメトリクスで合計リクエスト数や接続数の情報が取れていないことが分かりました。なので、少し追加設定をしてさらなるメトリクスを取れるようにしてみます。
公式ドキュメント インテグレーション Nginx

まずは、Nginxのステータスを取得できるようにするモジュール/nginx_statusを設定します。
設定することによって、/nginx_statusで接続数の状態を取得できるようになります。

nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-conf
data:
  status.conf: |
    server {
      listen 81;

      location /nginx_status {
        stub_status on;
      }

      location / {
        return 404;
      }
    }

続いて、作成したConfigMapをNginx Podにマウントするような記載を追加します。

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
+     annotations:
+       ad.datadoghq.com/nginx.checks: |
+         {
+           "nginx": {
+             "init_config": {},
+             "instances": [
+               {
+                 "nginx_status_url":"http://%%host%%:81/nginx_status/"
+               }
+             ]
+           }
+         }
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
+       volumeMounts:
+       - name: nginx-conf-volume
+         mountPath: /etc/nginx/conf.d/status.conf
+         subPath: status.conf
+     volumes:
+     - name: nginx-conf-volume
+       configMap:
+         name: nginx-conf

変更を適用していきます。

$ kubectl apply -f nginx-configmap.yaml
configmap/nginx-conf created
$ kubectl apply -f deployment.yaml
deployment.apps/nginx configured

すると...Nginxダッシュボードでデータが取れていることが確認できました!!

おわりに

今回はMinikubeを使ってKubernetesの情報をDatadogで確認してみることを試してみました。
Datadogエージェントを使って簡単に設定することができました。

KubernetesのDatadog監視については以下の記事が概要と仕組みがとても丁寧に書いてあり参考になりました。
Monitoring Kubernetes with Datadog

本来であればアプリケーションを作ってAPMを確認したり、TerraformでDatadog設定を入れてみたり等してみたかったのですが、またの機会にしてみます。
ありがとうございました🙌

Discussion