Wie aktiviere ich Container-Insights-Metriken in einem EKS-Cluster?

Letzte Aktualisierung: 13.05.2022

Ich möchte Amazon CloudWatch Container Insights konfigurieren und meine Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster-Metriken anzeigen. Wie kann ich vorgehen?

Kurzbeschreibung

Bei Verwendung mit Amazon EKS verwendet Container Insights eine containerisierte Version des CloudWatch-Agenten oder des AWS Distro for OpenTelemetry-(ADOT-)Collectors, um alle Container zu finden, die in einem Cluster ausgeführt werden. Anschließend werden Leistungsdaten auf jeder Ebene des Leistungs-Stacks erfasst. Container Insights sammelt Daten wie Leistungsprotokollereignisse mithilfe eines eingebetteten Metrikformats. Anschließend sendet es diese Daten an CloudWatch Logs unter der Protokollgruppe /aws/containerinsights/cluster-name/performance. Aus diesen Daten erstellt CloudWatch aggregierte Metriken auf Cluster-, Knoten- und Pod-Ebene. Container Insights unterstützt auch das Sammeln von Metriken aus Clustern, die auf AWS Fargate für Amazon EKS laufen. Weitere Informationen zu Container-Insights finden Sie unter Container Insights verwenden.

Hinweis: Container Insights wird nur auf Linux-Instances unterstützt. Amazon stellt ein CloudWatch-Agent-Container-Image in der Amazon Elastic Container Registry (Amazon ECR) bereit. Weitere Informationen finden Sie unter cloudwatch-agent auf Amazon ECR.

Lösung

Voraussetzungen

Bevor Sie diese Schritte ausführen, sollten Sie die Voraussetzungen überprüfen:

  • Ihr EKS-Cluster läuft mit Knoten im Status Ready, und der Befehl kubectl ist installiert und wird ausgeführt.
  • Die von AWS Identity and Access Management (IAM) verwaltete CloudWatchAgentServerPolicy ermöglicht es Ihren Amazon EKS-Worker-Knoten, Metriken und Protokolle an CloudWatch zu senden. Sie können dies tun, indem Sie der IAM-Rolle Ihrer Worker-Knoten eine Richtlinie hinzufügen. Oder verwenden Sie eine IAM-Rolle für Dienstkonten für den Cluster und fügen Sie die Richtlinie dieser Rolle hinzu. Weitere Informationen finden Sie unter IAM-Rollen für Dienstkonten.
  • Sie betreiben einen Cluster, der Kubernetes Version 1.18 oder höher unterstützt. Dies ist eine Anforderung von Container Insights für EKS Fargate. Sie haben auch ein Fargate-Profil definiert, um Pods auf Fargate zu planen.
  • Die EKS-Pod-Ausführungsrolle ist vorhanden, damit Komponenten, die auf der Fargate-Infrastruktur ausgeführt werden, in Ihrem Namen AWS-APIs aufrufen können. Zum Beispiel das Abrufen von Container-Images aus Amazon ECR.

Richten Sie Container-Insights-Metriken auf Ihrem EKS-EC2-Cluster mithilfe des CloudWatch-Agenten ein

Der CloudWatch-Agent oder die AWS Distro for OpenTelemetry erstellt eine Protokollgruppe mit dem Namen aws/containerinsights/Cluster_Name/performance. Anschließend senden sie die Ereignisse des Leistungsprotokolls an diese Protokollgruppe.

Um Container Insights für die Erfassung von Metriken einzurichten, führen Sie die folgenden Schritte aus, die das CloudWatch-Agent-Container-Image standardmäßig als Daemonset von Docker Hub als anonymer Benutzer bereitstellen. Dieser Pull kann einer Ratenbegrenzung unterliegen.

1.    Erstellen Sie einen Namespace namens amazon-cloudwatch, falls Sie noch keinen haben:

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml

2.    Erstellen Sie ein Dienstkonto für den CloudWatch-Agenten namens cloudwatch-agent:

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml

