Direkt zum Inhalt

Wie aktiviere ich Container-Insights-Metriken auf einem Amazon EKS Cluster?

Lesedauer: 6 Minute
0

Ich möchte Amazon CloudWatch Container Insights so konfigurieren, dass meine Amazon Elastic Kubernetes Service (Amazon EKS)-Clustermetriken angezeigt werden.

Lösung

Container Insights wird nur auf Linux Instances unterstützt. Amazon stellt ein CloudWatch-Agent-Container-Image in Amazon Elastic Container Registry (Amazon ECR) bereit. Weitere Informationen findest du unter cloudwatch-agent/cloudwatch-agent.

Bevor du beginnst, stelle sicher, dass du die Voraussetzungen für Container Insights in CloudWatch erfüllst. Für AWS Fargate-Cluster musst du ein Fargate-Profil definieren, um Pods zu planen. Außerdem muss die Identity and Access Management(IAM)-Rolle von Amazon EKS Pod Komponenten, die auf der Fargate-Infrastruktur ausgeführt werden, ermöglichen, AWS-APIs aufzurufen. Beispielsweise muss die IAM-Rolle in der Lage sein, Container Images aus Amazon ECR abzurufen.

Verwende den CloudWatch Agent, um Container Insights Metriken auf deinem EKS-Cluster einzurichten

Der CloudWatch Agent erstellt zunächst eine Protokollgruppe mit dem Namen AWS/ContainerInsights/Cluster_NAME/Performance und sendet dann die Leistungsprotokollereignisse an diese Protokollgruppe. Wenn du Container Insights für die Erfassung von Metriken einrichtest, musst du das CloudWatch Agent Container Image als DaemonSet von Docker Hub aus bereitstellen. Standardmäßig stellst du das Container-Image als anonymer Benutzer bereit.

**Hinweis:**Docker begrenzt möglicherweise die Anzahl der Bilder, die du abrufen kannst.

Gehe wie folgt vor, um den CloudWatch-Agenten zum Einrichten von Container Insights zu verwenden:

  1. Führe den folgenden Befehl aus, um einen amazon-cloudwatch-Namespace zu erstellen:

    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. Führe den folgenden Befehl aus, um ein Dienstkonto für den CloudWatch-Agenten mit dem Namen cloudwatch-agent zu erstellen:

    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. Führe den folgenden Befehl aus, um eine configmap als Konfigurationsdatei für den CloudWatch-Agenten zu erstellen:

    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: Ersetze my-cluster-name durch den Namen deines EKS-Clusters. Weitere Informationen findest du unter Erstellen einer ConfigMap für den CloudWatch Agent.

  4. Führe den folgenden Befehl aus, um das cloudwatch-agent-DaemonSet bereitzustellen:

    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-daemonset.yaml
  5. (Optional) Führe den folgenden Befehl aus, um das cloudwatch-agent-DaemonSet so zu patchen, dass es den CloudWatch-Agenten aus dem ECR abruft:

    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. Ersetze das neueste Image Tag basierend auf der Image-Version und Architektur. Weitere Informationen findest du unter cloudwatch-agent/cloudwatch-agent.

  6. Erstelle für IAM-Rollen für Dienstkonten einen OIDC-Anbieter sowie eine IAM-Rolle und -Richtlinie. Führe dann den folgenden Befehl aus, um die IAM-Rolle dem cloudwatch-agent-Dienstkonto zuzuordnen:

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

    Hinweis: Ersetzen Sie ACCOUNT_ID durch Ihre Konto-ID und IAM_ROLE_NAME durch die IAM-Rolle, die Sie für die Dienstkonten verwenden.

Problembehandlung beim CloudWatch Agent

Führen die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um die Liste der Pods abzurufen:

    kubectl get pods -n amazon-cloudwatch
  2. Führe den folgenden Befehl aus, um die Ereignisse am Ende der Ausgabe zu überprüfen:

    kubectl describe pod pod-name -n amazon-cloudwatch
  3. Führe den folgenden Befehl aus, um die Protokolle zu überprüfen:

    kubectl logs pod-name -n amazon-cloudwatch
    
  4. Wenn du einen CrashLoopBackOff-Fehler für den CloudWatch-Agenten siehst, bestätige, dass du deine IAM-Berechtigungen korrekt konfiguriert hast.

Lösche den CloudWatch-Agent

Führe den folgenden Befehl aus, 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

**Hinweis:**Wenn du den Namespace löscht, werden auch die zugehörigen Ressourcen gelöscht.

Verwende Distro für OpenTelemetry, um Container Insights-Metriken auf deinem EKS-Cluster einzurichten

