IBM Cloud Docs
Private Anwendungen mit Ingress offenlegen

Private Anwendungen mit Ingress offenlegen

Machen Sie mehrere Anwendungen in Ihrem Red Hat® OpenShift® on IBM Cloud® privat zugänglich, 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:
    • Administratorplattform-Zugangsrolle für den Cluster in IBM Cloud Kubernetes Service.
    • Manager Service Access Rolle in allen IBM Cloud Kubernetes Service NamespacesRed 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 Virtual Private Cloud

Wenn Ihr Cluster auf einer klassischen Infrastruktur erstellt wird oder wenn Ihr Cluster auf einer VPC-Infrastruktur erstellt wird und Sie bei der Clustererstellung den Endpunkt für den öffentlichen Cloud-Service 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: TLS-Terminierung mit TLS-Zertifikaten und geheimen Schlüsseln für Kubernetes einrichten

Ihr TLS-Zertifikat muss als geheimer Kubernetes-Schlüssel in jedem Namensbereich gespeichert werden, in dem Ihre Apps vorhanden sind.

Geheime TLS-Schlüssel für angepasste Domänen

Informationen zum Einrichten von geheimen TLS-Schlüsseln für eine Domäne, die Sie selbst erstellt haben, z. B. eine Domäne, die bei einem externen Provider registriert ist, finden Sie unter Geheime TLS-Schlüssel für angepasste Unterdomänen einrichten. Diese Schritte gelten sowohl für klassische als auch für VPC-Cluster.

Geheime TLS-Schlüssel für die von IBMverwaltete Domäne

  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. Wenn Sie die Domäne registrieren, wird automatisch ein TLS-Geheimnis für die Domäne erstellt. 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. Zusätzlich wird ein Ingress-Controller-Dienst erstellt, um den Ingress-Controller mit einer IP-Adresse (klassische Cluster) oder einem VPC-Hostnamen (VPC-Cluster) zu versehen.
    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, den Ihre Anwendung abfragt. 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 eine Ingress-Ressource für jedes Projekt erstellen, das Anwendungen enthält, die Sie bereitstellen möchten.
    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 einen Fehler in Ihrer Ressourcenkonfiguration beschreiben, korrigieren Sie die Werte in Ihrer Ressourcendatei und wenden Sie die Datei für die Ressource erneut 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 Edge-Knoten mit öffentlichem Zugang konfigurieren und eine Virtual Router Appliance konfigurieren.

  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 privaten Cloud-Service aktiviert haben, können Sie den standardmäßigen privaten Ingress-Controller verwenden, um Anwendungen in Ihrem Cluster für Anfragen aus dem privaten Netzwerk freizugeben.

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: TLS-Terminierung mit TLS-Zertifikaten und geheimen Schlüsseln für Kubernetes einrichten

Ihr TLS-Zertifikat muss als geheimer Kubernetes-Schlüssel in jedem Namensbereich gespeichert werden, in dem Ihre Apps vorhanden sind.

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, den Ihre Anwendung abfragt. 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 einen Fehler in Ihrer Ressourcenkonfiguration beschreiben, korrigieren Sie die Werte in Ihrer Ressourcendatei und wenden Sie die Datei für die Ressource erneut 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: Zugriff auf Ihre App

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.