Amazon Web Services ブログ

Amazon EKS Windows ワークロードの監視のための Amazon CloudWatch Container Insights 発表

コンテナ化されたアプリケーションを監視するには、正確性と効率性が求められます。アプリケーションの規模が大きくなるにつれて、アプリケーションとインフラストラクチャのメトリクスを収集して要約することは困難になります。この課題に対処する方法の 1 つは、AWS が提供するネイティブのモニタリングツール Amazon CloudWatch Container Insights を使用することです。Amazon CloudWatch Container Insights は、お客様がAmazon Elastic Kubernetes Service クラスター (Amazon EKS) 上で実行されるアプリケーションからメトリクスとログを収集、集計、および要約するのに役立ちます。2023 年 11 月 6 日、AWS は、コンテナレベルの詳細な正常性、パフォーマンス、ステータスメトリクスを収集し、コントロールプレーンのメトリクスも収集する Container Insights の拡張バージョン をアナウンスしました。さらに 2024 年 4 月 10 日、AWS はAmazon EKS の Windows ワークロード向けに Amazon CloudWatch Container Insights の提供を開始しました。

お客様は、container_cpu_utilizationpod_cpu_requestedpod_cpu_limit などのメトリクスを Windows アプリケーション用に収集できるようになりました。アウトオブボックスのパフォーマンスメトリクススダッシュボードを使用して、アプリケーションの健全性を理解し、Amazon EKS 上のコンテナ化された Windows アプリケーションの問題を効率的にデバッグできます。CloudWatch Container Insights は、埋め込みメトリクス形式を使用してメトリクスデータをパフォーマンスログイベントとして収集します。このデータから、Amazon CloudWatch は、クラスター、ノード、ポッド、サービスレベルで CloudWatch メトリクスとして集約メトリクスを作成します。Container Insights が収集するメトリクスは、CloudWatch の自動ダッシュボードで利用できます。メトリクススの収集は CloudWatch Agent が行い、ログの収集は Fluent Bit が行います。CloudWatch Agent と Fluent Bit の両コンポーネントは、Amazon CloudWatch Observability EKS Add-on を有効にするときとデプロイされます。

本記事では、Amazon EKS Windows クラスターに Container Insights を有効化するプロセスを説明します。

Amazon EKS Windows クラスターの Container Insights のセットアップ
前提条件

Amazon EKS Windows クラスターの作成

まず、Amazon EKS Windows クラスターの作成から始めましょう。クラスターをセットアップする最も簡単な方法は、Amazon EKS の公式 CLI ツールである eksctl を使用することです。以下のコマンドは、eks-windows-ci という名前のクラスターを作成し、クラスターに 2 つの Linux ノードを追加します。現在、Windows ノードとポッド ネットワーキングをサポートするには、少なくとも 1 つの Linux ノードが必要です。ただし、この例では、高可用性を実現するために 2 つの Linux ノードを指定しています。

この記事を書いている時点で、サポートされている Amazon EKS の最新バージョンは 1.29 であり、サポート対象の Amazon EKS バージョンならどれを選んでも構いません。

eksctl create cluster \ 
--name eks-windows-ci \ 
--version 1.29 \ 
--nodegroup-name linux-ng \ 
--node-type m5.large \ 
--region us-east-1 \ 
--nodes 2 \ 
--nodes-min 1 \ 
--nodes-max 3 \ 
--node-ami-family AmazonLinux2 \ 
--disable-pod-imds

次に、クラスターにいくつかの Windows ノードを追加する必要があります。eksctl を使用してクラスターを作成した場合は、以下のコマンドで実行できます。別のクラスターで作業する場合は、ドキュメントを参照して、Windows ノードグループの作成方法とクラスターへの接続方法を確認してください。

利用するリージョンで最新の Windows AMI ID を確認するには、AWS Systems Manager Parameter Store を照会します。手順については、Amazon EKS ドキュメントをご覧ください。

eksctl create nodegroup \ 
--region us-east-1 \ 
--cluster eks-windows-ci \ 
--name windows-ng \ 
--node-type m5.large \ 
--nodes-min 2 \ 
--node-ami-family WindowsServer2022FullContainer \ 
--disable-pod-imds

次に、Amazon VPC IP Address Manager (IPAM) を有効にするために amazon-vpc-cni configmap を変更しましょう。

cat << EOF > amazon-vpc-cni.yaml 
--- 
apiVersion: v1 
kind: ConfigMap 
metadata:
name: amazon-vpc-cni 
namespace: kube-system 
data:
enable-windows-ipam: "true" 
--- 
EOF
kubectl apply -f amazon-vpc-cni.yaml

