Ingress Controller installieren
Ein Ingress Controller nimmt eingehenden HTTP- und HTTPS-Verkehr an einer einzigen externen Adresse entgegen und verteilt ihn anhand von Hostnamen und Pfaden auf die Services im Cluster.
In centron Kubernetes ist kein Ingress Controller vorinstalliert. Sie installieren ihn selbst im Cluster.
Warum ein Ingress Controller?
Ohne Ingress benötigt jeder extern erreichbare Dienst einen eigenen NodePort – also je Dienst einen eigenen Port, den Sie sich merken und in der Firewall freigeben müssen.
Mit einem Ingress Controller genügt ein Eintrittspunkt für beliebig viele HTTP-Dienste, die über Hostnamen und Pfade unterschieden werden. Zusätzlich übernimmt er die TLS-Terminierung zentral, sodass Zertifikate nicht in jeder einzelnen Anwendung gepflegt werden müssen.
Voraussetzungen
- Ein Cluster im Status Running
- Eine geprüfte Verbindung per
kubectl, siehe Mit dem Cluster verbinden - Installiertes Helm
ingress-nginx installieren
Der ingress-nginx-Controller ist die am weitesten verbreitete Wahl.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080 \
--set controller.service.nodePorts.https=30443
Services vom Typ LoadBalancer stehen derzeit nicht zur Verfügung, daher wird der Controller über NodePort veröffentlicht. Die Ports 30080 (HTTP) und 30443 (HTTPS) sind anschließend auf jedem Worker Node geöffnet.
Externe Adresse ermitteln
kubectl get service -n ingress-nginx ingress-nginx-controller
Die Bereitstellung dauert einen Moment. Solange in der Spalte EXTERNAL-IP noch <pending> steht, ist die Adresse nicht vergeben:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.43.201.15 <none> 80:30080/TCP,443:30443/TCP 2m
Diese Adresse hinterlegen Sie anschließend als A-Record im DNS Ihrer Domain.
Installation prüfen
kubectl get pods -n ingress-nginx
kubectl get ingressclass
Der Controller-Pod sollte den Status Running aufweisen, und es sollte eine IngressClass namens nginx existieren.
Ersten Ingress anlegen
Voraussetzung ist ein bereits vorhandenes Deployment mit zugehörigem Service – siehe Erstes Image deployen. Der Service dahinter braucht keinen eigenen NodePort; ClusterIP genügt:
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: ClusterIP
selector:
app: web
ports:
- port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
Anwenden:
kubectl apply -f ingress.yaml
Status prüfen:
kubectl get ingress
kubectl describe ingress web-ingress
Mehrere Dienste über einen Ingress
Genau hierin liegt der Vorteil gegenüber einzelnen NodePorts – mehrere Hosts und Pfade teilen sich einen Eintrittspunkt:
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 8080
Fehlersuche
| Symptom | Mögliche Ursache |
|---|---|
| Controller nicht erreichbar | Prüfen Sie, ob die NodePorts in der Firewall freigegeben sind und der Node über eine erreichbare Adresse verfügt |
Aufruf endet mit 404 | Der angefragte Hostname stimmt nicht mit host im Ingress überein |
Aufruf endet mit 503 | Der referenzierte Service oder dessen Pods sind nicht erreichbar; prüfen Sie kubectl get endpoints <service-name> |
| Ingress bleibt ohne Adresse | ingressClassName fehlt oder passt nicht zur installierten IngressClass |
Logs des Controllers:
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller
Nächste Schritte
Nach der Installation richten Sie die TLS-Verschlüsselung ein: