Zum Hauptinhalt springen

Ingress

Das Ingress System von Kubernetes bietet die Möglichkeit externe HTTP oder HTTPS Requests in den Cluster zu leiten. Es besteht dabei aus der Ingress Ressource und einem sogenannten Ingress Controller, welcher die notwendige Logik implementiert. Wir haben uns dazu entschieden, den HAProxy Ingress Controller als Standard Ingress Controller in nine Managed GKE zu verwenden. Die einzelnen Features dieses Controllers können mittels Annotations in der Ingress Ressource gesteuert werden.

Details

Der HAProxy Ingress Controller erlaubt es externen HTTP/HTTPS Verkehr zu bestimmten Services welche im nine Managed GKE Cluster laufen, zu routen.

Verfügbarkeit

Der HAProxy Ingress Controller ist standardmässig Teil von nine Managed GKE.

warnung

Der Nginx Ingress Controller ist veraltet und wird in einem zukünftigen Release entfernt. Bitte migrieren Sie Ihre Ingress Ressourcen auf den HAProxy Ingress Controller. Weitere Informationen finden Sie im Abschnitt HAProxy Ingress Features.

Nutzung

Die grundlegende Struktur und Nutzung der Ingress Ressource wird in der offiziellen Kubernetes Dokumentation erklärt. Um für die TLS Terminierung ein automatisch generiertes Lets Encrypt Zertifikat zu nutzen, folgen Sie bitte den Instruktionen für "Automatisierte TLS Zertifikate".

DNS Setup

Wildcard DNS domain

Wir stellen eine automatisch generierte Wildcard DNS Domain zur Verfügung. Sie kann für Tests oder in der Entwicklung genutzt werden. Sie können einfach einen beliebigen Hostnamen aus dieser Wildcard Domain nehmen und ihn in Ihrer Ingress Ressource als Hostname nutzen. DNS ist bereits fertig konfiguriert. Die notwendigen Angaben zur Domain finden Sie auf runway unter den Infos zu Ingress.

Ingress DNS

Um eigene DNS Hostnamen konfigurieren zu können, stellen wir einen DNS Eintrag zur Verfügung, welcher immer auf die öffentliche IP des HAProxy Ingress Controllers zeigt. Erstellen Sie einfach in Ihrer eigenen Domain einen CNAME Eintrag welcher auf den von uns bereitgestellten DNS Eintrag zeigt. Die notwendigen Angaben können Sie auch hier auf runway unter den Infos zu Ingress finden.

IngressClass

Um unseren Ingress Controller zu nutzen kann das Feld ingressClassName in der Ingress Ressource auf haproxy gesetzt werden. Alternativ kann das Feld auch weggelassen werden, weil diese bereits als Standard gesetzt ist.

Der veraltete Nginx Ingress Controller ist weiterhin über ingressClassName: nginx verfügbar, wird aber in einem zukünftigen Release entfernt.

Access Logs

Die Access Logs der Ingress Requests können Sie in Grafana in der Loki Explore-Ansicht anschauen. Die Ingress Logs sind unter dem Label app_kubernetes_io_name="haproxy-ingress" verfügbar. Um die Logs einer spezifischen Ingress-Instanz anzuzeigen, können Sie nach dem zusätzlichen Label ingress filtern. Das Label hat das Schema <namespace>-<ingress-name>-<backend-port>. Hier ein Beispiel Query um alle Logs anzuzeigen vom Ingress frontend mit dem Port 80 im Namespace shop-prod:

{app_kubernetes_io_name="haproxy-ingress", ingress="shop-prod-frontend-80"}

Zusätzlich können die Ingress Logs nach diesen Labels gefiltert werden:

  • method die HTTP-Methode des Requests
  • status den HTTP-Status des Requests

Mehr Informationen zur Benutzung von Loki finden Sie im spezifischen Support Artikel.

HAProxy Ingress Features

Der HAProxy Ingress Controller bringt einige Features wie bspw. Rate Limiting, IP Whitelisting, temporäre und permanente Weiterleitungen, etc mit. Alle zur Steuerung dieser Features verfügbaren Konfigurationsschlüssel sind in der offiziellen HAProxy Ingress Controller Dokumentation zu finden. Sie wenden diese Annotations direkt auf Ihr bereits erstelltes Ingress Objekt an.

Nachfolgend finden Sie Dokumentation zu den meist verwendeten Features.

Basic Authentifizierung

Sie können auf einfache Weise Basic Authentifizierung zu ihren Ingress Ressourcen hinzufügen. Folgen Sie dazu einfach den folgenden Schritten:

  1. Setzen Sie ein paar Umgebungsvariablen

    USERNAME=<IHR GEWÜNSCHTER NUTZERNAME>
    SECRET_NAMESPACE=<NAMESPACE IN WELCHEM DIE ZUGANGSDATEN ABGELEGT WERDEN SOLLEN>
    INGRESS_NAMESPACE=<DER NAME DES NAMESPACES IN DEM SICH IHRE INGRESS RESOURCE BEFINDET>
    INGRESS=<DER NAME IHRER INGRESS RESOURCE>
  2. Erstellen Sie ein Kubernetes Secret welche Ihre Zugangsdaten beinhaltet. Sie benötigen das Tool mkpasswd, welches man bspw. im whois Paket in Debian oder Ubuntu findet. Das Secret muss dabei nicht zwingend im selben Namespace wie die Ingress Ressource selbst angelegt werden.

    kubectl create secret generic basic-auth-secret --namespace=$SECRET_NAMESPACE --from-literal=auth=$USERNAME:$(mkpasswd -m sha-512)
  3. Konfigurieren Sie die Ingress Ressource so, dass Ihr erstelltes Secret genutzt wird

    kubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS haproxy-ingress.github.io/auth-secret=$SECRET_NAMESPACE/basic-auth-secret
    kubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS haproxy-ingress.github.io/auth-realm='Authentication required'