クラスターが起動して実行中であることを確認するために、kubectl コマンドを使用しましょう。

nht-admin:~/environment $ kubectl get nodes -o wide
NAME                             STATUS   ROLES    AGE     VERSION               INTERNAL-IP      EXTERNAL-IP      OS-IMAGE                         KERNEL-VERSION                  CONTAINER-RUNTIME
ip-192-168-10-132.ec2.internal   Ready    <none>   2d11h   v1.28.5-eks-5e0fdde   192.168.10.132   107.23.236.165   Windows Server 2022 Datacenter   10.0.20348.2227                 containerd://1.6.18
ip-192-168-14-178.ec2.internal   Ready    <none>   2d      v1.28.5-eks-5e0fdde   192.168.14.178   54.80.175.223    Windows Server 2022 Datacenter   10.0.20348.2227                 containerd://1.6.18
ip-192-168-29-193.ec2.internal   Ready    <none>   2d11h   v1.28.5-eks-5e0fdde   192.168.29.193   3.90.176.199     Amazon Linux 2                   5.10.205-195.807.amzn2.x86_64   containerd://1.7.11
ip-192-168-33-121.ec2.internal   Ready    <none>   2d11h   v1.28.5-eks-5e0fdde   192.168.33.121   18.207.151.28    Amazon Linux 2                   5.10.205-195.807.amzn2.x86_64   containerd://1.7.11
ip-192-168-46-41.ec2.internal    Ready    <none>   2d11h   v1.28.5-eks-5e0fdde   192.168.46.41    52.90.145.146    Windows Server 2022 Datacenter   10.0.20348.2227                 containerd://1.6.18

Amazon CloudWatch Observability EKS アドオンのインストール

Container Insights を有効にする最も簡単な方法は、Amazon CloudWatch Observability EKS アドオンをデプロイすることです。Amazon CloudWatch Observability EKS アドオンは、CloudWatch エージェントと Fluent-bit エージェントを Amazon EKS クラスターにインストールします。Amazon CloudWatch Observability EKS アドオンを利用することで、デフォルトでAmazon EKSに対する Container Insights の拡張されたオブザーバビリティと CloudWatch Application Signals が有効になります。なお、CloudWatch Application signals は現在 Windows ではサポートされていません。このアドオンを使用すると、Amazon EKS クラスターからインフラストラクチャに関するメトリクス、アプリケーションパフォーマンスに関するテレメトリデータ、コンテナのログを収集できます。Fluent Bit がクラスターからコンテナログを CloudWatch Logs に送信します。これにより、コンテナからのアプリケーションとシステムログを把握できます。Amazon EKS アドオンを使用するには、クラスターのワーカーノードで使用される IAM ロールに必要な IAM 権限を設定します。Windows ワーカーノードの場合は、インスタンスロールに IAM ポリシーを関連付けます。

my-windows-worker-node-role を Windows ノードグループの IAM ロールに置き換えてください。

aws iam attach-role-policy --role-name <<my-windows-worker-node-role>> --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
aws eks create-addon --cluster-name eks-windows-ci --addon-name eks-pod-identity-agent --addon-version v1.1.0-eksbuild.1 --configuration-values $'nodeSelector: \n    \"kubernetes.io/os\": \"linux\"' --resolve-conflicts OVERWRITE

Linux ワーカーノードでは、EKS Pod Identities アドオンを利用します。

EKS アドオンをデプロイしましょう。EKS Pod Identity エージェントのデーモンセットは Linux ノードでのみデプロイされるように nodeSelector を設定していることに注目してください。この記事の執筆時点では、EKS Pod Identity エージェントは Windows ワーカーノードでサポートされていませんでした。nodeSelector を指定することで、デーモンセットが Windows ワーカーノードにデプロイされないようにしています。

aws eks create-addon --cluster-name eks-windows-ci --addon-name eks-pod-identity-agent --addon-version v1.1.0-eksbuild.1 --configuration-values $'nodeSelector: \n \"kubernetes.io/os\": \"linux\"' --resolve-conflicts OVERWRITE
eksctl create podidentityassociation --cluster eks-windows-ci --namespace amazon-cloudwatch --service-account-name cloudwatch-agent --role-name eks-cw-role --permission-policy-arns arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy --region us-east-1

次に、以下のように Amazon CloudWatch Observability アドオンをインストールしてください。

aws eks create-addon --cluster-name eks-windows-ci --addon-name amazon-cloudwatch-observability

Amazon CloudWatch Container Insights は、お客様の EKS クラスターで有効になります。簡単にオンボーディングできるように、EKS コンソールでクラスターを選択し、アドオンタブを表示することで同じアドオンが使用できます。拡張されたメトリクスとログが CloudWatch コンソールに出てくるようになります。以下のコマンドを使って、CloudWatch Container Insights が正常にデプロイされたことを確認しましょう。

