Fargate でメトリクスを取得するには
AWS Distro for OpenTelemetry (ADOT) を使用する。
仕組み
以下のページで紹介されている「Design of Container Insights support in ADOT Collector for 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 つのプロファイルを作成しています。
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 ロールに関連付けることで実現します。
※ サービスアカウントとは、こちら のページでも紹介している通り、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 の起動を確認
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 のログストリームが作成されていることが確認できました。
ディメンション
ContainerInsights
というカスタム名前空間に先述したディメンションが作成されていることが確認できました。
メトリクス
ざっくりですが、先述したメトリクスが作成されていることが確認できました。
Container Insights
Container Insights で可視化し表示されたことが確認できました。
なお、Amazon EKS 向けにオブザーバビリティが強化された Container Insights は、2023/12 現在では Fargate ではサポートされていないので、焦らないようにしましょう。
リンク