IBM Cloud Docs
Warum starten meine Container nicht?

Warum starten meine Container nicht?

Sie bemerken ein oder mehrere der folgenden Probleme:

  • Workerknoten können keine neuen Pods erstellen. Die Pods werden erfolgreich auf den Workerknoten bereitgestellt, aber die Container bleiben im Status ContainerCreating stecken.

  • Wenn Sie oc describe pod <pod> für einen Pod im Status ContainerCreating ausführen, wird ein Ereignis ähnlich einem der folgenden Ereignisse angezeigt.

    Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "XXX": failed to request 1 IPv4 addresses. IPAM allocated only 0
    
    desc = failed to create pod network sandbox ... error adding container to network "k8s-pod-network": cannot allocate new block due to per host block limit
    
  • Wenn Sie den folgenden Befehl ausführen, können ein oder mehrere Pods calico-node auf einem Worker-Knoten nicht gestartet werden und befinden sich im CrashLoopBackOff Status.

    oc logs -n calico-system <calico-node_pod>
    

    Die letzten Zeilen der Protokolle enthalten die folgende Meldung:

    Unable to autoassign an address - pools are likely exhausted. type="ipipTunnelAddress"
    

Wenn keine der in den Symptomen aufgelisteten Nachrichten zu IP-Adressen angezeigt wird, werden Ihre Container möglicherweise nicht gestartet, weil die Registry-Quote erreicht wurde.

Wenn Sie eine der in den Symptomen aufgelisteten IP-adressbezogenen Meldungen sehen, starten Ihre Container möglicherweise nicht, weil der IP-Adress-Manager (IPAM) für das Calico-Plug-in fälschlicherweise feststellt, dass alle Pod-IP-Adressen im Cluster in Gebrauch sind. Da Calico IPAM keine verfügbaren IP-Adressen erkennt, werden neuen Pods im Cluster keine IP-Adressen zugeordnet und Pods können nicht gestartet werden.

Probleme beim Kontingent für Registrys beheben

Virtuelle private Cloud Klassische Infrastruktur

Zum Beheben von Problemen beim Kontingent für Registrys geben Sie Speicher in IBM Cloud Container Registry frei.

Behebung von IP-Adressproblemen

Virtuelle private Cloud Klassische Infrastruktur

Um IP-Adressprobleme zu beheben, geben Sie einzelne IP-Adressen oder Blöcke von IP-Adressen frei, die nicht sauber aus den Calico IPAM-Datensätzen entfernt wurden, damit sie von Pods in Ihrem Cluster wiederverwendet werden können.

Ihr Cluster muss eine unterstützte Version ausführen. Wenn Ihr Cluster eine veraltete oder nicht unterstützte Version ausführt, aktualisieren Sie zunächst Ihren Cluster.

Schritt 1: Individuelle IP-Adressen freigeben

