Klassische Cluster: Warum wird der Ingress-Controller nicht in einer Zone bereitgestellt?

Infrastrukturprovider und Version:

  • Klassisch
  • Red Hat OpenShift Version 4

Wenn Sie oc get svc -n openshift-ingress ausführen, verfügt mindestens eine Zone über keinen öffentlichen Ingress-Controller.

  • Der Service router-default wurde nicht bereitgestellt oder der Service verfügt möglicherweise nicht über eine externe IP-Adresse. In einem Einzelzonencluster wird möglicherweise Folgendes angezeigt:
    NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
    router-default                               LoadBalancer   172.21.47.119   <none>         80:32637/TCP,443:31719/TCP   26m
    router-internal-default                      ClusterIP      172.21.51.30    <none>         80/TCP,443/TCP,1936/TCP      26m
    
  • Wenn Sie über einen Cluster mit mehreren Zonen verfügen, verfügt eine Zone über keinen Ingress-Controllerservice. Beispiel: In einem Multizonen-Cluster mit Worker-Knoten in dal10, dal12, und könnten Sie einen Dienst router-default für und dal10 einen router-dal12 Dienst für sehen dal13``dal12, jedoch keinen router-dal13 Dienst für dal13. Beachten Sie, dass der Ingress-Controller-Dienst in der ersten Zone, in der sich Ihre Worker-Knoten befinden, immer den Namen trägt router-default, während Ingress-Controller-Dienste in den Zonen, die Sie Ihrem Cluster später hinzufügen, Namen wie haben router-dal12. Möglicherweise sehen Sie auch, dass eine Zone über keinen Ingress-Controllerservice verfügt, aber eine andere Zone über mindestens zwei Ingress-Controllerservices.
    NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
    router-default                               LoadBalancer   172.21.47.119   169.XX.XX.XX   80:32637/TCP,443:31719/TCP   26m
    router-dal12                                 LoadBalancer   172.21.47.119   169.XX.XX.XX   80:32637/TCP,443:31719/TCP   26m
    router-internal-default                      ClusterIP      172.21.51.30    <none>         80/TCP,443/TCP,1936/TCP      26m
    

Router-Services werden aus einem der folgenden Gründe bereitgestellt:

  • Wenn keine Ingress-Controllerservices bereitgestellt werden oder den Ingress-Controllerservices keine externe IP-Adresse zugeordnet ist: In Standardclustern werden bei der ersten Erstellung eines Clusters in einer Zone automatisch ein öffentliches VLAN und ein privates VLAN in dieser Zone für Sie in Ihrem IBM Cloud-Infrastrukturkonto bereitgestellt. In dieser Zone wird ein öffentliches portables Subnetz auf dem von Ihnen angegebenen öffentlichen VLAN und ein privates portables Subnetz auf dem von Ihnen angegebenen privaten VLAN angefordert. Bei Red Hat OpenShift on IBM Cloud gilt für VLANs ein Limit von 40 Teilnetzen. Wenn das VLAN des Clusters in einer Zone diese Grenze bereits erreicht hat, schlägt die Bereitstellung der Ingress-Subdomain fehl, und die Bereitstellung des standardmäßigen öffentlichen Ingress-Controllers schlägt ebenfalls fehl. Um anzuzeigen, wie viele Subnetze ein VLAN umfasst, wählen Sie in der Infrastrukturkonsole von IBM Cloud die Option Netzwerk > IP-Verwaltung > VLANs aus. Klicken Sie auf die VLAN-Nummer des VLANs, mit dem Sie Ihren Cluster erstellt haben. Überprüfen Sie den Abschnitt Teilnetze, um zu sehen, ob mehr als 40 Teilnetze vorhanden sind.

  • Wenn eine Zone über keinen Ingress-Controllerservice verfügt: Wenn Ihre Ingress-Controllerservices erstellt werden, werden sie automatisch auf die Zonen in Ihrem Cluster verteilt. Wenn das Netz für die erste Zone, mit der Ihr Cluster erstellt wurde, beim Erstellen der Ingress-Controllerservices nicht bereit ist, wird der Ingress-Controllerservice für diese Zone möglicherweise in einer anderen Zone platziert. In einer Zone können zwei Ingress-Controllerservices erstellt werden und in der ursprünglichen Zone wird kein Ingress-Controllerservice erstellt.

Beheben Sie VLAN-Probleme für Ingress-Controllerservices, die über keine IP-Adresse verfügen, oder Probleme mit dem Ingress-Controllerservice für mehrere Zonen ohne Ingress-Controllerservices.

VLAN-Probleme beheben

So beheben Sie VLAN-Probleme für Ingress-Controllerservices ohne IP-Adresse:

Option 1: Wenn Sie ein neues VLAN benötigen, bestellen Sie dieses, indem Sie sich an den IBM Cloud-Support wenden. Erstellen Sie dann einen Cluster, der dieses neue VLAN verwendet.

