Nginx-ingress-controller

From I Will Fear No Evil
Jump to navigation Jump to search

Working with nginx ingress controls

The Nginx ingress controller for kubernetes can be an amazing PITA. If we work with nginx as an application that only does the ingress, it becomes much easier. This also makes a single spot to install the logic that the other application and namespaces can bind to.

Generic Template to create an ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  # Creates information for the ingress
  name: test-ingress
  # namespace must be the same as where you application resides
  namespace: dev
spec:
  ingressClassName: nginx
  rules:
  - host: "demo.apps.mlopshub.com"
    http:
      paths:
        - pathType: Prefix
          path: "/"
          backend:
            service:
              # must match service name completely.  Look in Lens
              name: hello-service
              port:
                # Internal port number to forward to
                number: 80

A specific example to create an SSL based ingress

Note specifically the namespace we are installing the ingress into. This is NOT the namespace of the ingress-controller application.

  • It is critical to note you have to install the ssl certs into the namespace beforehand to get this to work right away
  • in general you want to do your SSL offload at the ingress point, and use straight HTTP internally so you do not have additional SSL certs to fight with. This can be an issue with applications such as ArgoCD itself, as that internally has its own stupid redirect back to a 443 port. That gets disabled in the values.yaml file with an insecure flag for ArgoCD.

Add your SSL certificates to a given namespace, for later use within the ingress object you are creating:

kubectl create secret tls wc-iwillfearnoevil-com --namespace librespeed --key ~/ssl/privkey.pem --cert ~/ssl/cert.pem

Example working SSL ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: librespeed-ingress
  namespace: librespeed
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - librespeed.iwillfearnoevil.com
    secretName: wc-iwillfearnoevil-com
  rules:
  - host: "librespeed.iwillfearnoevil.com"
    http:
      paths:
        - pathType: Prefix
          path: "/"
          backend:
            service:
              name: librespeed
              port:
                number: 80

Using the ingress you just created:

kubectl create -f ./librespeed-ingress-object.yaml

When the SSL expires, or you need to re-add it, you must delete the old secret first and then re-add the certificates. This will need to be done on each of the namespaces.

kubectl delete secret wc-iwillfearnoevil-com -n nginx-ingress
kubectl create secret tls wc-iwillfearnoevil-com --namespace nginx-ingress --key ~/ssl/privkey.pem --cert ~/ssl/cert.pem