NGINX Ingress auf Kubernetes

Voraussetzungen

  • Ein Kubernetes Cluster ist konfiguriert und läuft
  • kubectl ist auf einer Control Plane installiert

Installation helm

helm kann über die Webseite https://get.helm.sh heruntergeladen und installiert werden.

Die folgende Kommandozeile führt dies automatisch durch. Die Versionsnummer sollte entsprechend angepasst sein.

 dnf install -y tar
 curl -L https://get.helm.sh/helm-v3.19.0-linux-amd64.tar.gz| \
      sudo tar xvz -C /usr/local/bin/ --strip-components=1 --wildcards '*/helm'

Installation ingress-nginx

Einrichtung des repositories

Über das Repository stehen die verschiedenen Charts für die Installation zur Verfügung und können auch darüber upgedated werden.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

Erstellen eines Namespaces

Die Installation erfolgt in einem eigenen Namespace. Dieser kann vorab oder beim helm install über den Parameter --create-namespace während der Installation angelegt werden.

kubectl create namespace ingress-nginx

Installation des ingress-nginx

helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --set controller.service.type=NodePort \
  --set controller.kind=DaemonSet --set controller.hostNetwork=true

Prüfen des der Installation

Test des DaemonSet

kubectl get daemonset --namespace ingress-nginx

Test Installation eines nginx

Im folgenden wird ein nginx Webserver installiert und mit einem Ingress versehen.

kubectl create deployment nginx --image=docker.io/nginx:alpine
kubectl expose deployment nginx --type=ClusterIP --port=80
kubectl apply -f - <<MANIFEST
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations: {}
spec:
  ingressClassName: nginx
  rules:
  - host: <node dns name>
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
MANIFEST

Ingress mit Basic Authentication versehen

Durch die Basic Authentication wird sichergestellt, dass nur Benutzer mit entsprechenden Berechtigungen Zugriff auf die Website bekommen.

htpasswd Datei erzeugen

podman run --rm -ti docker.io/library/httpd htpasswd -bn \
  username passwort >htpasswd

htpasswd in Secret ablegen

kubectl create secret generic basic-auth --from-file=auth=htpasswd

Im Ingress müssen nun nur noch die folgenden Annotations hinterlegt werden:

# type of authentication
nginx.ingress.kubernetes.io/auth-type: basic
# name of the secret that contains the user/password definitions
nginx.ingress.kubernetes.io/auth-secret: basic-auth
# message to display with an appropriate context why the authentication is required
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'