Amazon EKS のチュートリアルで Kubernetes を理解する #05 Container Insights

# はじめに

本記事は、以下の内容の続きになります。

- [Amazon EKS のチュートリアルで Kubernetes を理解する #04 セルフヒーリング](https://qiita.com/takanorig/items/8905cc86340223bc3922)

前回は、k8s自体の特長のひとつである 「セルフヒーリング（自己回復）」 の動作を確認しました。
今回は、運用を想定して、ログやメトリクスの管理について確認します。

Amazon EKS の場合、 **CloudWatch Container Insights** を利用して、コンテナのログやメトリクスを、CloudWatchに集約することができます。
**CloudWatch Container Insights** は、Amazon EKS 専用のサービスではなく、Amazon ECS 含め、AWSのコンテナ関連のサービスにおけるコンテナのログやメトリクスを管理するために利用されます。

以下に、**CloudWatch Container Insights** の説明が書かれています。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ContainerInsights.html

>CloudWatch Container Insights を使用して、コンテナ化されたアプリケーションとマイクロサービスのメトリクスとログを収集、集計、要約します。Container Insights は Amazon Elastic Container Service、Amazon Elastic Kubernetes Service、および Amazon EC2 の Kubernetes プラットフォームで利用できます。このメトリクスには、CPU、メモリ、ディスク、ネットワークなどのリソース使用率が含まれます。Container Insights では、問題の迅速な特定と解決に役立つ、コンテナの再起動失敗などの診断情報も提供されます。また、Container Insights が収集するメトリクスには CloudWatch アラームを設定できます。


# Container Insights のセットアップ

## ワーカーノードのIAMロールへのポリシー設定

最初に、k8sクラスタでワーカーノードとして動作しているECインスタンスに対して、**「CloudWatchAgentServerPolicy」**のポリシーを追加します。

![amazon-eks-dev08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/13871e5e-0d75-db3a-8540-77015c207aea.jpeg)

ワーカーノードとして動作しているECインスタンスのIAMロールの確認、および、ポリシーの設定の詳細は、以下のページを参照してください。

- [前提条件の確認](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-prerequisites.html)


## Container Insights の利用準備

Container Insights を利用するためには、以下のセットアップを行うことになります。

- CloudWatchにメトリクスを送信するために、CloudWatchエージェントをDaemonSetとして登録する。
- CloudWatchLogsにログを送信するために、FluentDをDaemonSetとして登録する。

これらを個別に登録することも可能なのですが、AWS Samplesのリポジトリに、両方をまとめて登録できるマニフェストがあるので、今回はそれを利用します。
クラスタ名（```{{cluster_name}}```）と、AWSリージョン名（```{{region_name}}```）を指定する必要があるので、以下のように、マニフェストファイルを一度ダウンロードして、内容の一部を置換します。

```
$ curl -o cwagent-fluentd-quickstart-template.yaml https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-yaml-templates/quickstart/cwagent-fluentd-quickstart.yaml

$ sed "s/{{cluster_name}}/dev/;s/{{region_name}}/us-west-2/" cwagent-fluentd-quickstart-template.yaml > cwagent-fluentd-quickstart.yaml
```

その上で、CloudWatchエージェントとFluentDを、DaemonSetとして登録します。

```
$ kubectl apply -f cwagent-fluentd-quickstart.yaml
namespace/amazon-cloudwatch created
serviceaccount/cloudwatch-agent created
clusterrole.rbac.authorization.k8s.io/cloudwatch-agent-role created
clusterrolebinding.rbac.authorization.k8s.io/cloudwatch-agent-role-binding created
configmap/cwagentconfig created
daemonset.apps/cloudwatch-agent created
configmap/cluster-info created
serviceaccount/fluentd created
clusterrole.rbac.authorization.k8s.io/fluentd-role created
clusterrolebinding.rbac.authorization.k8s.io/fluentd-role-binding created
configmap/fluentd-config created
daemonset.apps/fluentd-cloudwatch created
```

## Container Insights の動作確認

CloudWatchエージェントとFluentDが、DaemonSetとして登録されると、自動で、ログやメトリクスの収集が始まります。

|![amazon-eks-dev09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/8d33b825-4773-c466-7c74-af122155f952.jpeg)|
|---|

CloudWatchのログストリームを確認すると、ノードごとにログストリームが生成されていることが分かります。


|![amazon-eks-dev10_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/9627c859-88d5-f0a4-197e-ad0505ca1a64.jpeg)|
|---|

CloudWatchのメニューから **「ログ」 > 「インサイト」** をクリックし、クエリを実行すると、
ワーカーノードから収集されたログの内容を確認することができます。

|![amazon-eks-dev11_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/a9da4a82-bd8c-2c97-513a-6710c01f72ee.jpeg)|
|---|


また、CloudWatchのトップ画面で、Container Insights の内容を確認すると、
メトリクスも収集されていることが分かります。

## メトリクス

Amazon EKS で収集できるメトリクスは、以下のページから確認できます。

- [Amazon EKS および Kubernetes Container Insights のメトリクス](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-EKS.html)

Node、もしくは、Pod 単位で、CPU使用率やメモリ使用量を取得できたりするようです。

# まとめ

CloudWatchエージェントとFluentDを利用して、CloudWatchに、ログやメトリクス情報も集約できることが確認できました。
これによって、アラートなども簡単に設定することができるようになります。

# 参考
- https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-prerequisites.html
- https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-EKS-quickstart.html