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

Lesedauer: 7 Minute
0

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

Kurzbeschreibung

Wenn Sie Container Insights mit Amazon EKS verwenden, 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 (ADOT) Collector, um Container in einem Cluster zu finden. Container Insights sammelt dann Leistungsdaten auf jeder Ebene des Performance Stacks, z. B. Leistungsprotokollereignisse, die ein eingebettetes Metrikformat verwenden. Anschließend sendet Container Insights diese Daten an CloudWatch-Protokolle unter der Protokollgruppe /aws/containerinsights/cluster-name/performance, 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 for Amazon EKS bereitgestellt werden. Weitere Informationen finden Sie unter Container Insights verwenden.

**Hinweis:**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 finden Sie unter cloudwatch-agent/cloudwatch-agent auf Amazon ECR.

Lösung

Voraussetzungen

  • Ihr Amazon 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 aktiviert Ihre Amazon-EKS-Worker-Knoten, 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 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. Stellen Sie außerdem sicher, dass Sie ein Fargate-Profil definieren, um Pods auf Fargate zu planen.
  • Die Pod-IAM-Rolle von Amazon EKS muss es Komponenten, die auf der Fargate-Infrastruktur ausgeführt werden, ermöglichen, in Ihrem Namen AWS APIs aufzurufen. Beispielsweise muss die IAM-Rolle in der Lage sein, Container Images aus Amazon ECR abzurufen.

Verwenden Sie den CloudWatch Agent, um Container Insights Metriken auf Ihrem EC2 Cluster einzurichten

Der CloudWatch Agent oder ADOT erstellt zunächst eine Protokollgruppe mit dem Namen AWS/ContainerInsights/Cluster_NAME/Performance und sendet dann 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 aus bereitstellen. Standardmäßig erfolgt dies als anonymer Benutzer. Dieser Pull kann einer Ratenbegrenzung unterliegen.

  1. Wenn Sie keinen amazon-cloudwatch Namespace haben, 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
  1. Erstellen Sie ein Dienstkonto für den CloudWatch-Agenten mit dem Namen 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
  1. Erstellen Sie eine Configmap als Konfigurationsdatei für den CloudWatch Agent:
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. Weitere Informationen finden Sie unter Erstellen einer ConfigMap für den CloudWatch Agent.

  1. Stellen Sie das 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 Agent aus der Amazon Elastic Container Registry abzurufen, patchen Sie das 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 Images Tags cloudwatch-agent auf Amazon ECR.

  1. Erstellen Sie für IAM-Rollen für Dienstkonten einen OIDC-Anbieter sowie eine IAM-Rolle und -Richtlinie. Ordnen Sie dann die IAM-Rolle dem cloudwatch-agent-Dienstkonto 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 Dienstkonten verwenden.

Problembehandlung beim CloudWatch Agent

  1. Führen Sie diesen Befehl aus, um die Liste der Pods abzurufen:
kubectl get pods -n amazon-cloudwatch
  1. Führen Sie diesen Befehl aus, um die Ereignisse am Ende der Ausgabe zu überprüfen:
kubectl describe pod pod-name -n amazon-cloudwatch
  1. Überprüfen Sie die Protokolle:
kubectl logs pod-name -n amazon-cloudwatch
  1. Wenn ein CrashLoopBackOff-Fehler für den CloudWatch Agent auftritt, stellen Sie sicher, dass Ihre IAM-Berechtigungen korrekt festgelegt sind. Weitere Informationen finden Sie unter Voraussetzungen überprüfen.

Löschen Sie den CloudWatch Agent

Führen Sie diesen Befehl aus, um den CloudWatch Agent 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.

Verwenden Sie ADOT, um Container-Insights-Metriken auf Ihrem EC2 Cluster einzurichten

  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 Informationen finden Sie unter Container-Insights-EKS -Infrastrukturmetriken.

  1. Führen Sie diesen Befehl aus, um zu überprüfen, ob der Collector läuft:
kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
  1. (Optional) Standardmäßig wird das aws-otel-collector-Image als anonymer Benutzer aus Docker Hub abgerufen. Dieser Pull kann einer Ratenbegrenzung unterliegen. Um das Docker-Image 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 Images Tags cloudwatch-agent auf Amazon ECR.

  1. (Optional) Erstellen Sie für IAM-Rollen für Dienstkonten einen OIDC-Anbieter sowie eine IAM-Rolle und -Richtlinie. Ordnen Sie dann die IAM-Rolle dem aws-otel-sa-Dienstkonto 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 Dienstkonten verwenden.

ADOT löschen

Führen Sie diesen 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 -

Verwenden Sie ADOT, um Container-Insights-Metriken auf einem EKS Fargate Cluster einzurichten

Für Anwendungen, die auf Amazon EKS und AWS Fargate laufen, können Sie ADOT verwenden, um Container Insights einzurichten. Die EKS-Fargate-Netzwerkarchitektur ermöglicht es Pods nicht, direkt das Kubelet auf dem Worker zu erreichen, um Ressourcenmetriken abzurufen. Der ADOT Collector ruft zunächst den Kubernetes API Server auf, um die Verbindung zum Kubelet auf einem Worker-Knoten als Proxy herzustellen. Anschließend sammelt er die Advisor-Metriken vom Kubelet für Workloads auf diesem Knoten.

Der ADOT 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

Jede Metrik ist diesen Dimensionssätzen zugeordnet und wird unter dem CloudWatch Namespace mit dem Namen ** 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 einzusetzen:

  1. Ordnen Sie ein Kubernetes-Dienstkonto einer IAM-Rolle zu. Erstellen Sie eine IAM-Rolle mit dem Namen EKS-ADOT-ServiceAccount-Role, die einem Kubernetes-Dienstkonto mit dem Namen adot-collector zugeordnet ist. Das folgende Hilfsskript benötigt eksctl:
#!/bin/bashCLUSTER_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.

  1. 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 AWS-Region, in der sich Ihr Cluster befindet.

  1. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der ADOT Collector Pod ausgeführt wird:
kubectl get pods -n fargate-container-insights
  1. (Optional) Standardmäßig wird das aws-otel-collector-Image als anonymer Benutzer aus Docker Hub abgerufen. Dieser Pull kann einer Ratenbegrenzung unterliegen. Um das Docker-Image aws-otel-collector 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 diesen 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 -
AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr