Apps mit Ingress privat veröffentlichen

Stellen Sie mehrere Apps in Ihrem „ Red Hat® OpenShift® on IBM Cloud® “-Cluster privat bereit, indem Sie Ingress-Ressourcen erstellen, die vom Ingress-Controller verwaltet werden.

Voraussetzungen

Bevor Sie mit der Verwendung mit Ingress beginnen, überprüfen Sie die folgenden Voraussetzungen.

  • Für die Einrichtung von Ingress sind die folgenden IBM Cloud IAM-Rollen erforderlich:
    • Zugriffsrolle „ Administrator-Plattform“ für den Cluster unter IBM Cloud Kubernetes Service.
    • Rolle „Manager“ für den Servicezugriff in allen „ IBM Cloud Kubernetes Service “-Namespaces ( Red Hat OpenShift-Projekte).
  • Wenn eine Zone ausfällt, treten möglicherweise sporadisch Fehler in Anforderungen an Apps auf, die vom Ingress-Controller in dieser Zone zugänglich gemacht werden.
  • Um eine hohe Verfügbarkeit zu gewährleisten, werden mindestens zwei Workerknoten pro Zone empfohlen.

Private Bereitstellung von Apps mit einem Public-Cloud-Serviceendpunkt

Klassische Cluster Virtuelle Private Cloud

Wenn Ihr Cluster auf einer klassischen Infrastruktur erstellt wurde oder wenn Ihr Cluster auf einer VPC-Infrastruktur erstellt wurde und Sie bei der Clustererstellung den Endpunkt für den Public-Cloud-Dienst aktiviert haben, wird Ihr Cluster standardmäßig nur mit einem öffentlichen Ingress-Controller erstellt. Wenn Sie Ihre Apps privat zugänglich machen möchten, müssen Sie zunächst einen privaten Ingress-Controller erstellen. Anschließend müssen Sie Ihren Ingress-Controller in einer Unterdomäne registrieren und optional Ihr eigenes TLS-Zertifikat importieren.

Schritt 1: Apps bereitstellen und App-Services erstellen

Stellen Sie als Erstes Ihre Apps bereit und erstellen Sie Kubernetes Services und machen Sie diese zugänglich.

  1. Stellen Sie die App im Cluster bereit. Stellen Sie sicher, dass Sie eine Bezeichnung zu Ihrer Bereitstellung im Metadatenabschnitt Ihrer Konfigurationsdatei hinzufügen, z. B. app: code. Diese Bezeichnung ist zur Identifizierung aller Pods erforderlich, in denen Ihre App ausgeführt wird, damit sie in den Lastausgleich aufgenommen werden können.

  2. Erstellen Sie für jede App-Bereitstellung, die Sie zugänglich machen möchten, einen Kubernetes-Service ClusterIP. Ihre App muss durch einen Kubernetes Service zugänglich gemacht werden, damit sie in den Ingress-Lastausgleich einbezogen wird.

oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

Schritt 2: Richten Sie die „ TLS “-Terminierung mit den Zertifikaten unter TLS und den Geheimnissen unter Kubernetes ein

Ihr „ TLS “-Zertifikat muss in jedem Namespace, in dem sich Ihre Apps befinden, als „ Kubernetes “-Geheimnis gespeichert werden.

TLS Geheimnisse rund um benutzerdefinierte Domains

Um „ TLS “-Geheimnisse für eine von Ihnen selbst erstellte Domain einzurichten, beispielsweise eine bei einem externen Anbieter registrierte Domain, lesen Sie den Abschnitt „ TLS-Geheimnisse für benutzerdefinierte Subdomains einrichten “. Diese Schritte gelten sowohl für klassische Cluster als auch für VPC-Cluster.

