Ingress
Das Ingress System von Kubernetes ist dazu gedacht, externe HTTP oder HTTPS Requests in den Cluster zu leiten. Es besteht dabei aus der Ingress Ressource selbst und einem sogenannten Ingress Controller, welcher die notwendige Logik implementiert. Wir bieten Nginx Ingress als Managed Controller an, den du im Cockpit in deinen NKE-Cluster deployen kannst. Die einzelnen Features dieses Controllers können ausserdem mittels Annotations in der Ingress Ressource gesteuert werden.
Verfügbarkeit
Nginx Ingress ist als optionaler Service für NKE verfügbar. Der Controller kann über das Cockpit in einen bestehenden NKE Cluster installiert werden.
Nutzung
Die grundlegende Struktur und Nutzung einer Ingress Ressource wird in der offiziellen Kubernetes Dokumentation erklärt.
Ingress DNS Name
Wir stellen einen DNS Eintrag zur Verfügung, welcher immer auf die öffentliche IP deines Nginx Ingress Controllers zeigt. Damit kannst du die Hostnames deiner eigenen Domains an den Ingress verweisen. DNS ist bereits konfiguriert und die notwendigen Angaben findest du in der Ansicht Nginx Ingress im Cockpit.
Zur Nutzung erstelle einfach in deiner eigenen Domain einen Alias oder CNAME Eintrag, welcher auf den von uns bereitgestellten DNS Eintrag zeigt.
Wildcard DNS Name
Zusätzlich stellen wir auch einen Wildcard DNS Namen *.<ingress-dns-name> zur
Verfügung. Er kann für schnelle Tests einer Applikation während der Entwicklung
genutzt werden. Du kannst dazu einen beliebigen Hostnamen aus dem
Wildcard-Bereich nehmen und in deiner Ingress Ressource als Hostname nutzen, um
schnell etwas zum Laufen zu bringen, ohne sich um DNS-Einträge kümmern zu
müssen.
Automatische TLS-Zertifikate
Cert-manager und Let's Encrypt gehören standardmässig vorkonfiguriert zu NKE, sodass ein Ingress mit kostenlosen TLS-Zertifikaten einfach durch das Hinzufügen einer Annotation bewerkstelligt wird.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# this tells cert-manager to issue a certificate for
# all hosts specified in the tls section
kubernetes.io/tls-acme: "true"
name: hello-ingress
spec:
ingressClassName: nginx
rules:
- host: app.example.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-ingress
port:
number: 80
tls:
- hosts:
- app.example.org
secretName: hello-ingress
Access Logs
Die Access Logs der Ingress Requests kannst du in Grafana in der Loki
Explore-Ansicht anschauen. Die Ingress Logs sind unter dem Label
app_kubernetes_io_name="ingress-nginx" verfügbar. Um die Logs einer
spezifischen Ingress-Instanz anzuzeigen, kannst du nach dem zusätzlichen Label
ingress filtern. Das Label hat das Schema
<namespace>-<ingress-name>-<backend-port>. Hier ein Beispiel Query, um alle
Logs vom Ingress frontend mit dem Port 80 im Namespace
shop-prod anzuzeigen:
{app="ingress-nginx",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 findest du im spezifischen Support Artikel.
Nginx Ingress Features
Der Nginx Ingress Controller bietet einige Features wie bspw. Rate Limiting, IP Filtering, Custom Default Backends, temporäre und permanente Weiterleitungen, etc. Alle zur Steuerung dieser Features verfügbaren Annotations sind in der offiziellen Nginx Ingress Controller Dokumentation zu finden.
Nachfolgend findest du die Dokumentation zu den meistverwendeten Features.
Basic Authentifizierung
Du kannst Basic Authentifizierung zu deinen Ingress Ressourcen hinzufügen, indem du die Daten in einem Kubernetes Secret bereitstellst. Folge dazu einfach den folgenden Schritten:
-
Setze einige Umgebungsvariablen
USERNAME=<YOUR USERNAME>SECRET_NAMESPACE=<THE NAMESPACE FOR THE SECRET>INGRESS_NAMESPACE=<THE NAMESPACE OF YOUR INGRESS RESOURCE>INGRESS=<THE NAME OF YOUR INGRESS RESOURCE> -
Erstelle ein Kubernetes Secret, welches deine Authentifizierungsdaten beinhaltet. Du benötigst das Tool
mkpasswd, welches bspw. imwhoisPaket in Debian oder Ubuntu zu finden ist. Das Secret muss dabei nicht zwingend in demselben 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) -
Konfiguriere die Ingress Ressource so, dass dein erstelltes Secret genutzt wird
kubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS nginx.ingress.kubernetes.io/auth-type=basickubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS nginx.ingress.kubernetes.io/auth-secret=$SECRET_NAMESPACE/basic-auth-secretkubectl --namespace=$INGRESS_NAMESPACE annotate ingress $INGRESS nginx.ingress.kubernetes.io/auth-realm='Authentication required'
Rate Limiting
Es stehen einige Möglichkeiten zur Verfügung, gewisse Rate Limits auf deine Ingress Ressource anzuwenden. Alle verfügbaren Optionen findest du in der offiziellen Dokumentation.
Temporäre und permanente Weiterleitungen
Um eine temporäre Weiterleitung in deiner Ingress Ressource einzurichten, nutze einfach die folgende Annotation:
nginx.ingress.kubernetes.io/temporal-redirect: <YOUR URL>
Temporäre Weiterleitungen nutzen den HTTP Status Code 302.
Möchtest du dauerhaft auf eine andere URL weiterleiten, so nutze:
nginx.ingress.kubernetes.io/permanent-redirect: <YOUR URL>
HTTPS Weiterleitung
Sobald deine Ingress Ressource für TLS konfiguriert ist, findet eine automatische Weiterleitung auf die HTTPS URL des Ingress Objektes statt. Möchtest du dies verhindern, so nutze die folgende Annotation:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
IP Filtering
Um nur bestimmte IP Bereiche zu erlauben, welche auf deine Ingress Ressource zugreifen dürfen, kannst du mit Komma getrennte CIDR Blöcke in der folgenden Annotation verwenden:
nginx.ingress.kubernetes.io/whitelist-source-range: <YOUR CIDR RANGE>
Caching
Der Nginx Ingress Controller unterstützt eine einfache Form von Content Caching,
welche nützlich sein kann, um zum Beispiel statischen Inhalt schneller
auszuliefern. Du kannst das Caching pro Ingress Ressource aktivieren, indem du
folgende Annotations in deiner Ingress Definition setzen (unter
metadata.annotations):
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;
In diesem Beispiel werden die Antworten mit den Status Codes 200, 301 und 302
für 10 Minuten gecached. Falls ein anderes Verhalten gewünscht sein sollte, kann
die proxy_cache_valid Option auch mit Status Code vor der Zeit gesetzt werden:
proxy_cache_valid 404 1m;
Diese Option cached 404 Antworten für eine Minute. Ausserdem hast du die
Möglichkeit, den Spezialcode "any" zu nutzen, welcher alle Antworten cached.
Weiterhin können mehrere proxy_cache_valid Optionen kombiniert werden, um
verschiedene Cache-Zeiten für verschiedene Status Codes zu definieren.
Standardmässig ist die Cache-Grösse 100 MB. Solltest du davon abweichende Anforderungen haben, kontaktiere uns gerne.
Um zu überprüfen, ob das Caching funktioniert, kann cURL verwendet werden.
Führe den folgenden Befehl zweimal aus, um im zweiten Output den
Cache-Status zu kontrollieren:
curl --head <URL>
Dies sollte den HTTP-Header x-cache-status: HIT anzeigen.
Falls du Caching nur für einen ausgewählten Unterpfad nutzen möchtest (zum
Beispiel ein Endpunkt unter /static), muss dazu eine separate Ingress
Ressource erstellt werden. Das Caching kann weiter konfiguriert werden über die
proxy_cache Optionen, welche innerhalb von location Blöcken gültig sind.
Weitere Informationen zu verfügbaren Optionen findest du in der nginx proxy_cache Modul-Dokumentation.
Eigenes Standard-Backend
Falls der Nginx 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, die vom Standard-Backend bereitgestellt wird. Du kannst ein eigenes Standard-Backend (+ Kubernetes-Services) zur Verfügung stellen und anschliessend in der Ingress Ressource auf das eigene Standard-Backend verweisen.
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
Die Implementation des Standard-Backends, welches mit dem Nginx Ingress Controller ausgeliefert wird, findest du im ingress-gce 404-Server Quellcode. Dies kann als Beispiel für eigene Implementationen genutzt werden.
Sobald du ein eigenes Standard-Backend im gleichen Namespace wie die Ingress Ressource zur Verfügung gestellt hast, kannst du mit folgender Annotation in der Ingress Ressource darauf verweisen:
nginx.ingress.kubernetes.io/default-backend: <SERVICE NAME OF YOUR DEFAULT BACKEND>
Zusätzliche benutzerdefinierte Fehler-Seiten
Um noch weitere benutzerdefinierte Fehler-Seiten auf dem Standard-Backend anzeigen zu lassen (bspw. eine benutzerdefinierte Seite, falls die Applikation, auf welche der Ingress zeigt, nicht verfügbar ist), kann die folgende zusätzliche Annotation verwendet werden:
nginx.ingress.kubernetes.io/custom-http-errors: <ERROR CODES> # for example: "404,415,503"
Der Nginx Ingress Controller leitet Fehlerinformationen über HTTP Header zum Standard-Backend weiter. Die dort laufende Applikation kann anhand dieser Header spezielle Webseiten ausliefern, welche den aufgetretenen Fehler am besten darstellen. Mehr Informationen zu diesem Feature findest du in der offiziellen Dokumentation. Eine Beispielapplikation, welche die HTTP Header Informationen auswertet und benutzerdefinierte Fehler-Seiten anzeigt, findest du im ingress-nginx custom-error-pages Repository. Diese kann auch als Inspiration für eigene Implementationen dienen.
Statische IPs für Ingress und Egress
Die IP eines jeden Ingress-Controllers ist statisch. Alle Ingress-Ressourcen die
diesen Controller verwenden, teilen sich diese statische IP. Jedoch ist es
möglich, mehrere Ingress-Controller pro NKE-Cluster zu erstellen. Du kannst den
Controller über das Feld ingressClass in der Ingress-Ressource auswählen.
Während die Ingress-IPs statisch bleiben, ist es wichtig zu wissen, dass die Egress-IPs aufgrund betrieblicher Erwägungen dynamisch sind. Insbesondere beim Austausch von Nodes, z. B. bei Upgrades der unterliegenden Betriebssystemversion, initiiert NKE die Erstellung eines neuen Nodes. Die vorhandenen Workloads werden nahtlos auf den neuen Node verschoben, der dann eine neue IP-Adresse erhält. Solltest du statische Egress IPs für deine Cluster Workloads benötigen, so kannst du unser static-egress feature nutzen.
IP Ranges für Egress
Sieh Subnetze an jedem Standort für die aktuellen Egress IP Ranges.