Amazon EKS on Fargate　ADOT でメトリクスを取得

# Fargate でメトリクスを取得するには

AWS Distro for OpenTelemetry (ADOT) を使用する。


# 仕組み

以下のページで紹介されている「Design of Container Insights support in ADOT Collector for EKS Fargate」のような仕組みのようである。

https://aws-otel.github.io/docs/getting-started/container-insights/eks-fargate


# 取得されるメトリクス

- pod_cpu_utilization_over_pod_limit
- pod_cpu_usage_total
- pod_cpu_limit
- pod_memory_utilization_over_pod_limit
- pod_memory_working_set
- pod_memory_limit
- pod_network_rx_bytes
- pod_network_tx_bytes

# 作成されるディメンション

- ClusterName, LaunchType
- ClusterName, Namespace, LaunchType
- ClusterName, Namespace, PodName, LaunchType


# Demo

## 1. fargateProfiles の作成

ここでは、fargate-default と fargate-container-insights の 2 つのプロファイルを作成しています。

```ClusterConfig.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: cluster-demo
  region: ap-northeast-1
  version: "1.27"

iam:
  withOIDC: true

fargateProfiles:
  - name: fargate-default
    selectors:
      - namespace: default
      - namespace: kube-system
  - name: fargate-container-insights
    selectors:
      - namespace: fargate-container-insights
```

## 2. ADOT Collector に CloudWatch に送信するための IAM を付与する

ADOT Collector には、パフォーマンスログイベントを CloudWatch に送信するために IAM 権限が必要です。

これは、Kubernetes のサービスアカウントを IAM ロールに関連付けることで実現します。

※ サービスアカウントとは、[こちら](https://qiita.com/leomaro7/items/416f6dee4ab3b0b31550) のページでも紹介している通り、Pod 単位で IAM ロールを割り当てるものです。

そして、IAM ロールには、 `CloudWatchAgentServerPolicy` をアタッチします。

```
eksctl create iamserviceaccount \
--cluster=cluster-demo \
--region=ap-northeast-1 \
--name=adot-collector \
--namespace=fargate-container-insights \
--role-name=EKS-Fargate-ADOT-ServiceAccount-Role \
--attach-policy-arn=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
--approve
```

Kubernetes のサービスアカウントを確認

```
kubectl describe sa adot-collector  -n fargate-container-insights

Name:                adot-collector
Namespace:           fargate-container-insights
Labels:              app.kubernetes.io/managed-by=eksctl
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/EKS-Fargate-ADOT-ServiceAccount-Role
Image pull secrets:  <none>
Mountable secrets:   <none>
Tokens:              <none>
Events:              <none>
```


## 3. ADOT Collector を Kubernetes StatefulSet としてデプロイする

otel-fargate-container-insights.yaml を取得

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

sed コマンドで、`YOUR-EKS-CLUSTER-NAME` を `cluster-demo` に置き換え

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

sed コマンドで、`us-east-1` を `ap-northeast-1` に置き換え

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

ADOT Collector を apply し、pod が起動していることを確認

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

```
kubectl get pod -n fargate-container-insights

NAME               READY   STATUS    RESTARTS   AGE
adot-collector-0   1/1     Running   0          2m40s
```

## 4. サンプルアプリケーションのデプロイ

動作確認用として、適当なサンプルアプリケーションをデプロイし、Pod の起動を確認

```deplyment.yaml
apiVersion: apps/v1
kind: Deployment

metadata:
  name: nginx-deployment

spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
```

```
kubectl apply -f deployment.yml
```

```
kubectl get pod

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-57d84f57dc-6fxd6   1/1     Running   0          73s
nginx-deployment-57d84f57dc-bgr9g   1/1     Running   0          73s
```

## 5. 動作チェック

### ロググループ

ロググループ `/aws/containerinsights/cluster-demo/performance` に、各 Pod のログストリームが作成されていることが確認できました。

![スクリーンショット 2023-12-23 15.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/246f0f69-aeda-6a26-0389-882f1bbe2859.png)

### ディメンション

`ContainerInsights` というカスタム名前空間に先述したディメンションが作成されていることが確認できました。

![スクリーンショット 2023-12-23 15.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d0bf2cad-f158-3435-5892-88814c956948.png)

### メトリクス

ざっくりですが、先述したメトリクスが作成されていることが確認できました。

![スクリーンショット 2023-12-23 16.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e9d91d85-ed75-b050-d3e0-56dc81a3cf9c.png)

### Container Insights

Container Insights で可視化し表示されたことが確認できました。
![スクリーンショット 2023-12-23 16.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c6aa5f3f-93d4-7ae7-e8db-cb507ee066db.png)

なお、Amazon EKS 向けにオブザーバビリティが強化された Container Insights は、2023/12 現在では Fargate ではサポートされていないので、焦らないようにしましょう。
![スクリーンショット 2023-12-23 16.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1c055f1e-23be-500f-06f1-c36c8f8c886a.png)

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/deploy-container-insights-EKS.html


# リンク

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

https://aws.amazon.com/jp/about-aws/whats-new/2023/12/amazon-cloudwatch-container-account-observability-eks/