Kubernetesの情報をDatadogで収集してみる
概要
こんにちは🙌
今回は、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を作成していきます。
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
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
を使ってインストールしてみます。
- まず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!⎈
-
空のdatadog-values.yamlファイルを作成します。
このファイルで指定しないパラーメータは、values.yaml がデフォルトで設定されます。 -
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
- datadog-values.yamlにパラメータを設定します。
datadog:
apiKeyExistingSecret: datadog-secret
site: ap1.datadoghq.com
logs:
enabled: true
containerCollectAll: true
- KubernetesクラスタにDatadog Agentをデプロイします。
# Cluster-Agentを高可用性にしろ という警告が出ますが、検証であれば無視してよいです。
$ helm install datadog-agent -f datadog-values.yaml datadog/datadog
これでDatadogからMinikubeの状態が見れるようになりました🙌
- インテグレーションを有効にしておきます。
インテグレーションとは、Datadogが提供する監視サービスを他のソフトウェアやサービスと連携させるための機能や手段のこととなります。インテグレーションを利用することで、インフラストラクチャーからすべてのメトリクスとログを収集して、統合システムを全体として把握することができるようになります。
有効化しておくことで、関連するメトリクスやログを自動的に収集し分析することができるようになるので、データを取り込む対象となるサービスは有効化しておきます。
実際にどんなことができるのかは、Overviewを見てもらった方が早いかと思います。
- Kubernetes
Metrics,Logを確認する
まずは、ダッシュボードから確認します。
インテグレーションを設置すると自動作成されるダッシュボードとなります。
コンテナごと情報を確認することができます。タブを切り替えることで、Resource Metrics、Logsと表示が切り替わります。
ここで、Nginxメトリクスで合計リクエスト数や接続数の情報が取れていないことが分かりました。なので、少し追加設定をしてさらなるメトリクスを取れるようにしてみます。
公式ドキュメント インテグレーション Nginx
まずは、Nginxのステータスを取得できるようにするモジュール/nginx_status
を設定します。
設定することによって、/nginx_status
で接続数の状態を取得できるようになります。
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にマウントするような記載を追加します。
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