EKS on Fargate で ADOT を使った Container Insights モニタリングをしてみた

# はじめに

EKS には、EKS 上で稼働するコンテナなどのメトリクス情報を可視化する Container Insights という機能があります。Container Insights は、以前は EKS on Fargate で利用が出来ませんでしたが、 2022 年のアップデートで利用できるようになりました。Container Insights で、可視化ダッシュボードが用意されており、簡単に使い始められます。EKS のメトリクス取得で検討されている方は、Container Insights を検討されても良いとおもいます。

詳細が気になる方は次のブログを参照ください。

詳細ブログ : https://aws.amazon.com/jp/blogs/news/introducing-amazon-cloudwatch-container-insights-for-amazon-eks-fargate-using-aws-distro-for-opentelemetry/



# Container Insights で何が見えるの？

いくつか可視化ダッシュボード画面を抜粋します。

EKS クラスターの中で、どのような Pod が稼働しているのか可視化できます。この可視化の中で、より深くメトリクスを確認したい Pod を選択することで、詳細画面に移動できます。

![image-20221130010209267.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d0c13989-237e-707d-95e6-ff379db1e573.png)



メトリクスの詳細画面では、Cluster 単位、Service 単位、Pod 単位といったメトリクスを確認可能です。次のスクリーンショットは、Pod 単位でのメトリクスを表示している画面です。CPU, Memory,Network といったメトリクスが見えます。

右側にあるフィルターで、どの Pod を表示したいかフィルターが出来るので、Deployment 単位といった形で表示を制御することも出来ます。

![image-20221130010541868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c79c27fc-b0db-e487-dfa0-07bbe3c2783e.png)



この Container Insights は、とても簡単に始められます。今回の記事では、EKS on Fargate 環境で Container Insights を有効化する手順を紹介します。



# IRSA を有効化

EKS on Fargate で Conainter Insights を利用するためには、EKS 上で ADOT Collector (StatefulSet など) を動かす必要があります。ADOT Collector は EKS 上で動くため、パフォーマンスログイベントを CloudWatch に送信するための IAM アクセス許可が必要です。これは、EKS でサポートされている IAM Roles for Service Accounts (IRSA) 機能を使って、Kubernetes のサービスアカウント (Service Account) を IAM ロールに関連付けることで実現します。



IRSA が無効化されている場合は、有効化をしていきます。有効化するために、Linux Shell 上で以下の環境変数を設定します。

```
CLUSTER_NAME=eks-fargate-124
REGION=ap-northeast-1
SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights
SERVICE_ACCOUNT_NAME=adot-collector
SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role
SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
```



aws eks describe-cluster コマンドを実行して、`alpha.eksctl.io/cluster-oidc-enabled` が false となっている場合は、有効化の作業が必要です。

```
$ aws eks describe-cluster --name eks-fargate-124 | grep -i cluster-oidc-enabled
            "alpha.eksctl.io/cluster-oidc-enabled": "false",
```



次のコマンドで有効化ができます。eksctl の導入は、[こちら](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eksctl.html) のドキュメントをご確認ください。

```
eksctl utils associate-iam-oidc-provider \
--cluster=$CLUSTER_NAME \
--approve
```



実行例

```
$ eksctl utils associate-iam-oidc-provider \
> --cluster=$CLUSTER_NAME \
> --approve
2022-11-29 23:21:56 [ℹ]  will create IAM Open ID Connect provider for cluster "eks-fargate-124" in "ap-northeast-1"
2022-11-29 23:21:56 [✔]  created IAM Open ID Connect provider for cluster "eks-fargate-124" in "ap-northeast-1"
```



変更作業によって、true に変わっています。

```
$ aws eks describe-cluster --name eks-fargate-124 | grep -i cluster-oidc-enabled
            "alpha.eksctl.io/cluster-oidc-enabled": "true",
```



次に、`adot-collector` という名前の Kubernetes 上のサービスアカウントを作成を作成します。