Rate limiting

Es stehen einige Möglichkeiten zur Verfügung, gewisse Rate Limits auf ihre Ingress Ressource anzuwenden. Sie können Anfragen pro Sekunde mit der haproxy-ingress.github.io/limit-rps Annotation oder gleichzeitige Verbindungen mit der haproxy-ingress.github.io/limit-connections Annotation begrenzen. Alle verfügbaren Optionen finden Sie in der offiziellen Dokumentation.

Temporäre und permanente Weiterleitungen

Um eine Weiterleitung in Ihrer Ingress Ressource einzurichten nutzen Sie einfach die folgende Annotation:

haproxy-ingress.github.io/redirect-to: <IHRE URL>

Die Weiterleitung nutzt standardmässig den HTTP Status Code 302 (temporär). Um den Status Code zu ändern, zum Beispiel auf 301 für eine permanente Weiterleitung, verwenden Sie:

haproxy-ingress.github.io/redirect-to-code: "301"

HTTPS Weiterleitung

Sobald Ihre Ingress Ressource für TLS konfiguriert ist, findet eine automatische Weiterleitung auf die HTTPS URL des Ingress Objektes statt. Möchten Sie dies verhindern, so nutzen Sie die folgende Annotation:

haproxy-ingress.github.io/ssl-redirect: "false"

IP whitelisting

Um nur bestimmte IP Bereiche zu erlauben, welche auf Ihre Ingress Ressource zugreifen dürfen, können Sie mit Komma getrennte CIDR Blöcke in der folgenden Annotation verwenden:

haproxy-ingress.github.io/allowlist-source-range: <IHRE CIDR BLÖCKE>

Eigenes Standard Backend

Falls der HAProxy Ingress Controller Anfragen erhält welche nicht durch Regeln in den Ingress Ressourcen abgedeckt sind, so beantwortet er diese mit einer HTTP 404 Fehler Seite welche vom Standard Backend bereitgestellt wird. Diese Seite kann den eigenen Bedürfnissen angepasst werden indem ein eigenes Standard Backend zur Verfügung gestellt wird. Anschliessend wird in der Ingress Ressource auf das eigene Standard Backend verwiesen.

Das Standard Backend muss lediglich 2 Bedingungen erfüllen:

  • es muss eine 404 Fehler Seite (bzw. einen 404 HTTP Fehler Code) auf dem "/" Pfad ausliefern
  • es muss auf dem Pfad "/healthz" mit dem HTTP Code 200 antworten

Sobald man sein eigenes Standard Backend im selben Namespace wie die Ingress Ressource zur Verfügung gestellt hat, kann man mit folgender Annotation in der Ingress Ressource darauf verweisen:

haproxy-ingress.github.io/default-backend: <SERVICE NAME DES STANDARD BACKENDS>

SLI Probe

Um die Funktionalität des Ingress Controllers sicherzustellen, nutzen wir einen Service, welcher unter sli-probe.apps-customer.<domain>.ninegcp.ch verfügbar ist.

Veraltet: Nginx Ingress Controller

warnung

Der Nginx Ingress Controller ist veraltet und wird in einem zukünftigen Release entfernt. Bitte migrieren Sie Ihre Ingress Ressourcen auf den oben dokumentierten HAProxy Ingress Controller.

Veraltete Nginx Ingress Dokumentation anzeigen

IngressClass

Um den veralteten Nginx Ingress Controller zu nutzen, setzen Sie das Feld ingressClassName in der Ingress Ressource auf nginx.

Access Logs

Die Nginx Ingress Logs sind unter dem Loki Label app_kubernetes_io_name="ingress-nginx" verfügbar. Beispiel Query:

{app_kubernetes_io_name="ingress-nginx", ingress="shop-prod-frontend-80"}

Spezifische Features

Alle verfügbaren Annotations sind in der offiziellen Nginx Ingress Controller Dokumentation zu finden.

Basic Authentifizierung

kubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS nginx.ingress.kubernetes.io/auth-type=basic
kubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS nginx.ingress.kubernetes.io/auth-secret=$SECRET_NAMESPACE/basic-auth-secret
kubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS nginx.ingress.kubernetes.io/auth-realm='Authentication required'

Rate limiting

Alle verfügbaren Optionen finden Sie in der offiziellen Dokumentation.

Temporäre und permanente Weiterleitungen

# Temporäre Weiterleitung (HTTP 302)
nginx.ingress.kubernetes.io/temporal-redirect: <IHRE URL>
# Permanente Weiterleitung (HTTP 301)
nginx.ingress.kubernetes.io/permanent-redirect: <IHRE URL>

HTTPS Weiterleitung

nginx.ingress.kubernetes.io/ssl-redirect: "false"

IP whitelisting

nginx.ingress.kubernetes.io/whitelist-source-range: <IHRE CIDR BLÖCKE>

Caching

nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_cache static-cache;
proxy_cache_valid 10m;
proxy_cache_use_stale error timeout updating http_404 http_500 http_502 http_503 http_504;
proxy_cache_bypass $http_x_purge;
add_header X-Cache-Status $upstream_cache_status;

Eigenes Standard Backend

nginx.ingress.kubernetes.io/default-backend: <SERVICE NAME DES STANDARD BACKENDS>

Benutzerdefinierte Fehler Seiten

nginx.ingress.kubernetes.io/custom-http-errors: <HTTP FEHLER CODES> # bspw. "404,415,503"

Mehr Informationen finden Sie in der offiziellen Dokumentation.