$ kubectl get pods -n amazon-cloudwatch
NAME                                                              READY   STATUS    RESTARTS      AGE
amazon-cloudwatch-observability-controller-manager-6d5954fcttgw   1/1     Running   0             44h
cloudwatch-agent-9fvj6                                            1/1     Running   0             44h
cloudwatch-agent-cfzmb                                            1/1     Running   0             44h
cloudwatch-agent-windows-fmlbt                                    1/1     Running   0             44h
cloudwatch-agent-windows-g298d                                    1/1     Running   0             44h
cloudwatch-agent-windows-pw9pl                                    1/1     Running   0             44h
fluent-bit-ctls2                                                  1/1     Running   0             44h
fluent-bit-windows-5t57v                                          1/1     Running   5 (44h ago)   44h
fluent-bit-windows-6qhm4                                          1/1     Running   8 (43h ago)   44h
fluent-bit-windows-mcdrm                                          1/1     Running   6 (19h ago)   44h
fluent-bit-wmgp6                                                  1/1     Running   0             44h

注: Windows では、pod_network_rx_bytespod_network_tx_bytes などのネットワークメトリクスは、ホスト OS のコンテナでは収集されません。

CloudWatch のロググループコンソールでも、Fluent Bit エージェントがログの送信を開始したことを確認しましょう。以下のロググループに Windows EC2 インスタンスが表示されるはずです。

CloudWatch Log groups Console

CloudWatch ロググループのコンソール

サンプルアプリケーションをデプロイして、CloudWatch Container Insights ダッシュボードを確認します。

Container Insights が提供する様々なダッシュボードを理解するため、Windows アプリケーションのサンプルをデプロイしましょう。このアプリケーションは、基本的な Windows IIS サーバを実行します。

 cat << EOF > windows-workloads.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: multiple-containers
  namespace: multiple-containers
spec:
  selector:
    matchLabels:
      app: multiple-containers
      tier: backend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: multiple-containers
        tier: backend
        track: stable
    spec:
      containers:
      - name: multiple-containers-container-1
        image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2022
        command:
        - powershell.exe
        - -command
        - " ping -t google.com "
      - name: multiple-containers-container-2
        image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2022
        command:
        - powershell.exe
        - -command
        - " ping -t amazon.com "
      nodeSelector:
        kubernetes.io/os: windows
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: standard-2022-deployment
spec:
  selector:
    matchLabels:
      app: standard-2022-deployment
      tier: backend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: standard-2022-deployment
        tier: backend
        track: stable
    spec:
      containers:
      - name: standard-2022-deployment
        image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2022
        command:
        - powershell.exe
        - -command
        - " ping -t google.com "
      nodeSelector:
        kubernetes.io/os: windows
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-web-service
  namespace: web-service
spec:
  selector:
    matchLabels:
      app: deployment-web-service
      tier: backend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: deployment-web-service
        tier: backend
        track: stable
    spec:
      containers:
      - name: deployment-web-service
        image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2022
        command:
        - powershell.exe
        - -command
        - |
          Add-WindowsFeature Web-Server;
          Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\ServiceMonitor.exe';
          echo '<html><body><br/><br/><H1>Windows Container Workshop - Windows LTSC2019!!!</H1></body></html>' > C:\inetpub\wwwroot\iisstart.htm;
          C:\ServiceMonitor.exe 'w3svc';
      nodeSelector:
        kubernetes.io/os: windows
---
apiVersion: v1
kind: Service
metadata:
  name: standard-2022-service
  namespace: web-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: deployment-web-service
    tier: backend
    track: stable
  sessionAffinity: None
  type: LoadBalancer
---
EOF
kubectl apply -f windows-workloads.yaml

一度デプロイすると、AWS コンソールから、拡張された Container Insights ページが以下のように表示され、クラスター、kube-state、コントロールプレーンのメトリクスの概要が示されます。Container Insights ダッシュボードには、クラスターのステータスとアラームが表示されます。CPU とメモリの使用量が高いリソースを素早く特定するために、事前に設定されたしきい値を用いて、パフォーマンスへの影響を避けるための積極的な対応を可能にします。

Overview of Container Insights

Container Insights の Overview

さらに、CPU やメモリ使用率などの重要なメトリクスについて、クラスター、ノード、ワークロード、ポッド、コンテナの上位 10 件を確認できます。コンテナレベルまでの情報を提供できることで、Site Reliability Engineer (SRE) がパフォーマンスの問題を特定する平均時間を短縮できます。

Top 10 list