```
eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--region=$REGION \
--name=$SERVICE_ACCOUNT_NAME \
--namespace=$SERVICE_ACCOUNT_NAMESPACE \
--role-name=$SERVICE_ACCOUNT_IAM_ROLE \
--attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \
--approve
```



実行例

```
$ eksctl create iamserviceaccount \
> --cluster=$CLUSTER_NAME \
> --region=$REGION \
> --name=$SERVICE_ACCOUNT_NAME \
> --namespace=$SERVICE_ACCOUNT_NAMESPACE \
> --role-name=$SERVICE_ACCOUNT_IAM_ROLE \
> --attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \
> --approve
2022-11-29 23:24:33 [ℹ]  1 iamserviceaccount (fargate-container-insights/adot-collector) was included (based on the include/exclude rules)
2022-11-29 23:24:33 [!]  serviceaccounts that exist in Kubernetes will be excluded, use --override-existing-serviceaccounts to override
2022-11-29 23:24:33 [ℹ]  1 task: { 
    2 sequential sub-tasks: { 
        create IAM role for serviceaccount "fargate-container-insights/adot-collector",
        create serviceaccount "fargate-container-insights/adot-collector",
    } }2022-11-29 23:24:33 [ℹ]  building iamserviceaccount stack "eksctl-eks-fargate-124-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2022-11-29 23:24:33 [ℹ]  deploying stack "eksctl-eks-fargate-124-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2022-11-29 23:24:33 [ℹ]  waiting for CloudFormation stack "eksctl-eks-fargate-124-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2022-11-29 23:25:03 [ℹ]  waiting for CloudFormation stack "eksctl-eks-fargate-124-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2022-11-29 23:25:37 [ℹ]  waiting for CloudFormation stack "eksctl-eks-fargate-124-addon-iamserviceaccount-fargate-container-insights-adot-collector"
2022-11-29 23:25:37 [ℹ]  created namespace "fargate-container-insights"
2022-11-29 23:25:37 [ℹ]  created serviceaccount "fargate-container-insights/adot-collector"
```



# Fargate Profile の作成

ADOT Collector が作成される Namespace は、`fargate-container-insights` です。この名前の Fargate Profile が無い場合は作成します。

EKS のマネージメントコンソール上で、Add Farfate profile を押します。

![image-20221129234719846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/798f09c0-3b4f-541b-5562-541ce7027e57.png)



適当に名前を指定します

![image-20221129234856204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/45e04cd1-13a0-4b8b-63bf-88450947276d.png)



ワイルドカードが利用できるようになったので、これを指定します。環境に合わせて変更してください。

![image-20221129234924972.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bdc2ad31-e082-e48b-c043-73a48f755849.png)



Create を押します。

![image-20221129234948287.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/397d395d-4fc0-0d93-9112-2c51479f5583.png)



一定時間後、作成されました。

![image-20221129235143164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f43b601b-1979-3688-9b85-72520de110bc.png)



# ADOT Collector のデプロイ

一番大事な作業の、ADOT Collector のデプロイを行います。以下の記事に書かれている通りに進めます。

https://aws-otel.github.io/docs/getting-started/container-insights/eks-fargate#deploying-adot-collector-to-eks-fargate



ADOT Collector を構成する StatefulSet や Service, Config Map などが定義されているマニフェストファイルをダウンロードします。

```
wget https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml
```



マニフェストファイルから、以下の 3 点を置換します。

EKS クラスター名を指定します。この記事では、`eks-fargate-124` という名前の EKS クラスターです。

```
sed -i -e 's/YOUR-EKS-CLUSTER-NAME"/eks-fargate-124"/g' otel-fargate-container-insights.yaml
```



リージョン名を変更します。

```
sed -i -e 's/region: us-east-1/region: ap-northeast-1/g' otel-fargate-container-insights.yaml
```



以下の GitHub の Issue に書かれている対応が必要です。この変更をしないと次のエラーが発生して、ADOT Collector がデプロイできませんでした。

> failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting cgroup config for procHooks process: failed to write "200000": write /sys/fs/cgroup/cpu,cpuacct/kubepods/burstable/poda2a431bd-6e17-4d55-8553-042592386b5c/adot-collector/cpu.cfs_quota_us: invalid argument: unknown

