Zum Hauptinhalt springen

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.

Hinweis

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

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
Hinweis

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

SymptomMögliche Ursache
Controller nicht erreichbarPrüfen Sie, ob die NodePorts in der Firewall freigegeben sind und der Node über eine erreichbare Adresse verfügt
Aufruf endet mit 404Der angefragte Hostname stimmt nicht mit host im Ingress überein
Aufruf endet mit 503Der referenzierte Service oder dessen Pods sind nicht erreichbar; prüfen Sie kubectl get endpoints <service-name>
Ingress bleibt ohne AdresseingressClassName 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:

Verwandte Themen