AWS Distro für OpenTelemetry erstellt zunächst eine Protokollgruppe mit dem Namen AWS/ContainerInsights/Cluster_NAME/Performance und sendet dann die Leistungsprotokollereignisse an diese Protokollgruppe.

Führen die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um den AWS OpenTelemetry Collector als DaemonSet bereitzustellen:

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

    Hinweis: Weitere Informationen findest du unter Container Insights-EKS-Infrastrukturmetriken.

  2. Führe den folgenden Befehl aus, um zu bestätigen, dass der Collector läuft:

    kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
    
  3. (Optional) Führe den folgenden Befehl aus, um das aws-otel-eks-ci-DaemonSet so zu patchen, dass das aws-otel-collector-Docker-Image auf ECR abgerufen wird:

    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 Amazon ECR unterstützt die ARM- und AMD64-Architekturen. Ersetze das neueste Image Tag basierend auf der Image-Version und Architektur.

  4. (Optional) Erstelle für IAM-Rollen für Dienstkonten einen OIDC-Anbieter sowie eine IAM-Rolle und -Richtlinie. Führe dann den folgenden Befehl aus, um die IAM-Rolle dem aws-otel-sa-Dienstkonto zuzuordnen:

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

    Hinweis: Ersetze ACCOUNT_ID durch deine Konto-ID und IAM_ROLE_NAME durch die IAM-Rolle, die du für die Dienstkonten verwendest.

Distro für OpenTelemetry löschen

Führe den folgenden Befehl aus, um 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 -

Verwende Distro for OpenTelemetry, um Container Insights-Metriken auf einem EKS Fargate-Cluster einzurichten

Für Anwendungen, die auf EKS und Fargate ausgeführt werden, kannst du Distro for OpenTelemetry verwenden, um Container Insights einzurichten.
Der AWS OpenTelemetry Collector sendet für jede Workload, die auf EKS Fargate ausgeführt wird, die folgenden Metriken an CloudWatch:

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

Der AWS OpenTelemetry Collector erfasst jede Metrik unter dem CloudWatch-Namespace, der ContainerInsights heißt. Wähle in der CloudWatch-Konsole ** Metriken** und dann Alle Metriken aus. Du kannst unter Benutzerdefinierter Namespace zu Container Insights navigieren.

Jede Metrik ist den folgenden Dimensionssätzen zugeordnet:

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

Weitere Informationen findest du unter Container Insights EKS Fargate.

Gehe wie folgt vor, um Distro for OpenTelemetry in deinem EKS Fargate bereitzustellen:

  1. Erstelle einen Namespace mit dem Namen fargate-container-insights.

  2. Verwende das folgende Skript, um eine IAM-Rolle mit dem Namen EKS-ADOT-ServiceAccount-Role zu erstellen, die einem Kubernetes-Dienstkonto mit dem Namen adot-collector zugeordnet ist. Das folgende Hilfsskript benötigt eksctl:

    #!/bin/bashCLUSTER_NAME=YOUR-EKS-CLUSTER-NAMEREGION=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
    
    kubectl create ns fargate-container-insights
    
    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

    Hinweis: Ersetze CLUSTER_NAME durch den Namen deines Clusters und REGION durch deine AWS-Region.

  3. Führe den folgenden Befehl aus, um den AWS OpenTelemetry Collector als Kubernetes StatefulSet bereitzustellen:

    ClusterName= your-cluster-name Region= your-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 -
    

    Hinweis: Ersetzeyour-cluster-name durch den Namen deines Clusters und your-cluster-region durch die Region, in der sich dein Cluster befindet. Bestätige, dass du über ein passendes Fargate-Profil verfügst, um die StatefulSet-Pods auf Fargate bereitzustellen.

  4. Führe den folgenden Befehl aus, um zu überprüfen, ob der Distro für Open Telemetry Collector Pod ausgeführt wird:

    kubectl get pods -n fargate-container-insights
  5. (Optional) Führe den folgenden Befehl aus, um das adot-collector-StatefulSet so zu patchen, dass es das aws-otel-collector-Docker-Image auf ECR abruft:

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

Distro für OpenTelemetry löschen

Führe den folgenden Befehl aus, um Distro for OpenTelemetry zu löschen:

eksctl delete iamserviceaccount --cluster CLUSTER_NAME --name adot-collector
ClusterName= your-cluster-name Region= your-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 -

Hinweis: Ersetze your-cluster-name durch den Namen deines Clusters und your-cluster-region durch die AWS-Region, in der sich dein Cluster befindet.