LoginSignup
7
4

More than 1 year has passed since last update.

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

Posted at

はじめに

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

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

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

image-20221130010541868.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 の導入は、こちら のドキュメントをご確認ください。

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

適当に名前を指定します

image-20221129234856204.png

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

image-20221129234924972.png

Create を押します。

image-20221129234948287.png

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

image-20221129235143164.png

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 を選択します。

image-20221130010032158.png

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

image-20221130010209267.png

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

image-20221130010405226.png

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

image-20221130010541868.png

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

  • Container Insights の中で、Deployment 単位での可視化は、ドロップダウンで選択できない
    • その代わり、Service 単位や、Pods 単位の可視化が可能。
    • Pod の表示にはフィルター機能があり、これで Deployment 単位で可視化することで見やすくなる
      image-20221130010458912.png

参考 URL

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4