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_utilization
、pod_cpu_requested
、pod_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_bytes
や pod_network_tx_bytes
などのネットワークメトリクスは、ホスト OS のコンテナでは収集されません。
CloudWatch のロググループコンソールでも、Fluent Bit エージェントがログの送信を開始したことを確認しましょう。以下のロググループに Windows EC2 インスタンスが表示されるはずです。
サンプルアプリケーションをデプロイして、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 とメモリの使用量が高いリソースを素早く特定するために、事前に設定されたしきい値を用いて、パフォーマンスへの影響を避けるための積極的な対応を可能にします。
さらに、CPU やメモリ使用率などの重要なメトリクスについて、クラスター、ノード、ワークロード、ポッド、コンテナの上位 10 件を確認できます。コンテナレベルまでの情報を提供できることで、Site Reliability Engineer (SRE) がパフォーマンスの問題を特定する平均時間を短縮できます。
クラスター名をクリックすると、パフォーマンスモニタリングダッシュボードが開き、パフォーマンスを分析するための各種ビューが表示されます。表示されるビューには以下のようなものがあります。
- クラスター全体のリソース使用率の概要を示すクラスター全体のパフォーマンスダッシュボードビュー
- 個別のノードレベルのメトリクスを可視化するノード パフォーマンスビュー
- CPU、メモリ、ネットワークなどのポッド単位のメトリクスに焦点を当てたポッドパフォーマンスビュー
- 個々のコンテナの使用率メトリクスを詳細に確認できるコンテナのパフォーマンスビュー
例えば、クラスター全体のパフォーマンスダッシュボードから見て全体像をとらえることができます。さまざまなビューを切り替えることで、クラスターからノード、ポッド、コンテナへと徐々に絞り込み、根本原因を見つけることができます。
マルチテナント環境では、ノイジーネイバー事象を回避するため、各アプリケーションのパフォーマンスを理解することが重要です。そのような場合、の概要ダッシュボードを使用すると、リソースを多く消費しているアプリケーションを簡単に特定し、予防措置をとることができます。以下のダッシュボードは、複数コンテナ名前空間における「名前空間の概要」が表示されており、リソース使用状況の全体像を提供しています。
Amazon CloudWatch Container Insights のサービスダッシュボードでは、Kubernetes サービスの Pod のコンテナインスタンスの CPU、メモリ、ネットワークパフォーマンスのメトリクスが提供されます。これらのインサイトを活用することで、リソース使用量を最適化したり、コンテナ化されたサービスの問題をより的確に特定できるようになります。
パフォーマンスメトリクスダッシュボードでは、CPU、メモリ、ネットワーク使用率などの主要メトリクスを使用して、アプリケーションの健全性の概要を示します。このダッシュボードは CloudWatch メトリクスと CloudWatch ロググループと統合されているため、ダッシュボードのパネルの 3 つのドットをクリックし、「ログを表示」を選択するだけで、問題の原因を調査できます。Log Insights には事前に用意されたクエリがあり、ログデータを分析してインサイトを得ることができます。
メトリクスビューを選択して、対応するメトリクスに移動し、アクションの列の下にある「アラームを作成する」を選択すると、指定したしきい値を超えた際に通知を送ることができます。このダッシュボードは、pod_cpu_utilization メトリクスを使用して、Amazon EKS サービス 「standard-2022-service」 のアラーム作成プロセスを示しています。
収集されたすべてのメトリクスは、ContainerInsights 名前空間の下で利用可能です。特定のメトリクスに対してアラームを作成したい場合は、この名前空間を使用してメトリクスにアクセスし、対応するアラームを作成できます。
クリーンアップ
リソースを削除するには、次のコマンドを実行してください。
eksctl delete cluster --name eks-windows-ci
結論
この記事では、Amazon EKS Windows クラスターの Container Insights を有効にするプロセスを紹介しました。数回クリックするだけで、コントロールプレーンとデータプレーンの両方の詳細なメトリクスを収集できます。すぐに使えるダッシュボードを使用して、Windowsワークロードのパフォーマンスの問題を特定するまでの時間と解決にかかる平均時間を短縮できます。Amazon EKSクラスター上で拡張された CloudWatch Container Insights を有効にして、Amazon EKSクラスター上で実行されている Windows ワークロードのトラブルシューティングを効率的に開始するには、このリンクを使用してください。
著者について
翻訳はテクニカルアカウントマネージャーの日平が担当しました。原文は こちらです。