TLS Geheimnisse für die von „ IBM “ verwaltete Domain

  1. Listen Sie die vorhandenen Unterdomänen in Ihrem Cluster auf. Kopieren Sie in der Spalte Unterdomäne der Ausgabe die Unterdomäne mit dem höchsten 000<n>-Wert.
    ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_ID
    
    In dieser Beispielausgabe hat die Unterdomäne mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud den höchsten 000<n>-Wert von 0002.
    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0000
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["5678efgh-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0001
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud     ["9012ijkl-us-south.lb.appdomain.cloud"]      None             created                   mycluster-a1b2cdef345678g9hi012j3kl4567890-0002
    
  2. Ändern Sie in der kopierten Unterdomäne den 000<n>-Wert in der Unterdomäne auf 000<n+1>. Beispiel: Der Wert für die Unterdomäne mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud wird in mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloud geändert. n+1 gibt die nächste aufeinanderfolgende Unterdomäne an, die Sie in diesem Cluster erstellen. Diese Unterdomäne werden Sie in späteren Schritten registrieren. Bei der Registrierung der Domain wird automatisch ein „ TLS “-Schlüssel für die Domain generiert. Der Name des geheimen Schlüssels ist eine gekürzte Form der Unterdomäne, z. B. mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.

Schritt 3: Privaten Ingress-Controller erstellen und konfigurieren

Nachdem Sie Ihre Domäne und Ihr TLS-Zertifikat vorbereitet haben, müssen Sie einen privaten Ingress-Controller erstellen und den Controller mit Ihrer Domäne konfigurieren.

  1. Erstellen Sie eine Konfigurationsdatei für einen privaten Ingress-Controller.
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: private-ingress-controller
      namespace: openshift-ingress-operator
    spec:
      #defaultCertificate: If you are using a custom domain, specify the domain certificate
        #name: custom-certs-default
      replicas: 2
      domain: <domain>
      endpointPublishingStrategy:
        loadBalancer:
          scope: Internal
        type: LoadBalancerService
    
  2. Erstellen Sie die IngressController-Ressource im openshift-ingress-operator-Projekt Ihres Clusters. Wenn Sie den IngressController, erstellen, wird automatisch ein privater Ingress-Controller erstellt und im openshift-ingress-Projekt auf der Grundlage der IngressController-Einstellungen bereitgestellt, die Sie im vorherigen Schritt festgelegt haben. Zudem wird ein Ingress-Controller-Dienst erstellt, um den Ingress-Controller über eine IP-Adresse (klassische Cluster) oder einen VPC-Hostnamen (VPC-Cluster) zugänglich zu machen.
    oc create -f private-ingress-controller.yaml -n openshift-ingress-operator
    
  3. Führen Sie den Befehl oc get aus und suchen Sie die IP-Adresse oder den VPC-Hostnamen im Feld EXTERNAL IP des router-private-ingress-controller-Service.
    oc get svc router-private-ingress-controller -n openshift-ingress
    
    Beispielausgabe für klassische Cluster.
    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
    router-private-ingress-controller     LoadBalancer   172.21.57.132    10.XX.XX.XX    80/TCP,443/TCP,1940/TCP      3m
    
    Beispielausgabe für VPC-Cluster:
    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP                             PORT(S)                      AGE
    router-private-ingress-controller     LoadBalancer   172.21.57.132    1234abcd-us-south.lb.appdomain.cloud    80/TCP,443/TCP,1940/TCP      3m
    
  4. Registrieren Sie die externe IP-Adresse oder den VPC-Hostnamen des Service in der Domäne, die Sie zuvor ausgewählt haben.
    • Angepasste Domäne: Stimmen Sie mit Ihrem DNS-Provider das Hinzufügen der externen IP-Adresse des Service router-private-ingress-controller als A-Datensatz (klassische Cluster) oder des VPC-Hostnamens als CNAME (VPC-Cluster) ab, der Ihrer angepassten Domäne zugeordnet wird.
    • Von IBM bereitgestellte Domäne: Erstellen Sie einen DNS-Eintrag für den VPC-Hostnamen des Service router-private-ingress-controller. Wenn Sie den folgenden Befehl ausführen, wird die Unterdomäne, die Sie in der Datei private-ingress-controller.yaml angegeben haben, automatisch generiert und beim Service router-private-ingress-controller registriert. Ein geheimer TLS-Schlüssel für die Domäne wird automatisch in dem von Ihnen angegebenen Projekt generiert, in dem Ihre App ausgeführt wird. Der Name des geheimen Schlüssels ist eine gekürzte Form der Unterdomäne, z. B. mycluster-a1b2cdef345678g9hi012j3kl4567890-0003.
        ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <VPC_hostname> --secret-namespace <project>
        ```
    
    
    

Schritt 4: Ingress-Ressource erstellen

Ingress-Ressourcen definieren die Routing-Regeln, mit denen der Ingress-Controller Datenverkehr an Ihren App-Service weiterleitet.

  1. Definieren Sie eine Konfigurationsdatei für die Ingress-Ressource, die die von IBM bereitgestellte Domäne oder Ihre angepasste Domäne für das Weiterleiten von eingehendem Netzverkehr an die zuvor erstellten Services verwendet.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingressresource
    spec:
      tls:
      - hosts:
        - <subdomain>
        secretName: <custom_secret_name>
      rules:
      - host: <subdomain>
        http:
          paths:
          - path: /<app1_path>
            backend:
                service:
                    name: <app1_service>
                    port:
                        number: 80
          - path: /<app2_path>
            backend:
                serivce:
                  name: <app2_service>
                  port:
                    number: 80
    
    tls
    Wenn Sie TLS verwenden wollen, schließen Sie diesen TLS-Abschnitt in Ihre Ressource ein. Ersetzen Sie <domain> durch Ihre Unterdomäne. Verwenden Sie * nicht für Ihren Host oder lassen Sie die Hosteigenschaft leer, um Fehlschläge während der Ingress-Erstellung zu verhindern.
    Ersetzen Sie <tls_secret_name> durch den geheimen Schlüssel, den Sie zuvor erstellt haben und der Ihr TLS-Zertifikat und Ihren Schlüssel für eine angepasste Domäne enthält, oder durch den geheimen TLS-Schlüssel, der automatisch für eine von IBM bereitgestellte Unterdomäne generiert wurde.
    host
    Ersetzen Sie <domain> durch Ihre Unterdomäne.
    If your cluster has multiple projects where apps are exposed, one Ingress resource is required per project. Sie können in jeder Ressource dieselbe Unterdomäne oder unterschiedliche Unterdomänen verwenden. Wenn Sie beispielsweise eine Platzhalterdomäne verwenden, können Sie diese an den Anfang der Domäne setzen, wie z. B. subdomain1.custom_domain.net.
    Verwenden Sie nicht * für Ihren Host oder lassen Sie die Hosteigenschaft leer, um Fehlschläge während der Ingress-Erstellung zu verhindern.
    path
    Ersetzen Sie „ <app_path> “ durch den Pfad, auf dem Ihre App auf Verbindungen wartet. Der Pfad wird an die von IBM bereitstellte Domäne oder Ihre angepasste Domäne angehängt, um eine eindeutige Route zu Ihrer App zu erstellen. Wenn Sie diese Route in einen Web-Browser eingeben, wird der Netzverkehr an den Ingress-Controller weitergeleitet. Der Ingress-Controller sucht den zugehörigen Service und sendet Netzverkehr an den Service. Daraufhin leitet der Service den Datenverkehr an die Pods weiter, in denen die App ausgeführt wird. Viele Apps überwachen einen bestimmten Pfad nicht, verwenden jedoch den Stammverzeichnispfad und einen bestimmten Port. In diesem Fall definieren Sie den Stammverzeichnispfad als / und geben keinen individuellen Pfad für Ihre App an.
    Geben Sie beispielsweise / als Pfad ein, um http://domain/ zu verwenden. Geben Sie für http://domain/app1_path als Pfad /app1_path ein.
    serviceName
    Ersetzen Sie <app1_service>, <app2_service> usw. durch den Namen der Services, die Sie erstellt haben, um Ihre Apps zugänglich zu machen. Wenn die Apps von Services im Cluster in unterschiedlichen Projekten zugänglich gemacht werden, schließen Sie nur App-Services ein, die sich im selben Projekt befinden. Sie müssen für jedes Projekt, das Apps enthält, die Sie öffentlich zugänglich machen möchten, eine Ingress-Ressource erstellen.
    servicePort
    Der Port, den Ihr Service überwacht. Verwenden Sie denselben Port, die Sie beim Erstellen der Kubernetes Service-Instanz für Ihre App definiert haben.
  2. Erstellen Sie die Ingress-Ressource für Ihren Cluster. Stellen Sie sicher, dass die Ressource im selben Projekt wie die App-Services bereitgestellt wird, die in der Ressource angegeben wurden.

    oc apply -f myingressresource.yaml -n <project>
    
  3. Überprüfen Sie, dass die Ingress-Ressource erfolgreich erstellt wurde. Wenn die Meldungen in den Ereignissen auf einen Fehler in Ihrer Ressourcenkonfiguration hinweisen, korrigieren Sie die Werte in Ihrer Ressourcendatei und wenden Sie die Datei erneut auf die Ressource an.

    oc describe ingress myingressresource
    

Ihre Ingress-Ressource wird im selben Projekt wie die App-Services erstellt und Ihre Apps werden beim Ingress-Controller registriert.

Schritt 5: Über das private Netz auf die App zugreifen

  1. Klassische Cluster: Bevor Sie auf Ihre App zugreifen, stellen Sie sicher, dass Sie auf einen DNS-Service zugreifen können. Um den standardmäßigen externen DNS-Anbieter zu verwenden, müssen Sie die Einträge Edge-Knoten mit öffentlichem Zugriff konfigurieren und ein konfigurieren Virtual Router Appliance vornehmen.

  2. Geben Sie von Ihrem privaten Netz aus die URL des App-Service in einem Web-Browser ein.

    https://<domain>/<app1_path>
    

    Wenn Sie mehrere Apps zugänglich gemacht haben, greifen Sie auf diese Apps zu, indem Sie den an die URL angehängten Pfad ändern.

    https://<domain>/<app2_path>
    

    Wenn Sie eine Platzhalterdomäne verwenden, greifen Sie auf beide Apps über deren eigene Unterdomänen zu.

    http://<subdomain1>.<domain>/<app1_path>
    
    http://<subdomain2>.<domain>/<app1_path>
    

Kann keine Verbindung zu Ihrer App über Ingress hergestellt werden? Versuchen Sie, die Fehlerbehebung bei Ingress durchzuführen.

Apps nur über Private-Cloud-Serviceendpunkt privat in VPC-Clustern zugänglich machen

Wenn Ihr Cluster auf einer VPC-Infrastruktur erstellt wurde und Sie bei der Erstellung des Clusters nur den Endpunkt für den Private-Cloud-Dienst aktiviert haben, können Sie den standardmäßigen privaten Ingress-Controller verwenden, um Anwendungen in Ihrem Cluster für Anfragen aus dem privaten Netzwerk zugänglich zu machen.

Schritt 1: Apps bereitstellen und App-Services erstellen

Stellen Sie als Erstes Ihre Apps bereit und erstellen Sie Kubernetes Services und machen Sie diese zugänglich.

  1. Stellen Sie die App im Cluster bereit. Stellen Sie sicher, dass Sie eine Bezeichnung zu Ihrer Bereitstellung im Metadatenabschnitt Ihrer Konfigurationsdatei hinzufügen, z. B. app: code. Diese Bezeichnung ist zur Identifizierung aller Pods erforderlich, in denen Ihre App ausgeführt wird, damit sie in den Lastausgleich aufgenommen werden können.

  2. Erstellen Sie für jede App-Bereitstellung, die Sie zugänglich machen möchten, einen Kubernetes-Service ClusterIP. Ihre App muss durch einen Kubernetes Service zugänglich gemacht werden, damit sie in den Ingress-Lastausgleich einbezogen wird.

oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

Schritt 2: Richten Sie die „ TLS “-Terminierung mit den Zertifikaten unter TLS und den Geheimnissen unter Kubernetes ein

Ihr „ TLS “-Zertifikat muss in jedem Namespace, in dem sich Ihre Apps befinden, als „ Kubernetes “-Geheimnis gespeichert werden.

Schritt 3: Ingress-Ressource erstellen

Ingress-Ressourcen definieren die Routing-Regeln, mit denen der Ingress-Controller Datenverkehr an Ihren App-Service weiterleitet.

  1. Definieren Sie eine Konfigurationsdatei für die Ingress-Ressource, die die von IBM bereitgestellte Domäne oder Ihre angepasste Domäne für das Weiterleiten von eingehendem Netzverkehr an die zuvor erstellten Services verwendet.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingressresource
    spec:
      tls:
      - hosts:
        - <custom_domain>
        secretName: <custom_secret_name>
      rules:
      - host: <domain>
        http:
          paths:
          - path: /<app1_path>
            backend:
                service:
                  name: <app1_service>
                  port:
                    number: 80
          - path: /<app2_path>
            backend:
                service:
                  name: <app2_service>
                  port:
                    number: 80
    
    tls
    Wenn Sie TLS verwenden wollen, schließen Sie diesen TLS-Abschnitt in Ihre Ressource ein.
    Ersetzen Sie <domain> durch Ihre Unterdomäne. Verwenden Sie nicht * für Ihren Host oder lassen Sie die Hosteigenschaft leer, um Fehler während der Ingress-Erstellung zu verhindern.
    Ersetzen Sie <tls_secret_name> durch den geheimen Schlüssel, den Sie zuvor erstellt haben und der Ihr TLS-Zertifikat und Ihren Schlüssel für eine angepasste Domäne enthält, oder durch den geheimen TLS-Schlüssel, der automatisch für eine von IBM bereitgestellte Unterdomäne generiert wurde.
    host
    Ersetzen Sie <domain> durch die von IBM bereitgestellte Ingress-Unterdomäne oder Ihre angepasste Domäne.
    If your cluster has multiple projects where apps are exposed, one Ingress resource is required per project. Sie können in jeder Ressource dieselbe Unterdomäne oder unterschiedliche Unterdomänen verwenden. Wenn Sie beispielsweise eine Platzhalterdomäne verwenden, können Sie eine Platzhalterunterdomäne an den Anfang der Domäne anhängen, wie z. B. subdomain1.custom_domain.net oder subdomain1.mycluster-<hash>-0000.us-south.containers.appdomain.cloud. Verwenden Sie * nicht für Ihren Host oder lassen Sie die Hosteigenschaft leer, um Fehlschläge während der Ingress-Erstellung zu verhindern.
    path
    Ersetzen Sie „ <app_path> “ durch den Pfad, auf dem Ihre App auf Verbindungen wartet. Der Pfad wird an die von IBM bereitstellte Domäne oder Ihre angepasste Domäne angehängt, um eine eindeutige Route zu Ihrer App zu erstellen. Wenn Sie diese Route in einen Web-Browser eingeben, wird der Netzverkehr an den Ingress-Controller weitergeleitet. Der Ingress-Controller sucht den zugehörigen Service und sendet Netzverkehr an den Service. Daraufhin leitet der Service den Datenverkehr an die Pods weiter, in denen die App ausgeführt wird. Viele Apps überwachen einen bestimmten Pfad nicht, verwenden jedoch den Stammverzeichnispfad und einen bestimmten Port. In diesem Fall definieren Sie den Stammverzeichnispfad als / und geben keinen individuellen Pfad für Ihre App an.
    Geben Sie beispielsweise / als Pfad ein, um http://domain/ zu verwenden. Geben Sie für http://domain/app1_path als Pfad /app1_path ein.
    name
    Ersetzen Sie <app1_service>, <app2_service> usw. durch den Namen der Services, die Sie erstellt haben, um Ihre Apps zugänglich zu machen. Wenn die Apps von Services im Cluster in unterschiedlichen Projekten zugänglich gemacht werden, schließen Sie nur App-Services ein, die sich im selben Projekt befinden. Sie müssen für jedes Projekt, in dem Apps zugänglich gemacht werden sollen, eine Ingress-Ressource erstellen.
    port
    Der Port, den Ihr Service überwacht. Verwenden Sie denselben Port, die Sie beim Erstellen der Kubernetes Service-Instanz für Ihre App definiert haben.
  2. Erstellen Sie die Ingress-Ressource für Ihren Cluster. Stellen Sie sicher, dass die Ressource im selben Projekt wie die App-Services bereitgestellt wird, die in der Ressource angegeben wurden.

    oc apply -f myingressresource.yaml -n <project>
    
  3. Überprüfen Sie, dass die Ingress-Ressource erfolgreich erstellt wurde. Wenn die Meldungen in den Ereignissen auf einen Fehler in Ihrer Ressourcenkonfiguration hinweisen, korrigieren Sie die Werte in Ihrer Ressourcendatei und wenden Sie die Datei erneut auf die Ressource an.

    oc describe ingress myingressresource
    

Ihre Ingress-Ressource wird im selben Projekt wie die App-Services erstellt und Ihre Apps werden beim Ingress-Controller registriert.

Schritt 4: Rufen Sie Ihre App auf

Geben Sie in einem Web-Browser die URL des App-Service an, auf den zugegriffen werden soll.

https://<domain>/<app1_path>

Wenn Sie mehrere Apps zugänglich gemacht haben, greifen Sie auf diese Apps zu, indem Sie den an die URL angehängten Pfad ändern.

https://<domain>/<app2_path>

Wenn Sie eine Platzhalterdomäne verwenden, greifen Sie auf beide Apps über deren eigene Unterdomänen zu.

http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>

Kann keine Verbindung zu Ihrer App über Ingress hergestellt werden? Versuchen Sie, die Fehlerbehebung bei Ingress durchzuführen.