# 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](https://get.helm.sh)
heruntergeladen und installiert werden.

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

```bash
 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.

```bash
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.

```bash
kubectl create namespace ingress-nginx
```

### Installation des ingress-nginx

```bash
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

```bash
kubectl get daemonset --namespace ingress-nginx
```

### Test Installation eines nginx

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

```bash
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

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

### htpasswd in Secret ablegen

```bash
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'
```
