Wie beseitige ich den CrashLoopBackOff-Status für CloudWatch-Agent- und EKS-Pod-Identity-Agent-Pods?
Der Amazon-CloudWatch-Agent-Pod oder der Amazon-EKS-Pod-Identity-Agent-Pod meines Amazon-Elastic-Kubernetes-Service(Amazon EKS)-Clusters steckt im CrashLoopBackOff-Status fest.
Behebung
Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.
Protokolle überprüfen
Überprüfe zunächst die Protokolle von CloudWatch-Agent und EKS Pod Identity Agent, um Informationen zu dem Problem zu sammeln.
Führe den folgenden Befehl aus, um die CloudWatch-Agent-Protokolle zu überprüfen:
kubectl logs cloudwatch-agent-pod-name -n namespace
Hinweis: Ersetze cloudwatch-agent-pod-name durch den Pod-Namen deines CloudWatch-Agents und namespace durch deinen Namespace-Namen.
Führe den folgenden Befehl aus, um die EKS-Pod-Identity-Agent-Protokolle zu überprüfen:
kubectl logs pod-identity-agent-pod-name -n namespace
Hinweis: Ersetze pod-identity-agent-pod-name durch deinen EKS-Pod-Identity-Agent-Pod-Namen und namespace durch deinen Namespace-Namen.
Suche in der Befehlsausgabe nach Fehlermeldungen, die angeben, warum der Pod abstürzt, z. B. Berechtigungsprobleme, Netzwerkprobleme oder Konfigurationsprobleme.
Probleme mit den CloudWatch-Agent-Berechtigungen beheben
Fehlermeldung Cannot create provider
Du musst die Service-AWS-Kontorolle von AWS Identity and Access Management (IAM) verwenden, um Amazon-EKS-Worker-Knoten die Berechtigung zu erteilen, Metriken und Protokolle an CloudWatch zu senden. Wenn die IAM-Rolle fehlt oder im erforderlichen amazon-cloudwatch-Namespace falsch konfiguriert ist, erhältst du die folgende Fehlermeldung:
„Error: cannot create provider: failed to retrieve credentials: failed to assume role“
Um dieses Problem zu beheben, erstelle eine Servicekonto-Rolle mit dem Namen des cloudwatch-agent.
Führe den folgenden Befehl aus, um eine benutzerdefinierte Servicekonto-Rolle zu erstellen:
eksctl create iamserviceaccount \ --cluster cluster-name \ --namespace amazon-cloudwatch \ --name service-account-name \ --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \ --override-existing-serviceaccounts \ --approve
Hinweis: Ersetze cluster-name durch deinen Amazon-EKS-Clusternamen und service-account-name durch den Namen des benutzerdefinierten Servicekontos.
Erstelle danach eine ConfigMap für CloudWatch-Agent. Wenn du eine benutzerdefinierte Servicekonto-Rolle verwendest, ersetze cloudwatch-agent durch den Namen der Servicekonto-Rolle.
Fehlermeldungen Not authorized to perform: sts:AssumeRole
Wenn sich die Servicekonto-Rolle, die CloudWatch-Agent verwendet, nicht authentifizieren kann, wird eine der folgenden Fehlermeldungen angezeigt:
„Error: AccessDenied: User: arn:aws:sts::[Account-ID]:assumed-role/[Role-Name]/[Session-Name] is not authorized to perform: sts:AssumeRole on resource [Role-ARN]“
-oder-
„Error: AccessDenied: Not authorized to perform sts:AssumeRole“
Stelle sicher, dass du die CloudWatchAgentServerPolicy-Richtlinie an die Servicekonto-Rolle angehängt hast. Um Authentifizierungsprobleme zu identifizieren, überprüfe AWS CloudTrail auf PutLogEvents- und DescribeLogStreams-Ereignisse. Vergewissere dich, dass du das Servicekonto cloudwatch-agent verwendest oder den richtigen benutzerdefinierten Servicekonto-Namen in der YAML-Bereitstellungsdatei.
Führe den folgenden Befehl aus, um die Konfiguration des Servicekontos zu überprüfen:
kubectl get serviceaccount cloudwatch-agent -n amazon-cloudwatch -o yaml
Stelle in der Ausgabe sicher, dass die Metadaten von eks.amazonaws.com/role-arn dem folgenden Beispiel ähneln:
metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::AWS_ACCOUNT_ID:role/role-name
Für Servicekonten für CloudWatch-Agent müssen die folgenden Regeln gelten:
rules: - apiGroups: [""] resources: ["pods", "nodes", "endpoints"] verbs: ["list", "watch"] - apiGroups: [ "" ] resources: [ "services" ] verbs: [ "list", "watch" ] - apiGroups: ["apps"] resources: ["replicasets", "daemonsets", "deployments", "statefulsets"] verbs: ["list", "watch"] - apiGroups: ["batch"] resources: ["jobs"] verbs: ["list", "watch"] - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["get"] - apiGroups: [""] resources: ["nodes/stats", "configmaps", "events"] verbs: ["create", "get"] - apiGroups: [""] resources: ["configmaps"] resourceNames: ["cwagent-clusterleader"] verbs: ["get","update"] - nonResourceURLs: ["/metrics"] verbs: ["get", "list", "watch"]
Führe den folgenden Befehl aus, um die Regeln im Servicekonto zu überprüfen:
kubectl auth can-i --list --as=system:serviceaccount:amazon-cloudwatch:cloudwatch-agent
EKS-Pod-Identity-Agent-Berechtigungsprobleme beheben
Fehlermeldung „Not authorized to perform: eks-auth:AssumeRoleForPodIdentity“ oder Fehlermeldung „Error fetching credentials“
Wenn EKS Pod Identity Agent die IAM-Rolle des Amazon-EKS-Knotens nicht übernehmen kann, erhältst du eine der folgenden Fehlermeldungen:
„Error: AccessDenied: User: arn:aws:sts::[Account-ID]:assumed-role/[Role-Name]/[Session-Name] is not authorized to perform: eks-auth:AssumeRoleForPodIdentity on resource [Cluster]“
-oder-
„Error: "error","msg":"Error fetching credentials: error getting credentials to cache: unable to fetch credentials from EKS Auth: operation error EKS Auth: AssumeRoleForPodIdentity, https response error StatusCode: 403, RequestID: fc66d1ec-33f1-43b0-a617-df1a52adcb63, AccessDeniedException: ","operation":"AssumeRoleForPodIdentity","request-id":"fc66d1ec-33f1-43b0-a617-df1a52adcb63","service":"EKS Auth"“
Um dieses Problem zu beheben, achte darauf, dass die IAM-Richtlinie, die du an die Rolle angehängt hast, die Aktion AssumeRoleForPodIdentity zulässt. Es hat sich bewährt, die von AWS verwaltete Richtlinie AmazonEKSWorkerNodePolicy zu verwenden. Oder du kannst eine benutzerdefinierte Richtlinie hinzufügen, die dem folgenden Beispiel ähnelt:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks-auth:AssumeRoleForPodIdentity" ], "Resource": "*" } ] }
Vergewissere dich außerdem, dass die Service-Kontrollrichtlinien (SCPs) für dein Unternehmen die Aktion AssumeRoleForPodIdentity nicht blockieren.
Wichtig: Wenn du den Pod und das Servicekonto gleichzeitig mit der Pod-Identity-Zuordnung erstellst, treten möglicherweise Probleme auf. Um die Probleme zu beheben, warte nach dem Erstellen der Rolle mindestens 10 Sekunden, um die Rolle dem Pod zuzuordnen.
Netzwerkprobleme von CloudWatch-Agent beheben
Fehlermeldung „Failed to send logs“ oder Fehlermeldung „Error occurs in PutLogEvents“
Wenn CloudWatch-Agent den CloudWatch-Protokollendpunkt nicht erreichen kann, wird eine der folgenden Fehlermeldungen angezeigt:
„2023-03-18T12:00:00Z E! [outputs.cloudwatchlogs] Failed to send logs: RequestError: send request failed caused by: Post "https://logs.us-west-2.amazonaws.com/": dial tcp 52.94.76.32:443: i/o timeout“
-oder-
„2024-11-22T17:00:48Z E! {"caller":"cwlogs@v0.103.0/cwlog_client.go:135","msg":"cwlog_client: Error occurs in PutLogEvents","kind":"exporter","data_type":"metrics","name":"awsemf/containerinsights","error":"RequestError: send request failed\ncaused by: Post \"https://logs.us-east-1.amazonaws.com/\"“
Dieses Problem tritt in der Regel aufgrund von Netzwerkeinschränkungen oder falsch konfigurierten Sicherheitsgruppen auf. Stelle zur Problembeseitigung sicher, dass die Knoten über ein Internet-Gateway ausgehenden Internetzugang haben. Vergewissere dich bei privaten Subnetzen, dass das NAT-Gateway ordnungsgemäß konfiguriert ist. Richte den Virtual-Private-Cloud(VPC)-Endpunkt für CloudWatch-Services ein. Der VPC-Endpunkt muss die Benennungskonvention com.amazonaws.Region.logs verwenden und die Sicherheitsgruppe des Endpunkts muss eingehenden Datenverkehr von der Knoten-Sicherheitsgruppe zulassen.
Um zu bestätigen, dass die Knoten-Sicherheitsgruppen ausgehenden HTTPS-Verkehr zulassen, überprüfe die folgende Konfiguration:
- Typ: HTTPS
- Protokoll: TCP
- Port: 443
- Zielbereich: 0.0.0.0/0
Netzwerkprobleme von EKS Pod Identity Agent beheben
Fehlermeldung „Error retrieving service account token“
Die Pod-Sicherheitsgruppen müssen ausgehenden HTTP-Verkehr auf TCP-Port 80 zur IP-Adresse des Instance-Metadatenservices (169.254.169.254) zulassen. Ist dies nicht der Fall, wird die folgende Fehlermeldung angezeigt:
„Error retrieving service account token: Get "http://169.254.169.254/latest/meta-data/iam/security-credentials/": dial tcp 169.254.169.254:80: connect: connection timed out“
Um dieses Problem zu beheben, vergewissere dich, dass die Pod-Sicherheitsgruppen die folgende Konfiguration verwenden:
- Typ: HTTPS
- Protokoll: TCP
- Port: 80
- Zielbereich: 169.254.169.254/32
Wenn deine Pods einen Proxy verwenden, musst du für IPv4 169.254.170.23 und für IPv6 [fd00:ec2::23] hinzufügen. Ändere die Umgebungsvariablen (env) no_proxy oder NO_PROXY in der YAML-Datei für die Pod-Bereitstellung.
Beispiel für eine YAML-Datei für die Pod-Bereitstellung:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: my-namespace spec: template: spec: containers: - name: my-container image: my-app-image env: - name: HTTP_PROXY value: "http://proxy.example.com:3128" - name: HTTPS_PROXY value: "http://proxy.example.com:3128" - name: NO_PROXY value: "localhost,127.0.0.1,169.254.170.23,[fd00:ec2::23]"
Führe danach den folgenden Befehl aus, um deine Änderungen zu übernehmen:
kubectl apply -f deployment.yaml
Führe den folgenden Befehl aus, um die Einstellung NO_PROXY zu überprüfen:
kubectl exec -it pod-name -n namespace -- env | grep -i no_proxy
Hinweis: Ersetze pod-name durch den Pod-Namen und namespace durch den Namespace-Namen.
Achte darauf, dass die Ausgabe dem folgenden Beispiel ähnelt:
NO_PROXY=localhost,127.0.0.1,169.254.170.23,[fd00:ec2::23]
Probleme mit der CloudWatch-Agent-Konfiguration beheben
Führe zur Ermittlung von Problemen mit der Konfiguration oder den Ressourcen für den Pod den folgenden Befehl aus, um den detaillierten Status des Pods zu überprüfen:
kubectl describe pod pod-name -n namespace
Führe danach ausgehend von der Fehlermeldung, die du erhältst, die folgenden Schritte zur Fehlerbehebung durch.
Fehlermeldung Amazon/cloud-watch-agent:1 247345.36b249270" already present on machine
Wenn du cloudwatch-agent falsch konfiguriert hast, wird die folgende Fehlermeldung angezeigt:
„Normal Pulled 14m (x307 over 26h) kubelet Container image "amazon/cloudwatch-agent:1.247345.36b249270" already present on machine Warning BackOff 4m10s (x7130 over 26h) kubelet Back-off restarting failed container aws-cloudwatch-metrics in pod aws-cloudwatch-metrics-4jz88_kube-system(ad6f68f0-7df0-435f-b101-2be05df84eb2)“
Um dieses Problem zu beheben, stelle sicher, dass du die cloudwatch-agent-Konfigurationsdateien mit der richtigen AWS-Region sowie den richtigen Protokollen und Metriken konfiguriert hast. Suche auch nach Feldern, die nicht gültig sind oder in denen Parameter fehlen.
Gehe wie folgt vor, um zu überprüfen, ob du die richtige Image-Version verwendest:
-
Führe den folgenden Befehl aus, um alle Pods aufzulisten, auf denen CloudWatch-Agent ausgeführt wird:
kubectl get pods -n amazon-cloudwatchHinweis: Wenn du einen benutzerdefinierten Namespace verwendest, ersetze amazon-cloudwatch durch den Namespace-Namen.
-
Führe den folgenden Befehl aus, um die Image-Version zu überprüfen:
kubectl describe pod pod-name -n amazon-cloudwatchHinweis: Ersetze pod_name durch den Namen deines Pods. Wenn du einen benutzerdefinierten Namespace verwendest, ersetze amazon-cloudwatch durch den Namespace-Namen.
-
Überprüfe in der Ausgabe die Versionsnummer des Images:
Containers: cloudwatch-agent: Image: public.ecr.aws/cloudwatch-agent/cloudwatch-agent:1.300017.0b337Die neueste Version des CloudWatch-Agents findest du unter Releases auf der GitHub-Website.
-
Wenn du eine frühere Version verwendest, führe den folgenden Befehl aus, um die Image-Version auf den neuesten Stand zu bringen:
kubectl set image daemonset/aws-cloudwatch-agent \ -n amazon-cloudwatch \ cloudwatch-agent=public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest-versionHinweis: Ersetze latest-version durch die neueste Image-Version.
-
Führe den folgenden Befehl aus, um die Bereitstellung neu zu starten:
kubectl rollout restart daemonset aws-cloudwatch-agent -n amazon-cloudwatch
Wenn du das Amazon-CloudWatch-Observability-EKS-Add-on verwendest, aktualisiere das Add-on auf die neueste Version.
OOM-Fehler
Wenn für deinen Container kein Speicher mehr verfügbar ist, wird die folgende Fehlermeldung angezeigt:
„Warning OOMKilled kubelet Container was killed due to OOM
Warning Failed kubelet Container failed to start: Back-off restarting failed container“
Um dieses Problem zu beheben, überprüfe die Ressourcenanforderungen und Kontingente (Limits), die du in der Pod-Bereitstellungsdatei definiert hast.
Beispiel für eine Pod-Bereitstellungsdatei:
kubectl get pod cloudwatch-agent-xyz123 -n amazon-cloudwatch -o yaml | grep -A10 'resources:' If limits are too low, update them in the DaemonSet: resources: requests: cpu: 100m memory: 200Mi limits: cpu: 200m memory: 400Mi Apply the changes: kubectl apply -f cloudwatch-agent-daemonset.yaml
Führe den folgenden Befehl aus, um die Anforderungen und Kontingente zu aktualisieren:
kubectl edit daemonset aws-cloudwatch-agent -n amazon-cloudwatch resources: requests: cpu: 100m memory: 200Mi limits: cpu: 200m memory: 400Mi
Führe den folgenden Befehl aus, um die Änderungen zu übernehmen:
kubectl rollout restart daemonset aws-cloudwatch-agent -n amazon-cloudwatch
Führe den folgenden Befehl aus, um sicherzustellen, dass deine Knoten über ausreichend Ressourcen verfügen:
kubectl top nodes
Wenn die CPU- oder Speicherauslastung hoch ist, führe den folgenden Befehl aus, um den Cluster zu skalieren:
kubectl scale nodegroup --name nodegroup-name --replicas=new-size
Hinweis: Ersetze nodegroup-name durch den Namen deiner Knotengruppe und new-size durch die neue Knotengruppengröße.
Konfigurationsproblemen mit EKS Pod Identity Agent beheben
Fehlermeldung Unable to start server
Wenn du EKS Pod Identity Agent nicht richtig konfiguriert hast, wird möglicherweise die folgende Fehlermeldung angezeigt:
„{"bind-addr":"[fd00:ec2::23]:80","level":"info","msg":"Starting server...","time":"2024-02-05T17:52:40Z"}{"bind-addr":"[fd00:ec2::23]:80","level":"fatal","msg":"Unable to start server: listen tcp [fd00:ec2::23]:80: socket: address family not supported by protocol","time":"2024-02-05T17:52:40Z"}2024/02/05 17:52:40 running command: exit status 1“
Um dieses Problem zu beheben, vergewissere dich, dass du die Anforderungen von Amazon EKS Pod Identity Agent erfüllst.
Stelle sicher, dass du die neueste Add-on-Version verwendest, um Probleme mit der Versionskompatibilität zu reduzieren. Führe den folgenden AWS-CLI-Befehl describe-addon-versions aus, um die neueste verfügbare Version herauszufinden:
aws eks describe-addon-versions --kubernetes-version 1.31 --addon-name eks-pod-identity-agent
Hinweis: Ersetze 1.31 durch deine Cluster-Version.
Führe den folgenden Befehl update-addon aus, um das Add-on zu aktualisieren:
aws eks update-addon --cluster-name my-cluster --addon-name eks-pod-identity-agent --addon-version version-number --resolve-conflicts PRESERVE
Hinweis: Ersetze my-cluster durch deinen Cluster-Namen und version-number durch die Add-on-Version.
- Themen
- Containers
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor einem Jahr
AWS OFFICIALAktualisiert vor einem Jahr