Option 2: Wenn Ihnen ein weiteres VLAN zur Verfügung steht, können Sie in Ihrem bestehenden Cluster ein VLAN-Spanning einrichten. Um zu überprüfen, ob VLAN-Spanning bereits aktiviert ist, verwenden Sie den Befehlibmcloud ks vlan spanning get --region REGION. Anschließend können Sie dem Cluster neue Workerknoten hinzufügen, die das andere VLAN mit verfügbaren Teilnetzen verwenden. Erstellen Sie mindestens zwei Worker-Knoten pro Zone. Jetzt sind IP-Adressen verfügbar, sodass die Ingress-Controller automatisch bereitgestellt werden können.

Option 3: Wenn Sie nicht alle Subnetze im VLAN nutzen, können Sie Subnetze im VLAN wiederverwenden, indem Sie sie Ihrem Cluster hinzufügen.

  1. Prüfen Sie, ob das Teilnetz, das Sie verwenden möchten, verfügbar ist. Das Infrastrukturkonto, das Sie verwenden, wird möglicherweise von mehreren IBM Cloud-Konten gemeinsam verwendet. In diesem Fall können Sie nur Informationen zu Ihren Clustern anzeigen, selbst wenn Sie den Befehl ibmcloud oc subnets ausführen, um Teilnetze mit gebundenen Clustern zu sehen. Besprechen Sie sich mit dem Eigner des Infrastrukturkontos, um sicherzustellen, dass die Teilnetze verfügbar sind und nicht von einem anderen Konto oder Team verwendet werden.

  2. Verwenden Sie den Befehl ibmcloud ks cluster subnet add, um ein vorhandenes Teilnetz für Ihren Cluster verfügbar zu machen.

  3. Überprüfen Sie, ob das Teilnetz erfolgreich erstellt und zu Ihrem Cluster hinzugefügt wurde. Das Teilnetz-CIDR wird im Abschnitt für Teilnetz-VLANs aufgeführt.

    ibmcloud ks cluster get --cluster CLUSTER_NAME --show-resources
    

    In dieser Beispielausgabe wurde dem öffentlichen VLAN 2234945 ein zweites Teilnetz hinzugefügt:

    Subnet VLANs
    VLAN ID   Subnet CIDR          Public   User-managed
    2234947   10.xxx.xx.xxx/29     false    false
    2234945   169.xx.xxx.xxx/29    true     false
    2234945   169.xx.xxx.xxx/29    true     false
    
  4. Bestätigen Sie, dass die portierbaren IP-Adressen aus dem Teilnetz, das Sie hinzugefügt haben, für den Ingress-Controller in Ihrem Cluster verwendet werden. Es kann einige Minuten dauern, bis die Services die portierbaren IP-Adressen aus dem neuen Teilnetz verwenden.

    • Keine Ingress-Unterdomäne: Führen Sie ibmcloud ks cluster get --cluster CLUSTER aus, um zu überprüfen, ob Ingress-Unterdomäne gefüllt ist.
    • Ein Ingress-Controller wird nicht in einer Zone bereitgestellt: Führen Sie oc get svc -n openshift-ingress aus, um sicherzustellen, dass der fehlende Ingress-Controller mit einer externen IP-Adresse bereitgestellt wird.

Probleme bei der Bereitstellung des Ingress-Controllerservice für mehrere Zonen beheben

Erstellen Sie einen Ingress-Controller-Dienst in der Zone, in der noch kein Ingress-Controller-Dienst bereitgestellt wurde. Wenn ein doppelter Ingress-Controllerservice anfänglich in einer anderen Zone erstellt wurde, löschen Sie diesen Ingress-Controllerservice nicht.

  1. Erstellen Sie eine YAML-Datei für einen Ingress-Controller-Dienst in der Zone, in der kein Ingress-Controller-Dienst bereitgestellt wurde. Geben Sie dem Ingress-Controllerservice den Namen router-<zone>.

     apiVersion: v1
     kind: Service
     metadata:
       annotations:
         service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
       finalizers:
       - service.kubernetes.io/load-balancer-cleanup
       labels:
         app: router
         ingresscontroller.operator.openshift.io/owning-ingresscontroller: default
         router: router-default
       name: router-<zone>
       namespace: openshift-ingress
     spec:
       externalTrafficPolicy: Cluster
       selector:
         ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
       sessionAffinity: None
       type: LoadBalancer
    
  2. Erstellen Sie den Ingress-Controllerservice in Ihrem Cluster.

    oc create -f router-<zone>.yaml
    
  3. Bestätigen Sie, dass der Ingress-Controllerservice in der richtigen Zone erstellt wurde. Rufen Sie in der Ausgabe die externe IP-Adresse (EXTERNAL IP) ab.

    oc get svc router-<zone> -n openshift-ingress
    

    Beispielausgabe

    NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
    router-dal12                 LoadBalancer   172.21.57.132    169.XX.XX.XX    80/TCP,443/TCP,1940/TCP      3m
    
  4. Rufen Sie die Unterdomäne für Ihren Ingress-Standardcontroller ab. Suchen Sie in der Ausgabe nach der Unterdomäne, die wie <cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud formatiert ist.

    ibmcloud ks nlb-dns ls -c CLUSTER_NAME_OR_ID
    
  5. Registrieren Sie die IP-Adresse des Ingress-Controllerservice bei der Unterdomäne Ihres Ingress-Controllers.

    ibmcloud ks nlb-dns add -c CLUSTER_NAME_OR_ID --ip ROUTER_SVC_IP --nlb-host ROUTER_SUBDOMAIN