はじめに
EKS には、EKS 上で稼働するコンテナなどのメトリクス情報を可視化する Container Insights という機能があります。Container Insights は、以前は EKS on Fargate で利用が出来ませんでしたが、 2022 年のアップデートで利用できるようになりました。Container Insights で、可視化ダッシュボードが用意されており、簡単に使い始められます。EKS のメトリクス取得で検討されている方は、Container Insights を検討されても良いとおもいます。
詳細が気になる方は次のブログを参照ください。
Container Insights で何が見えるの?
いくつか可視化ダッシュボード画面を抜粋します。
EKS クラスターの中で、どのような Pod が稼働しているのか可視化できます。この可視化の中で、より深くメトリクスを確認したい Pod を選択することで、詳細画面に移動できます。
メトリクスの詳細画面では、Cluster 単位、Service 単位、Pod 単位といったメトリクスを確認可能です。次のスクリーンショットは、Pod 単位でのメトリクスを表示している画面です。CPU, Memory,Network といったメトリクスが見えます。
右側にあるフィルターで、どの Pod を表示したいかフィルターが出来るので、Deployment 単位といった形で表示を制御することも出来ます。
この 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 の導入は、こちら のドキュメントをご確認ください。
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 を押します。
適当に名前を指定します
ワイルドカードが利用できるようになったので、これを指定します。環境に合わせて変更してください。
Create を押します。
一定時間後、作成されました。
ADOT Collector のデプロイ
一番大事な作業の、ADOT Collector のデプロイを行います。以下の記事に書かれている通りに進めます。
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
変更前
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 を選択します。
EKS の中で、どこの namespace にどんな Pod が稼働しているか、わかります。
Performance monitoring の画面では、EKS Cluster 単位のでメトリクスがわかります。
プルダウンから、EKS Pods を選ぶことで、Pod 単位のメトリクスを確認可能。また、右側にあるフィルターで、どの Pod を表示したいかフィルターが出来ます。Deployment 単位など、自由にコントロールが可能です。
検証のなかでわかったこと
- Container Insights の中で、Deployment 単位での可視化は、ドロップダウンで選択できない
参考 URL