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 der „ calico-node “-Pods auf einem Worker-Knoten nicht gestartet werden und befinden sich im Status „ CrashLoopBackOff “.

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

    Die letzten Zeilen der Protokolle enthalten 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. Falls auf Ihrem Cluster eine veraltete oder nicht mehr unterstützte Version ausgeführt wird, besuchen Sie zunächst Aktualisieren Sie 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 die Befehle in den folgenden Schritten auch dann ausführen können, wenn auf Ihrem Cluster eine ältere Version von „ Calico “ läuft – nutzen Sie dazu einfach die Version „ 3.18 “ von „ calicoctl “.

  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 Open-Source-Dokumentation zu „ Calico “.

    1. Sperren des Datenspeichers für die Calico-IPAM-Datensätze.
        calicoctl datastore migrate lock
        ```
    2. Speichern Sie die Ergebnisse der IPAM-Überprüfung.
    ```sh {: pre}
        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.
    ```sh {: pre}
        calicoctl ipam release --from-report=report.json
        ```
    4. Den Datenspeicher entsperren.
    ```sh {: pre}
        calicoctl datastore migrate unlock
        ```
    5. Überprüfen Sie, ob alle ungenutzten IP-Adressen freigegeben sind.
    ```sh {: pre}
        calicoctl ipam check
        ```
        Beispielausgabe
    
        ```sh {: screen}
        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.
    ```sh {: pre}
        oc get po test
        ```
    3. Löschen Sie den Testpod.
    ```sh {: pre}
        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`.
    ```sh {: pre}
        oc get blockaffinity | grep <block>
        ```
    3. Löschen Sie `BlockAffinity`.
    ```sh {: pre}
        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`.
    ```sh {: pre}
        oc get ipamblock | grep <block>
        ```
    5. Löschen Sie `IPAMBlock`.
    ```sh {: pre}
        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.
    ```sh {: pre}
        oc get pods -A
        ```
    7. Wiederholen Sie diese Schritte für alle anderen Blöcke, die den Wert 0 `IPS IN USE` aufweisen.
    
    
  5. Wenn Sie den Datenspeicher in Schritt 2 gesperrt haben: Entsperren Sie den Datenspeicher.

    calicoctl datastore migrate unlock