DatadogをDaemonSetでデプロイする on GKE
はじめに
最近Kubernetesの勉強をしています。 Deploymentリソースはよく使うのですが、DaemonSetリソースは使う機会が少なかったため、本記事ではDaemonSetの利用例としてGKE+Datadogを紹介します。
- はじめに
- Datadogについて
- 【準備】GKE上にKubernetesClusterを作成
- Datadog-Agentの作成
- 【解説】Role Based Access Control(RBAC)とは
- 【解説】Datadog-Agentのデプロイ
- Datadog上で確認
- まとめ
- 参考文献
Datadogについて
Datadogはサーバなどのモニタリング(監視)ができるサービスです。 今回紹介する例ではすべてのNodeにDatadogを常駐させることで、モニタリングを実現しています。
各Nodeに必ずDatadogのPodが存在していないといけないため、DeploymentではなくDaemonSetというリソースが好ましいとされています。
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-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を紐付けています。
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の状態を確認することができます。
まとめ
今回はGKE上のNodeをDatadogでモニタリングする手順を解説しました。
Datadogを試すだけだとチュートリアルに従えばできますが、リソース周りは自分で調べて整理する必要があったので記事を書いてみました。
Kubernetesは覚えることが多いので今後も記事を書いていこうと思います。