3.    Erstellen Sie eine Configmap als Konfigurationsdatei für den CloudWatch-Agenten:

ClusterName=<my-cluster-name>
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl apply -f -

Hinweis: Ersetzen Sie my-cluster-name durch den Namen Ihres EKS-Clusters. Informationen zur weiteren Anpassung der CloudWatch-Agentenkonfiguration finden Sie unter Erstellen einer ConfigMap für den CloudWatch-Agenten.

4.    Optional: Um den CloudWatch-Agenten aus der Amazon Elastic Container Registry abzurufen, patchen Sie den CloudWatch-Agenten DaemonSet:

kubectl patch ds cloudwatch-agent -n amazon-cloudwatch -p \
 '{"spec":{"template":{"spec":{"containers":[{"name":"cloudwatch-agent","image":"public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"}]}}}}'

Hinweis: Das CloudWatch-Agent-Docker-Image auf ECR unterstützt die ARM- und AMD64-Architekturen. Ersetzen Sie das neueste Image-Tag basierend auf der Image-Version und Architektur. Weitere Informationen finden Sie unter Bilder-Tags cloudwatch-agent auf Amazon ECR.

5.    Erstellen Sie für IAM-Rollen für Dienstkonten einen OIDC-Anbieter und eine IAM-Rolle und -Richtlinie. Ordnen Sie dann die IAM-Rolle dem cloudwatch-agent-Dienstkonto zu. Ersetzen Sie ACCOUNT_ID und IAM_ROLE_NAME durch die AWS-Konto-ID und die IAM-Rolle, die für die Dienstkonten verwendet wird.

kubectl annotate serviceaccounts cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Problembehandlung beim CloudWatch-Agenten

1.    Führen Sie diesen Befehl aus, um die Liste der Pods abzurufen:

kubectl get pods -n amazon-cloudwatch

2.    Führen Sie diesen Befehl aus und überprüfen Sie die Ereignisse am Ende der Ausgabe:

kubectl describe pod pod-name -n amazon-cloudwatch

3.    Führen Sie diesen Befehl aus, um die Protokolle zu überprüfen:

kubectl logs pod-name -n amazon-cloudwatch

4.    Wenn Sie einen CrashLoopBackOff-Fehler für den CloudWatch-Agenten sehen, stellen Sie sicher, dass Ihre IAM-Berechtigungen richtig eingestellt sind.

Weitere Informationen finden Sie unter Voraussetzungen überprüfen.

CloudWatch-Agent löschen

Verwenden Sie diese Befehle, um den CloudWatch-Agenten zu löschen:

kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
ClusterName=<my-cluster-name>
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl delete -f -

Richten Sie Container-Insights-Metriken auf Ihrem EKS-EC2-Cluster mit ADOT ein

1.    Führen Sie diesen Befehl aus, um den ADOT-Collector als DaemonSet bereitzustellen. Weitere Anpassungen finden Sie unter Container-Insights-EKS-Infrastrukturmetriken.

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -

2.    Vergewissern Sie sich, dass der Collector ausgeführt wird:

kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks

3.    Optional: Das aws-otel-collector-Image wird standardmäßig als anonymer Benutzer aus Docker Hub abgerufen. Dieser Pull kann einer Ratenbegrenzung unterliegen. Um das aws-otel-collector-Docker-Image auf Amazon ECR abzurufen, patchen Sie aws-otel-eks-ci DaemonSet:

kubectl patch ds aws-otel-eks-ci -n aws-otel-eks -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

Hinweis: Das CloudWatch-Agent-Docker-Image auf ECR unterstützt die ARM- und AMD64-Architekturen. Ersetzen Sie das neueste Image-Tag basierend auf der Image-Version und Architektur. Weitere Informationen finden Sie unter Bilder-Tags cloudwatch-agent auf Amazon ECR.

