DatadogをDaemonSetでデプロイする on GKE

はじめに

最近Kubernetesの勉強をしています。 Deploymentリソースはよく使うのですが、DaemonSetリソースは使う機会が少なかったため、本記事ではDaemonSetの利用例としてGKE+Datadogを紹介します。

Datadogについて

Datadogはサーバなどのモニタリング(監視)ができるサービスです。 今回紹介する例ではすべてのNodeにDatadogを常駐させることで、モニタリングを実現しています。

各Nodeに必ずDatadogのPodが存在していないといけないため、DeploymentではなくDaemonSetというリソースが好ましいとされています。

f:id:y-zumi:20190804205246j:plain
Worker Nodes に Datadog-Agent がデプロイされている状態

DaemonSetとは

DaemonSetはすべてのNodeにPodを配置するリソースです。以下のような特徴があります。

  • 各Nodeに1つずつPodが配置されることを保証します
  • Nodeに対して2つ以上のPodを配置することはできません
  • 新しいNodeが追加されるたびに、新しいPodをNodeに追加します
  • DaemonSetを削除した場合は、DaemonSetによって作成されたPodはすべて削除されます

DatadogでNodeを監視する場合は、各NodeにPodを作成しなければいけないので、DaemonSetとの相性が良いです。

【準備】GKE上にKubernetesClusterを作成

まず、GKE上にKubernetesClusterを作成します。

> gcloud container clusters create k8s \
  --cluster-version 1.12.8-gke.10 \
  --zone asia-northeast1-a \
  --num-nodes 3

Datadog-Agentの作成

Datadogのチュートリアルドキュメントに従って試していきます。
Datadogのアカウントがない場合は作成してください。

Datadog Get started

モニタリングをするためには、Datadog-Agentを各ノードにDeployする必要があります。
DatadogでNodeモニタリングするために必要なリソースは以下になります。

  • Role Based Access Controlに使用するリソース
    • ClusterRole
    • ServiceAccount
    • ClusterRoleBinding
  • DatadogのAPI_KEYを作成するリソース
    • Secret Generic
  • 各NodeにPodをデプロイするためのリソース
    • DaemonSet

それらを作成するコマンドは以下になります。

# Role Based Access Controlに使用するリソース
> kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/clusterrole.yaml"
> kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/serviceaccount.yaml"
> kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/clusterrolebinding.yaml"

# DatadogのAPI_KEYを作成するリソース
> kubectl create secret generic datadog-secret --from-literal api-key="<チュートリアルに記載されているKEYを入れてください>"

# 各NodeにPodをデプロイするためのリソース
> touch datadog-agent.yaml #チュートリアルにあるdatadog-agent.yamlをコピーする
> kubectl apply -f datadog-agent.yaml

次に、Role Based Access Controlについて簡単に説明していきます。

【解説】Role Based Access Control(RBAC)とは

RBACはアクセス制御をする方法の一つです。 ネットワークやリソースの制限をするRoleを各Userに割り当てることでアクセス制御を行っています。

RBACにはRole、User、RoleBindingの3つが使用されます。

  • Role
    • リソースやエンドポイントのアクセス権限の設定を記述します
  • User
    • ServiceAccountなどを指します
  • RoleBinding
    • Userに対して任意のRoleを紐付けてアクセス権限を付与します

以下の図では、DatadogとFluentdに特定のClusterRoleを紐付けています。

f:id:y-zumi:20190804205447j:plain
Role Based Access Control の簡易図

ClusterRoleの作成

> kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/clusterrole.yaml"
clusterrole.rbac.authorization.k8s.io/datadog-agent created

clusterrole.yamlをみてみると、rules内に利用できるリソースとそれに対する操作などが記述されていることがわかります。

piVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: datadog-agent
rules:
- apiGroups:
  - ""
  resources: # アクセスできるリソース一覧
  - services
  - events
  - endpoints
  - pods
  - nodes
  - componentstatuses
  verbs: # リソースに対して行うことができる操作
  - get
  - list
  - watch
# 省略

ServiceAccountの作成

> kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/serviceaccount.yaml"
serviceaccount/datadog-agent created

serviceaccount.yamlはシンプルでdatadog-agentという名前だけが定義されています。

kind: ServiceAccount
apiVersion: v1
metadata:
  name: datadog-agent
  namespace: default

ClusterRoleBindingの作成

> kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/clusterrolebinding.yaml"
clusterrolebinding.rbac.authorization.k8s.io/datadog-agent created

RoleBindingでServiceAccountにRoleを付与しています。
roleRefでRoleを指定し、subjectsで任意のUserを指定しています。Userは複数指定することが可能ですが、今回はdatadogだけでなので一つとなっています。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: datadog-agent
roleRef: # Roleの指定
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: datadog-agent
subjects: # Userの指定
- kind: ServiceAccount
  name: datadog-agent
  namespace: default

【解説】Datadog-Agentのデプロイ

Secret - Generic

デプロイする前に、API_KEYが必要なのでSecretを作成します。
今回は簡易的に--from-literalオプションでkubectlに直接値を渡して作成しています。

> kubectl create secret generic datadog-secret --from-literal api-key="<チュートリアルに記載されているKEYを入れてください>"
secret/datadog-secret created

DaemonSetによるデプロイ

> touch datadog-agent.yaml #チュートリアルにあるdatadog-agent.yamlをコピーする
> kubectl apply -f datadog-agent.yaml
daemonset.extensions/datadog-agent created

datadog-agent.yaml公式ドキュメントにあります。
datadog-agent.yamlはDaemonSetを使用しており、ServiceAccountとSecretを指定しています。

apiVersion: extensions/v1beta1
kind: DaemonSet # DeploymentではなくDaemonSetで作成
metadata:
  name: datadog-agent
spec:
  template:
    metadata:
      labels:
        app: datadog-agent
      name: datadog-agent
    spec:
      serviceAccountName: datadog-agent # Roleでアクセス権限を設定したServiceAccount
      containers:
      - image: datadog/agent:latest
        env:
          - name: DD_API_KEY
            valueFrom:
              secretKeyRef:
                name: datadog-secret # 作成したSecretのname
                key: api-key
# 省略

以上の操作でDatadogでモニタリングをするために必要な作業は完了しました。 最後にDatadogにログインしてNodeの状態を確認しましょう。

Datadog上で確認

Dashboard -> Kubernetes Overview でNodeの状態を確認することができます。

f:id:y-zumi:20190804230909p:plain
datadogによるmonitoring

まとめ

今回はGKE上のNodeをDatadogでモニタリングする手順を解説しました。
Datadogを試すだけだとチュートリアルに従えばできますが、リソース周りは自分で調べて整理する必要があったので記事を書いてみました。

Kubernetesは覚えることが多いので今後も記事を書いていこうと思います。

参考文献

Datadog Get started

Kubernetes 完全ガイド

kubernetes.io