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.
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:
methoddie HTTP-Methode des Requestsstatusden 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:
-
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> -
Erstellen Sie ein Kubernetes Secret welche Ihre Zugangsdaten beinhaltet. Sie benötigen das Tool
mkpasswd, welches man bspw. imwhoisPaket 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) -
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-secretkubectl --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
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.