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

Lesedauer: 7 Minute
0

Ich möchte Amazon CloudWatch Container Insights konfigurieren, um meine Amazon-Elastic-Kubernetes-Service-Cluster-Metriken (Amazon EKS) anzuzeigen.

Kurzbeschreibung

Bei Verwendung mit Amazon EKS verwendet Container Insights eine containerisierte Version des CloudWatch-Agenten, um alle Container zu finden, die in einem Cluster ausgeführt werden. Container Insights verwendet auch AWS-Distro-für-OpenTelemetry-Collector (ADOT), um Container in einem Cluster zu finden. Anschließend erfasst es Leistungsdaten auf jeder Ebene des Performance-Stacks, z. B. Leistungsprotokollereignisse, die ein eingebettetes Metrikformat verwenden. Anschließend werden diese Daten an CloudWatch Logs unter der Protokollgruppe /aws/containerinsights/cluster-name/performance gesendet, wo CloudWatch aggregierte Metriken auf Cluster-, Knoten- und Pod-Ebene erstellt. Container Insights unterstützt auch das Sammeln von Metriken aus Clustern, die auf AWS Fargate für Amazon EKS bereitgestellt werden. Weitere Informationen finden Sie unter Verwenden von Container Insights.

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 beginnen, überprüfen Sie die folgenden Voraussetzungen:

  • Stellen Sie sicher, dass Ihr EKS-Cluster läuft mit Knoten im Status Bereit, und der Befehl kubectl ist installiert und wird ausgeführt.
  • Stellen Sie sicher, dass die von AWS Identity and Access Management (IAM) verwaltete CloudWatchAgentServerPolicy Ihren Amazon-EKS-Worker-Knoten aktiviert, um Metriken und Protokolle an CloudWatch zu senden. Um Ihre Worker-Knoten zu aktivieren, fügen Sie der IAM-Rolle der Worker-Knoten eine Richtlinie hinzu. Oder verwenden Sie eine IAM-Rolle für Servicekonten für den Cluster und fügen Sie die Richtlinie dieser Rolle hinzu. Weitere Informationen finden Sie unter IAM-Rollen für Servicekonten.
  • Stellen Sie sicher, dass Sie einen Cluster ausführen, der Kubernetes Version 1.18 oder höher unterstützt. Dies ist eine Anforderung von Container Insights für EKS Fargate. Stellen Sie außerdem sicher, dass Sie ein Fargate-Profil definieren, um Pods auf Fargate zu planen.
  • Stellen Sie sicher, dass die IAM-Rolle für die Amazon-EKS-Pod-Ausführung es Komponenten, die auf der Fargate-Infrastruktur ausgeführt werden, ermöglicht, in Ihrem Namen AWS-APIs aufzurufen. 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 ADOT erstellt eine Protokollgruppe mit dem Namen aws/containerinsights/Cluster_Name/performance und sendet die Leistungsprotokollereignisse an diese Protokollgruppe.

Wenn Sie Container Insights für die Erfassung von Metriken einrichten, müssen Sie das CloudWatch-Agent-Container-Image als DaemonSet von Docker Hub bereitstellen. Standardmäßig erfolgt dies als anonymer Benutzer. Dieser Pull könnte einer Ratenbegrenzung unterliegen.

1.    Falls Sie keinen Namespace namens amazon-cloudwatch haben, dann erstellen Sie einen:

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.    Stellen Sie den **cloudwatch-agent-**DaemonSet bereit:

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

Optional: Um den CloudWatch-Agenten aus der Amazon Elastic Container Registry abzurufen, patchen Sie den **cloudwatch-agent-**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 Amazon 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 Servicekonten einen OIDC-Anbieter und eine IAM-Rolle und -Richtlinie. Ordnen Sie dann die IAM-Rolle dem **cloudwatch-agent-**Servicekonto zu:

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 Servicekonten verwenden.

Problembehandlung beim CloudWatch-Kundendienstmitarbeiter

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

kubectl get pods -n amazon-cloudwatch

2.    Führen Sie den folgenden Befehl aus, um die Ereignisse am Ende der Ausgabe zu überprüfen:

kubectl describe pod pod-name -n amazon-cloudwatch

3.    Führen Sie den folgenden 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-Kundendienstmitarbeiter sehen, stellen Sie sicher, dass Ihre IAM-Berechtigungen richtig eingestellt sind.

Weitere Informationen finden Sie unter Voraussetzungen überprüfen.

CloudWatch-Kundendienstmitarbeiter löschen

Führen Sie den folgenden Befehl aus, um den Cloudwatch-Kundendienstmitarbeiter 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: Durch das Löschen des Namespaces werden auch die zugehörigen Ressourcen gelöscht.

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

1.    Führen Sie den folgenden Befehl aus, um den ADOT-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 -

Weitere Anpassungen finden Sie unter Container-Insights-EKS-Infrastrukturmetriken.

2.    Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der Collector läuft:

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

3.    Optional: Standardmäßig wird das **aws-otel-collector-**Image als anonymer Benutzer aus Docker Hub abgerufen. Dieser Pull könnte einer Ratenbegrenzung unterliegen. Um das aws-otel-collector 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 Amazon 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-**Servicekonto zu.

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: Ersetzen Sie ACCOUNT_ID durch Ihre Konto-ID und IAM_ROLE_NAME durch die IAM-Rolle, die Sie für die Servicekonten verwenden.

ADOT löschen

Führen Sie den folgenden Befehl aus, um ADOT 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 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 die folgenden 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 unter Container Insights EKS Fargate.

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

1.    Ordnen Sie ein Kubernetes-Servicekonto 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. Das folgende 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

Hinweis: Ersetzen Sie CLUSTER_NAME durch den Namen Ihres Clusters und REGION durch Ihre AWS-Region.

2.    Führen Sie den folgenden Befehl aus, um den ADOT Collector als Kubernetes StatefulSet bereitzustellen:

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 -

Hinweis: Stellen Sie sicher, dass Sie über ein passendes Fargate-Profil verfügen, um die StatefulSet-Pods auf AWS Fargate bereitzustellen. Ersetzen Sie my-cluster-name durch den Namen Ihres Clusters und my-cluster-region durch die Region, in der sich Ihr Cluster befindet.

3.    Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der ADOT-Collector-Pod läuft:

kubectl get pods -n fargate-container-insights

4.    Optional: Standardmäßig wird das **aws-otel-collector-**Image als anonymer Benutzer aus Docker Hub abgerufen. Dieser Pull könnte einer Ratenbegrenzung unterliegen. Um das aws-otel-collector-Docker-Image auf Amazon ECR abzurufen, patchen Sie adot-collector StatefulSet:

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"}]}}}}'

ADOT löschen

Führen Sie den folgenden Befehl 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 -

Relevante Informationen

Verwendung von Container Insights

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Monaten