Ingress für externe Application Load Balancer


Auf dieser Seite wird erläutert, wie Ingress für externe Application Load Balancer in Google Kubernetes Engine (GKE) funktioniert. Außerdem erfahren Sie, wie Sie Ingress für externes Load-Balancing einrichten und verwenden.

Allgemeine Informationen zur Verwendung des Load-Balancing in GKE finden Sie unter Ingress für externe Application Load Balancer.

Das Google Kubernetes Engine-Netzwerk (GKE) basiert auf Cloud Load Balancing. Mit Cloud Load Balancing kann über eine einzelne Anycast-IP-Adresse das Routing ermittelt werden, um den günstigsten Pfad zum nächstgelegenen Google Cloud-Load-Balancer zu ermitteln.

Unterstützung für Google Cloud-Features

Mit einer BackendConfig können Sie einen externen Application Load Balancer konfigurieren, um Features wie diese zu verwenden:

BackendConfig ist eine benutzerdefinierte Ressource mit Konfigurationsinformationen für Google Cloud-Features. Weitere Informationen zu unterstützten Features finden Sie unter Ingress-Konfiguration.

Unterstützung von WebSocket

Bei externen Application Load Balancern funktioniert das WebSocket-Protokoll ohne Konfiguration.

Wenn Sie das WebSocket-Protokoll verwenden, können Sie für das Zeitlimit einen Wert festlegen, der größer als der Standardwert von 30 Sekunden ist. Beim Senden von WebSocket-Traffic an einen externen Application Load Balancer von Google Cloud wird das Zeitlimit für den Backend-Dienst als die maximale Zeit verstanden, die eine WebSocket-Verbindung geöffnet sein kann – im Leerlauf oder aktiv.

Um den Zeitlimitwert für einen über Ingress konfigurierten Backend-Dienst festzulegen, erstellen Sie ein BackendConfig-Objekt und verwenden Sie die Anmerkung beta.cloud.google.com/backend-config in Ihrem Dienstmanifest.

Informationen zur Konfiguration finden Sie unter Zeitlimit für Backend-Antwort.

Statische IP-Adressen für HTTP(S)-Load-Balancer

Wenn Sie ein Ingress-Objekt erstellen, erhalten Sie eine stabile externe IP-Adresse, über die Clients auf Ihre Dienste und Ihre laufenden Container zugreifen können. Die IP-Adresse ist in dem Sinne stabil, als sie für die Lebensdauer des Ingress-Objekts gilt. Wenn Sie Ihr Ingress löschen und ein neues Ingress aus derselben Manifestdatei erstellen, wird nicht garantiert, dass Sie dieselbe externe IP-Adresse erhalten.

Wenn Sie beim Löschen Ihrer Ingress-Adresse und beim Erstellen einer neuen Adresse eine dauerhafte IP-Adresse beibehalten möchten, müssen Sie eine globale statische externe IP-Adresse reservieren. Fügen Sie dann in Ihrem Ingress-Manifest eine Anmerkung hinzu, die den Namen Ihrer reservierten statischen IP-Adresse angibt. Wenn Sie eine vorhandene Ingress-Ressource so ändern, dass eine statische IP-Adresse anstelle einer sitzungsspezifischen IP-Adresse verwendet wird, ändert GKE möglicherweise die IP-Adresse des Load-Balancers, wenn GKE die Weiterleitungsregel des Load-Balancers neu erstellt.

Angenommen, Sie haben eine globale statische externe IP-Adresse mit dem Namen my-static-address reserviert. Fügen Sie in Ihrem Ingress-Manifest eine Anmerkung kubernetes.io/ingress.global-static-ip-name ein, wie hier gezeigt:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

HTTPS (TLS) zwischen Client und Load-Balancer einrichten

Ein HTTP(S)-Load-Balancer fungiert als Proxy zwischen Ihren Clients und Ihrer Anwendung. Wenn Sie HTTPS-Anfragen von Ihren Clients annehmen möchten, benötigt der Load-Balancer ein Zertifikat, damit er Ihren Clients seine Identität nachweisen kann. Der Load-Balancer benötigt außerdem einen privaten Schlüssel, um den HTTPS-Handshake abzuschließen.

Wenn der Load-Balancer eine HTTPS-Anfrage von einem Client akzeptiert, wird der Traffic zwischen dem Client und dem Load-Balancer mit TLS verschlüsselt. Der Load-Balancer beendet jedoch die TLS-Verschlüsselung und leitet die Anfrage ohne Verschlüsselung an die Anwendung weiter. Informationen zum Verschlüsseln des Traffics zwischen dem Load-Balancer und Ihrer Anwendung finden Sie unter HTTPS zwischen Load-Balancer und Ihrer Anwendung.