https://github.com/aws-observability/aws-otel-collector/issues/1487

変更前

```
          resources:
            limits:
              cpu: 2
              memory: 2Gi
            requests:
              cpu: 200m
              memory: 400Mi
```



変更後

```
            limits:
              cpu: "500m"
              memory: "1024Mi"
            requests:
              cpu: "500m"
              memory: "1024Mi"
```





変更作業が終わったので、デプロイを行います。

```
kubectl apply -f otel-fargate-container-insights.yaml
```



実行例

```
> kubectl apply -f otel-fargate-container-insights.yaml
clusterrole.rbac.authorization.k8s.io/adotcol-admin-role created
clusterrolebinding.rbac.authorization.k8s.io/adotcol-admin-role-binding created
configmap/adot-collector-config created
service/adot-collector-service created
statefulset.apps/adot-collector created
```



namespace を `fargate-container-insights` に切り替えます。

```
> kubectl ns fargate-container-insights
```



Pod が作成されている様子がわかります。

```
> kubectl get pods -o wide
NAME               READY   STATUS              RESTARTS   AGE   IP       NODE                                                     NOMINATED NODE   READINESS GATES
adot-collector-0   0/1     ContainerCreating   0          55s   <none>   fargate-ip-10-0-102-18.ap-northeast-1.compute.internal   <none>           <none>
```



Deploy されました。

```
> kubectl get pods -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP             NODE                                                      NOMINATED NODE   READINESS GATES
adot-collector-0   1/1     Running   0          55s   10.0.101.225   fargate-ip-10-0-101-225.ap-northeast-1.compute.internal   <none>           <none>
```



# 適当なコンテナを動かす

メトリクスを取得するために、適当な Deployment を動かします。

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webapp
      role: webapp-service
  template:
    metadata:
      labels:
        app: webapp
        role: webapp-service
    spec:
      containers:
        - name: go
          image: public.ecr.aws/awsvijisarathy/prometheus-webapp:latest
          imagePullPolicy: Always
          resources:
            requests:
              cpu: "256m"
              memory: "512Mi"
            limits:
              cpu: "256m"
              memory: "512Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: service-clb
  namespace: default
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
  selector:
    app: webapp

```



apply します。

```
kubectl apply -f deployment.yaml
```



# Container Insights を確認

ここまでで、設定が完了しました。実際に Container Insights の画面をみてみましょう。CloudWatch の画面から、Container Insights を選択します。

![image-20221130010032158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e8eef3f6-03a8-3ad0-7f24-3c07a8866e20.png)



EKS の中で、どこの namespace にどんな Pod が稼働しているか、わかります。

![image-20221130010209267.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f33ec806-175e-1ada-6f21-25414c724450.png)



Performance monitoring の画面では、EKS Cluster 単位のでメトリクスがわかります。

![image-20221130010405226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/12804238-8b13-c097-109e-bf83a5da1099.png)



プルダウンから、EKS Pods を選ぶことで、Pod 単位のメトリクスを確認可能。また、右側にあるフィルターで、どの Pod を表示したいかフィルターが出来ます。Deployment 単位など、自由にコントロールが可能です。

![image-20221130010541868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/422a02c0-85fc-68bc-bddd-94188d52758e.png)



# 検証のなかでわかったこと

- Container Insights の中で、Deployment 単位での可視化は、ドロップダウンで選択できない
  - その代わり、Service 単位や、Pods 単位の可視化が可能。
  - Pod の表示にはフィルター機能があり、これで Deployment 単位で可視化することで見やすくなる
![image-20221130010458912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/286f846c-f144-3407-3c13-2c400d0c0e63.png)



# 参考 URL

https://aws.amazon.com/jp/blogs/news/introducing-amazon-cloudwatch-container-insights-for-amazon-eks-fargate-using-aws-distro-for-opentelemetry/

https://aws-otel.github.io/docs/getting-started/container-insights/eks-fargate#deploying-adot-collector-to-eks-fargate