Überprüfen Sie zunächst die einzelnen IP-Adressen, die nicht sauber aus den Calico-IPAM-Datensätzen entfernt wurden, und geben Sie sie frei, so dass sie von Pods in Ihrem Cluster wiederverwendet werden können.

  1. Befolgen Sie die Schritte unter Installieren und Konfigurieren der Calico CLI, um Version 3.18 oder höher des calicoctl-Clients herunterzuladen, die richtige Calico-Konfiguration für Ihren Cluster zu verwenden und zu überprüfen, ob die Calico-Konfiguration für Ihren Zielcluster korrekt funktioniert. Beachten Sie, dass Sie auch dann, wenn Ihr Cluster eine Calico ältere Version von ausführt, weiterhin die Version calicoctl 3.18 verwenden können, um die Befehle in den folgenden Schritten auszuführen.

  2. Überprüfen Sie, ob IP-Adressen existieren, die vom Calico IPAM fälschlicherweise als in Gebrauch erkannt werden.

    calicoctl ipam check
    
  3. Suchen Sie in der Ausgabe nach dem Abschnitt, der die Zeile Scanning for IPs that are allocated but not actually in use... enthält. Wenn IP-Adressen in IPAM zugeordnet sind, aber nicht tatsächlich verwendet werden, fahren Sie mit dem nächsten Schritt fort, um sie freizugeben. In dieser Beispielausgabe können 181 IP-Adressen freigegeben werden.

    ...
    Scanning for IPs that are allocated but not actually in use...
    Found 181 IPs that are allocated in IPAM but not actually in use.
    Scanning for IPs that are in use by a workload or node but not allocated in IPAM...
    Found 0 in-use IPs that are not in active IP pools.
    Found 0 in-use IPs that are in active IP pools but have no corresponding IPAM allocation.
    
    Check complete; found 181 problems.
    
  4. Geben Sie IP-Adressen aus dem Calico IPAM frei, die zuvor einem Pod-Endpunkt zugeordnet wurden. Beachten Sie, dass nach dem Sperren des Datenspeichers in den folgenden Schritten vorhandene Pods weiterhin ausgeführt werden, alle erstellten Pods jedoch im Status ContainerCreating verbleiben und erst gestartet werden können, wenn Sie den Datenspeicher entsperren. Diese Datenspeichersperre stellt sicher, dass die IPAM-Datensätze während der Freigabe von IP-Adressen nicht geändert werden. Weitere Informationen finden Sie in der Calico Open-Source-Dokumentation.

    1. Sperren des Datenspeichers für die Calico-IPAM-Datensätze.

      calicoctl datastore migrate lock
      
    2. Speichern Sie die Ergebnisse der IPAM-Überprüfung.

      calicoctl ipam check -o report.json
      
    3. Nicht verwendete IP-Adressen freigeben. Dieser Prozess kann bis zu 20 Minuten dauern, je nachdem, wie viele IP-Adressen freigegeben werden müssen.

      calicoctl ipam release --from-report=report.json
      
    4. Den Datenspeicher entsperren.

      calicoctl datastore migrate unlock
      
    5. Überprüfen Sie, ob alle ungenutzten IP-Adressen freigegeben sind.

      calicoctl ipam check
      

      Beispielausgabe

      Check complete; found 0 problems.
      
  5. Optional: Um zu überprüfen, ob der Datenspeicher erfolgreich freigeschaltet wurde und IP-Adressen nun für die Zuweisung verfügbar sind, erstellen Sie einen Pod und überprüfen Sie, ob er ordnungsgemäß startet.

    1. Erstellen Sie beispielsweise einen einfachen NGINX-Pod.
      oc run test --image=nginx --generator=run-pod/v1
      
    2. Vergewissern Sie sich, dass der Pod über eine IP-Adresse verfügt und erfolgreich ausgeführt wird.
      oc get po test
      
    3. Löschen Sie den Testpod.
      oc delete pod test
      
  6. Fahren Sie mit dem nächsten Abschnitt fort, um nach ungenutzten IP-Adressblöcken zu suchen.

Schritt 2: IP-Adressblöcke freigeben

Überprüfen Sie als Nächstes, ob ganze Blöcke von IP-Adressen vorhanden sind, die einem Workerknoten zugewiesen sind, aber von diesem nicht verwendet werden, und bereinigen Sie diese.

Wenn einem Workerknoten ein zweiter oder dritter Block von IP-Adressen zugewiesen wird, kann es vorkommen, dass ganze Blöcke von IP-Adressen, die der Workerknoten zuvor verwendet hat, später völlig ungenutzt sind. Wenn Sie einen Workerknoten entfernen oder ersetzen, kann außerdem die Bereinigung des IP-Adressblocks durch Calico IPAM fehlschlagen, weil es keinen Workerknoten gibt, auf dem die calico-kube-controllers vorübergehend laufen können, oder weil es Probleme mit dem CNI-Plugin oder der containerd-Laufzeit gibt, wenn der Workerknoten entfernt oder ersetzt wird.