Sie können von Google verwaltete SSL-Zertifikate oder Zertifikate verwenden, die Sie selbst verwalten. Weitere Informationen zum Erstellen eines Ingress, der von Google verwaltete Zertifikate verwendet, finden Sie unter Von Google verwaltete SSL-Zertifikate verwenden.

Wenn Sie einen HTTP(S)-Load-Balancer mit einem selbst erstellten Zertifikat und Schlüssel bereitstellen möchten, müssen Sie ein Kubernetes-Secret erstellen. Das Secret enthält das Zertifikat und den Schlüssel. Fügen Sie das Secret dem Feld tls der Ingress-Manifestdatei hinzu, wie im folgenden Beispiel gezeigt:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: SECRET_NAME
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: SERVICE_NAME
            port:
              number: 60000

Dieses Manifest enthält die folgenden Werte:

  • SECRET_NAME: der Name des von Ihnen erstellten Secrets.
  • SERVICE_NAME: der Name Ihres Backend-Dienstes.

Änderungen an Secrets werden regelmäßig abgerufen. Wenn Sie also die Daten im Secret ändern, dauert es maximal 10 Minuten, bis diese Änderungen auf den Load-Balancer angewendet werden.

Weitere Informationen finden Sie unter Mehrere SSL-Zertifikate beim HTTP-Load-Balancing mit Ingress verwenden.

Informationen zum Schutz von HTTPS-verschlüsseltem Ingress für Ihre GKE-Cluster finden Sie unter Secure Ingress.

HTTP deaktivieren

Wenn der gesamte Traffic zwischen dem Client und dem HTTP-Load-Balancer HTTPS verwenden soll, können Sie HTTP deaktivieren. Dazu nehmen Sie die Anmerkung kubernetes.io/ingress.allow-http in Ihr Ingress-Manifest auf. Legen Sie den Wert der Anmerkung auf "false" fest.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: SECRET_NAME
  ...

Dieses Manifest enthält den SECRET_NAME, also den Namen des von Ihnen erstellten Secrets.

Vorinstallierte Zertifikate für Load-Balancer

Als Alternative zur Verwendung von Kubernetes Secrets zum Bereitstellen von Zertifikaten an den Load-Balancer für die HTTP(S)-Beendigung können Sie Zertifikate verwenden, die zuvor in Ihr Google Cloud-Projekt hochgeladen wurden. Weitere Informationen finden Sie in der Beschreibung zur Verwendung vorinstallierter Zertifikate sowie unter Mehrere SSL-Zertifikate in HTTPS-Load-Balancing mit Ingress verwenden.

HTTPS (TLS) zwischen Load-Balancer und Ihrer Anwendung

Ein HTTP(S)-Load-Balancer fungiert als Proxy zwischen Ihren Clients und Ihrer Anwendung. Clients können HTTP oder HTTPS verwenden, um mit dem Load-Balancer-Proxy zu kommunizieren. Die Verbindung vom Load-Balancer-Proxy zu Ihrer Anwendung verwendet standardmäßig HTTP. Wenn Ihre in einem GKE-Pod ausgeführte Anwendung jedoch HTTPS-Anfragen empfangen kann, können Sie den Load-Balancer so konfigurieren, dass bei der Weiterleitung von Anfragen an die Anwendung HTTPS verwendet wird.

Verwenden Sie zum Konfigurieren des Protokolls, das zwischen dem Load-Balancer und Ihrer Anwendung verwendet wird, die Anmerkung cloud.google.com/app-protocols in Ihrem Dienstmanifest. Dieses Dienstmanifest muss type: NodePort enthalten, sofern Sie nicht containernatives Load-Balancing verwenden. Für containernatives Load-Balancing verwenden Sie type: ClusterIP.

Das folgende Dienstmanifest legt zwei Ports fest. Die Anmerkung besagt, dass ein HTTP(S)-Load-Balancer, der auf Port 80 des Dienstes gerichtet ist, HTTP verwenden soll. Wenn der Load-Balancer hingegen auf Port 443 des Dienstes gerichtet ist, sollte er HTTPS verwenden.

Das Dienstmanifest muss in der Portannotation einen name-Wert enthalten. Den Dienstport können Sie nur bearbeiten, wenn Sie auf den zugewiesenen name verweisen und nicht auf seinen targetPort-Wert.

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

Nächste Schritte