Ingress nginx controller

Om via DNS namen de workloads van buitenaf (buiten het interne Kubernetes netwerk) te kunnen benaderen, kan gebruik gemaakt worden van Ingress. Hiervoor kan o.a. gebruik gemaakt worden van ‘ingress-nginx‘. De installatie kan uitgevoerd worden met Helm:

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

Ter controle en om te achterhalen wat het externe IP adres is, kan de ingress-nginx-controller service opgevraagd worden:

kubectl get svc ingress-nginx-controller

Dit externe IP adres dient gebruikt te worden om de DNS records naar te laten verwijzen.

Een ingress manifest zal er alsvolgt uitzien:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: go-app-ingress
  namespace: canary
  annotations:
    kubernetes.io/ingress-class: nginx
spec:
  rules:
  - host: app.digitalinfo.nl 
    http:
      paths:
      - backend:
          serviceName: go-app
          servicePort: 8080

Apply de manifest en als de DNS-record juist is ingesteld zal deze host via een browser aangeroepen kunnen worden.

http is niet veilig en liever willen we daar TLS voor gebruiken. Om certificaten te kunnen gebruiken om web-services aan te kunnen roepen met https, is het noodzakelijk om een ‘Certificate Manager‘ te installeren die de afhandeling van certificaten voor zijn rekening neemt. Raadpleeg de volgende installatie handleiding: https://cert-manager.io/docs/installation/kubernetes/ en dat komt neer op het volgende:

kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.2.0/cert-manager.crds.yaml
helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.2.0

Vervolgens hebben we een ‘Cluster Issuer‘ nodig, bijvoorbeeld Let’s Encrypt. Hiervoor dient het volgende manifest:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    email: hier_komt_jouw_emailadres@domain.com
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-secret-staging
    solvers:
    - http01:
        ingress:
          class: nginx

(ipv ‘staging‘ kan ook ‘prod‘ gebruikt worden, zie daarvoor de documentatie op https://cert-manager.io/docs/installation/kubernetes/ voor de juiste server)

Apply de manifest om de cluster-issuer aan te maken.

Nu kan de Ingress aangepast worden zodat een TLS certificate gebruikt gaat worden:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: go-app-ingress
  namespace: canary
  annotations:
    kubernetes.io/ingress-class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-staging
spec:
  tls:
  - hosts:
    - app.digitalinfo.nl
    secretName: go-app-tls
  rules:
  - host: app.digitalinfo.nl 
    http:
      paths:
      - backend:
          serviceName: go-app
          servicePort: 8080

Apply deze manifest over de vorige Ingress en de browser zal nu door Kubernetes naar de https-versie gestuurd worden.