EKSにDatadog Agentインストール

セルフマネージド型ノード（EC2）のKubernetesをDatadogで監視する際に必要なAgentのインストール手順を記します。
Kubernetesあんまり分からない人向けです。
※[kubectlの概要](https://kubernetes.io/ja/docs/reference/kubectl/overview/)と使い方、[Kubernetesのコンポーネント](https://kubernetes.io/ja/docs/concepts/overview/components/)が各々どんな役割を持つかざっくり理解できている程度

# インストールするサービス
- Datadog Agent（Datadog Node Agent）
 - 必須です。DaemonSetとして全てのノードで稼働し、各ノードでメトリクスを収集します。
- Datadog Cluster Agent
 - 下構成図のような形で負荷の軽減と権限の最小化が可能です。
- [kube-state-metrics](https://github.com/kubernetes/kube-state-metrics)
 - Datadog Agentでは取得できないクラスター状態メトリクスを生成します。

![kubernetes_diagrams_after_181012v2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/7b4c62eb-a51d-ea61-a2c7-04eb8eafe454.jpeg)
>[Datadog Cluster Agent のご紹介 | Datadog](https://www.datadoghq.com/ja/blog/datadog-cluster-agent/)より引用

# インストール方法について
## DaemonSet
kubectlを用いて必要なリソース一つ一つのマニフェストを適用します。
RBACのRole, シークレット, Datadog Node Agent, Datadog Cluster Agent, kube-state-metricsを個別に直接デプロイします。

## Helm
KubernetesパッケージマネージャーのHelmを用います。
デフォルトのチャート設定で必要なリソースが一括デプロイされます。
こちらの方が非常に簡単にインストールできます。[Datadog サイト](https://app.datadoghq.com/account/settings#agent/kubernetes)に記載されているKubernetes へのインストール手順もこちらです。
本稿でもHelmを用います。

# 環境

操作端末とセルフマネージド型ワーカーノードのOSはAmazonLinux2です。
EKSのクラスター等はeksctlで作成したリソースを使用しました。
kubectlで必要な操作の為にkubeconfig設定やRBAC認可を受けた状態にしてください。（eksctlでクラスターを作成した端末と同じなら考慮不要）

```shell-session:操作端末環境
$ uname -a
Linux ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal 4.14.231-173.361.amzn2.x86_64 #1 SMP Mon Apr 26 20:57:08 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ kubectl version --short --client
Client Version: v1.19.6-eks-49a6c0
```

# 手順
## Helmをインストール

```console
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
Downloading https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm

$ helm version
version.BuildInfo{Version:"v3.6.0", GitCommit:"7f2df6467771a75f5646b7f12afb408590ed1755", GitTreeState:"clean", GoVersion:"go1.16.3"}
```

## 設定ファイル作成
[Datadogが公開しているデフォルト設定が記載されたHelmのチャートファイル](https://github.com/DataDog/helm-charts/blob/master/charts/datadog/values.yaml)をダウンロードします。

```console
$ curl -O https://raw.githubusercontent.com/DataDog/helm-charts/master/charts/datadog/values.yaml
```

## Helmリポジトリ追加
Helm Datadog リポジトリおよび Helm 安定版リポジトリ (Kube State Metrics チャート用) を追加します。

```console
$ helm repo add datadog https://helm.datadoghq.com
"datadog" has been added to your repositories
$ helm repo add stable https://charts.helm.sh/stable
"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 "datadog" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
```

## インストール実行
[Datadog サイト](https://app.datadoghq.com/account/settings#api)でAPIキーを取得します。
（Datadog サイトの[Integrasions＞Agent＞kubernetes](https://app.datadoghq.com/account/settings#agent/kubernetes)にもコピペできるインストールコマンドの記載があります。）
![2021-06-03_12h25_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/2c65e828-c8b6-ba5f-9ead-ad4f259fd69f.png)

以下インストールコマンド内の

- `RELEASE_NAME`を適当な名前で置き換えます。(例えば`datadog`へ)
- `DATADOG_API_KEY`を先程取得したAPIキーで置き換えます。
- `TARGET_SYSTEM`をワーカーノードのOSプラットフォーム名（`linux`または`windows`）で置き換えます。※デフォルトlinuxなので、linuxなら指定自体不要

```console:インストールコマンド
helm install <RELEASE_NAME> -f values.yaml --set datadog.apiKey=<DATADOG_API_KEY> datadog/datadog --set targetSystem=<TARGET_SYSTEM>
```

インストールします。

```console
$ helm install datadog -f values.yaml --set datadog.apiKey=abcdefghijklmnopqrstuvwxyz1234567890 datadog/datadog
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/ec2-user/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/ec2-user/.kube/config
NAME: datadog
LAST DEPLOYED: Thu Jun  3 03:08:46 2021
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
```

# 確認
Datadog Cluster Agentとkube-state-metricsのPodが一つと、各ワーカーノード上でDatadog AgentのPodがDaemonSetとして１つづつ起動できていればOKです。

```shell-session
$ kubectl get all
NAME                                              READY   STATUS    RESTARTS   AGE
pod/datadog-cluster-agent-7cf7c4c9db-tcd4r        1/1     Running   0          75s
pod/datadog-fkmmn                                 2/2     Running   0          75s
pod/datadog-j259t                                 2/2     Running   0          75s
pod/datadog-kube-state-metrics-699964c777-g8ktf   1/1     Running   0          75s

NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/datadog-cluster-agent        ClusterIP   10.100.215.13   <none>        5005/TCP   75s
service/datadog-kube-state-metrics   ClusterIP   10.100.99.35    <none>        8080/TCP   75s
service/kubernetes                   ClusterIP   10.100.0.1      <none>        443/TCP    100m

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/datadog   2         2         2       2            2           kubernetes.io/os=linux   76s

NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/datadog-cluster-agent        1/1     1            1           76s
deployment.apps/datadog-kube-state-metrics   1/1     1            1           76s

NAME                                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/datadog-cluster-agent-7cf7c4c9db        1         1         1       76s
replicaset.apps/datadog-kube-state-metrics-699964c777   1         1         1       76s
```

##Eventsから
1. [Datadog サイト](https://app.datadoghq.com/)へログイン
1. 画面左ナビバーの「Events」をクリック
1. 各ワーカーノードインスタンス分のDatadog Agent has startedイベントとDatadog Cluster Agentイベントが一つあればOK

![2021-06-03_16h55_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/8d8b1b64-ee7f-e0e2-07b9-f5ace4a5cf67.png)

##Infrastructure Listから
1. [Datadog サイト](https://app.datadoghq.com/)へログイン
1. 画面左ナビバーの「Infrastructure」＞「Infrastructure List」をクリック
1. ワーカーノードインスタンスのStatus列左部にDatadog Agentの骨のようなアイコンが表示されていればOK
![2021-06-03_17h01_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269716/ca254d08-22b0-bfdb-f54a-c1346a1d7c66.png)

# アンインストール
インストールしたDatadog Agentをアンインストールしたい場合は`RELEASE_NAME`を指定して`helm uninstall`コマンドを実行してください。

```
$ helm uninstall datadog
```

# 参考
[Kubernetes クラスターで Datadog Agent を実行する](https://docs.datadoghq.com/ja/agent/kubernetes/?tab=helm)


https://v3.helm.sh/docs/intro/install/

https://github.com/helm/helm

https://github.com/DataDog/helm-charts/tree/master/charts/datadog

https://www.datadoghq.com/ja/blog/datadog-cluster-agent/

https://github.com/kubernetes/kube-state-metrics