トップ 10 リスト

クラスター名をクリックすると、パフォーマンスモニタリングダッシュボードが開き、パフォーマンスを分析するための各種ビューが表示されます。表示されるビューには以下のようなものがあります。

  • クラスター全体のリソース使用率の概要を示すクラスター全体のパフォーマンスダッシュボードビュー
  • 個別のノードレベルのメトリクスを可視化するノード パフォーマンスビュー
  • CPU、メモリ、ネットワークなどのポッド単位のメトリクスに焦点を当てたポッドパフォーマンスビュー
  • 個々のコンテナの使用率メトリクスを詳細に確認できるコンテナのパフォーマンスビュー

例えば、クラスター全体のパフォーマンスダッシュボードから見て全体像をとらえることができます。さまざまなビューを切り替えることで、クラスターからノード、ポッド、コンテナへと徐々に絞り込み、根本原因を見つけることができます。

Performance dashboard

パフォーマンスダッシュボード

マルチテナント環境では、ノイジーネイバー事象を回避するため、各アプリケーションのパフォーマンスを理解することが重要です。そのような場合、の概要ダッシュボードを使用すると、リソースを多く消費しているアプリケーションを簡単に特定し、予防措置をとることができます。以下のダッシュボードは、複数コンテナ名前空間における「名前空間の概要」が表示されており、リソース使用状況の全体像を提供しています。

Performance dashboard by Namespace

Namespaceのパフォーマンスダッシュボード

Amazon CloudWatch Container Insights のサービスダッシュボードでは、Kubernetes サービスの Pod のコンテナインスタンスの CPU、メモリ、ネットワークパフォーマンスのメトリクスが提供されます。これらのインサイトを活用することで、リソース使用量を最適化したり、コンテナ化されたサービスの問題をより的確に特定できるようになります。

パフォーマンスメトリクスダッシュボードでは、CPU、メモリ、ネットワーク使用率などの主要メトリクスを使用して、アプリケーションの健全性の概要を示します。このダッシュボードは CloudWatch メトリクスと CloudWatch ロググループと統合されているため、ダッシュボードのパネルの 3 つのドットをクリックし、「ログを表示」を選択するだけで、問題の原因を調査できます。Log Insights には事前に用意されたクエリがあり、ログデータを分析してインサイトを得ることができます。

Performance dashboard by Services

サービスのパフォーマンスダッシュボード

メトリクスビューを選択して、対応するメトリクスに移動し、アクションの列の下にある「アラームを作成する」を選択すると、指定したしきい値を超えた際に通知を送ることができます。このダッシュボードは、pod_cpu_utilization メトリクスを使用して、Amazon EKS サービス 「standard-2022-service」 のアラーム作成プロセスを示しています。

Navigating to Metrics console

メトリクスコンソール

Alarm Creation

アラームの作成

収集されたすべてのメトリクスは、ContainerInsights 名前空間の下で利用可能です。特定のメトリクスに対してアラームを作成したい場合は、この名前空間を使用してメトリクスにアクセスし、対応するアラームを作成できます。

ContainerInsights CloudWatch Namespace

CloudWatch 名前空間における Container Insights

クリーンアップ

リソースを削除するには、次のコマンドを実行してください。

eksctl delete cluster --name eks-windows-ci

結論

この記事では、Amazon EKS Windows クラスターの Container Insights を有効にするプロセスを紹介しました。数回クリックするだけで、コントロールプレーンとデータプレーンの両方の詳細なメトリクスを収集できます。すぐに使えるダッシュボードを使用して、Windowsワークロードのパフォーマンスの問題を特定するまでの時間と解決にかかる平均時間を短縮できます。Amazon EKSクラスター上で拡張された CloudWatch Container Insights を有効にして、Amazon EKSクラスター上で実行されている Windows ワークロードのトラブルシューティングを効率的に開始するには、このリンクを使用してください。

著者について

Vikram Venkataraman author photo

Vikram Venkataraman

Vikram Venkataraman は、Amazon Web Servicesの Principal Specialist Solutions Architect です。顧客がコンテナ化されたワークロードのモダナイズ、スケーリング、ベストプラクティスの採用を支援しています。彼は Observability に情熱を傾けており、Amazon Managed Service for Prometheus、Amazon Managed Grafana、AWS Distro for Open Telemetry などのオープンソースの AWS Observability サービスに焦点を当てています。

Kulwant Singh author photo

Kulwant Singh

Kulwant Singh は Amazon Web Services の Software Development Engineer で、コンテナや Kubernetes などのコンテナオーケストレーターと仕事をしています。

翻訳はテクニカルアカウントマネージャーの日平が担当しました。原文は こちらです。