Die Sicherstellung, dass IP-Blöcke frei sind, ist besonders wichtig für alle klassischen Cluster, auf denen die Kubernetes Version 1.19 oder höher ausgeführt wird, sowie für alle VPC-Cluster. In diesen Clustern ist die Calico-Einstellung strictAffinity auf true gesetzt, wodurch ein Workerknoten nur IP-Adressen verwendet, die aus den zugeordneten IP-Blöcken stammen, anstatt IP-Adressen aus Blöcken zu verwenden, die anderen Workerknoten zugeordnet sind. Im Laufe der Zeit können sich die den Knoten zugewiesenen, aber ungenutzten Blöcke ansammeln, bis den Workerknoten keine IP-Adressblöcke mehr zugewiesen werden können.

  1. Führen Sie die Schritte zum Freigeben einzelner IP-Adressen aus.

  2. Wählen Sie, ob der Datenspeicher für die Calico-IPAM-Datensätze gesperrt werden soll.

    • Wenn Sie den Datenspeicher sperren, werden vorhandene Pods weiterhin ausgeführt, aber alle erstellten Pods verbleiben im Status ContainerCreating und können erst gestartet werden, wenn Sie den Datenspeicher entsperren. Diese Datenspeichersperre stellt sicher, dass keine Pods erstellt werden können, nachdem Sie nach nicht verwendeten Blöcken gesucht haben, aber bevor Sie die Blöcke freigeben.
    • Wenn Sie den Datenspeicher nicht sperren, müssen Sie sofort sicherstellen, dass keine neuen Pods IP-Adressen aus einem freigegebenen Block verwendeten, die von Ihnen gelöscht wurden.
    calicoctl datastore migrate lock
    
  3. Calico-IPAM-Datensätze auflisten. Suchen Sie in der Ausgabe nach Blöcken mit 0 IPS IN USE, was darauf hinweist, dass der Block nicht von seinem zugeordneten Workerknoten verwendet wird.

    calicoctl ipam show --show-blocks
    

    In dieser Beispielausgabe verwendet der Block 172.24.10.64/26 aktuell keine IP-Adressen.

    ...
    Block    | 172.24.10.64/26  |        64 | 0 (0%)     | 64 (100%)  |
    ...
    
  4. Führen Sie für jeden dieser Blöcke die folgenden Schritte aus, um den Block freizugeben.

    1. Vergewissern Sie sicher, dass keine Pods derzeit eine IP-Adresse aus dem Block verwenden.
      oc get pods -A
      
    2. Rufen Sie die BlockAffinity für den Block ab. Ersetzen Sie die Punkte und den Schrägstrich im Block durch Bindestriche (-). Für den Block 172.24.10.64/26 lautet das Format für den folgenden Befehl beispielsweise 172-24-10-64-26.
      oc get blockaffinity | grep <block>
      
    3. Löschen Sie BlockAffinity.
      oc delete blockaffinity <block_affinity>
      
    4. Rufen Sie die IPAMBlock für den Block ab. Ersetzen Sie die Punkte und den Schrägstrich im Block durch Bindestriche (-). Für den Block 172.24.10.64/26 lautet das Format für den folgenden Befehl beispielsweise 172-24-10-64-26.
      oc get ipamblock | grep <block>
      
    5. Löschen Sie IPAMBlock.
      oc delete ipamblock <ipam_block>
      
    6. Wenn Sie den Datenspeicher in Schritt 2 nicht gesperrt haben: Stellen Sie sicher, dass keine Pods direkt vor dem Löschen der BlockAffinity und des IPAMBlock erstellt wurden. Wenn Pods erstellt wurden, müssen Sie die BlockAffinity und den IPAMBlock für diesen Block erneut löschen. Löschen Sie anschließend alle Pods, die eine IP-Adresse in diesem Block verwenden, indem Sie oc delete pod <pod> ausführen, damit der Pod mit einer IP-Adresse aus einem anderen Block neu erstellt wird.
      oc get pods -A
      
    7. Wiederholen Sie diese Schritte für alle anderen Blöcke, die 0 IPS IN USE aufweisen.
  5. Wenn Sie den Datenspeicher in Schritt 2 gesperrt haben: Entsperren Sie den Datenspeicher.

    calicoctl datastore migrate unlock