5.    Optional: Erstellen Sie für IAM-Rollen für Dienstkonten einen OIDC-Anbieter und eine IAM-Rolle und -Richtlinie. Ordnen Sie dann die IAM-Rolle dem aws-otel-sa Service Account zu. Ersetzen Sie ACCOUNT_ID und IAM_ROLE_NAME durch die AWS-Konto-ID und die IAM-Rolle, die für Dienstkonten verwendet wird.

kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

ADOT löschen

Führen Sie diesen Befehl aus, um AWS Distro for OpenTelemetry zu löschen:

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml |
kubectl delete -f -

Richten Sie Container-Insights-Metriken auf einem EKS Fargate-Cluster mit ADOT

Für Anwendungen, die auf Amazon EKS und AWS Fargate laufen, können Sie den ADOT verwenden, um Container Insights einzurichten. Die EKS Fargate-Netzwerkarchitektur erlaubt es Pods nicht, das Kubelet auf dem Worker direkt zu erreichen, um Ressourcenmetriken abzurufen. Der ADOT Collector ruft den Kubernetes-API-Server auf, um die Verbindung zum Kubelet auf einem Worker-Knoten als Proxy bereitzustellen. Anschließend werden die Beratermetriken von Kubelet für Workloads auf diesem Knoten gesammelt.

Hinweis: Eine einzelne Instance von ADOT Collector reicht nicht aus, um Ressourcenmetriken von allen Knoten in einem Cluster zu sammeln.

Der ADOT Collector sendet diese Metriken für jeden Workload, der auf EKS Fargate ausgeführt wird, an CloudWatch:

  • pod_cpu_utilization_over_pod_limit
  • pod_cpu_nutzung_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

Jede Metrik ist mit den folgenden Dimensionssätzen verknüpft und wird unter dem CloudWatch-Namespace namens ContainerInsights gesammelt.

  • ClusterName, LaunchType
  • ClusterName, Namespace, LaunchType
  • ClusterName, Namespace, PodName, LaunchType

Weitere Informationen finden Sie auf der Seite Container Insights EKS Fargate.

Gehen Sie wie folgt vor, um ADOT in Ihrem EKS Fargate bereitzustellen:

1.    Ordnen Sie ein Kubernetes-Dienstkonto einer IAM-Rolle zu. Erstellen Sie eine IAM-Rolle mit dem Namen EKS-ADOT-ServiceAccount-Role, die mit einem Kubernetes-Dienstkonto namens adot-collector verknüpft ist. Achten Sie darauf, die Variablen CLUSTER_NAME und REGION zu ändern. Dieses Hilfsskript benötigt eksctl.

#!/bin/bash
CLUSTER_NAME=YOUR-EKS-CLUSTER-NAME
REGION=YOUR-EKS-CLUSTER-REGION
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

eksctl utils associate-iam-oidc-provider \
--cluster=$CLUSTER_NAME \
--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

2.    Stellen Sie den ADOT-Collector mit diesem Befehl als Kubernetes StatefulSet bereit. Ersetzen Sie my-cluster-name durch den Namen Ihres EKS-Clusters und my-cluster-region durch den Namen der Region.

ClusterName=<my-cluster-name>
Region=<my-cluster-region>
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl apply -f -

3.    Stellen Sie sicher, dass der ADOT-Collector-Pod ausgeführt wird:

kubectl get pods -n fargate-container-insights

4.    Optional: Das aws-otel-collector-Image wird standardmäßig als anonymer Benutzer aus Docker Hub abgerufen. Dieser Pull kann einer Ratenbegrenzung unterliegen. Um das aws-otel-collector-Docker-Image auf Amazon ECR abzurufen, patchen Sie aws-otel-eks-ci DaemonSet:

kubectl patch sts adot-collector -n fargate-container-insights -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

ADOT löschen

Führen Sie diese Befehle aus, um ADOT zu löschen.

eksctl delete iamserviceaccount —cluster CLUSTER_NAME —name adot-collector
ClusterName=<my-cluster-name>
Region=<my-cluster-region>
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl delete -f -

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?