Whenever I’ve needed a Kubernetes Ingress controller in the past I’ve always used Nginx, not because it’s better than everything else but just because I was familiar with it. Outside of Kubernetes I’ve always used HAProxy as my reverse-proxy of choice and been very happy with it, it’s always performed well and been easy to configure. Recently HAProxy released v1.5 of their Ingress controller so I thought it was time to try HAProxy instead of Nginx.
In this article I’m going to show the steps to get the HAProxy Ingress running within Kubernetes and configure it to allow access. I’m going to be using Azure Kubernetes Service but these steps should work for any Kubernetes setup.
I’ve already got Kubernetes setup (Azure makes this easy) however if you don’t you can quickly get a running instance by running the following script (make sure to remove the installation of Nginx and it’s configuration as that’s not needed). We’re going to be using Helm for HAProxy deployment as it makes it really quick and easy to get it running with minimal configuration required, I’m going to presume you have Helm already setup but if not you can follow the steps here. You will also need Kubectl installed and configured.
Let’s start by adding the HAProxy Helm repository by running the following Powershell:
helm repo add haproxytech https://haproxytech.github.io/helm-charts
We can then update the Helm chats
helm repo update
Now we can use Helm to install the HAProxy Ingress Controller. Make sure you update $publicIP with an actual public IP address.
helm install kubernetes-ingress haproxytech/kubernetes-ingress --set controller.service.type=LoadBalancer --set controller.service.loadBalancerIP="$publicIP"
We can check the deployment was successful by running the following kubectl command:
kubectl get deployments
and we should see the following:
We can also check the public IP address was set correctly by getting the services and checking the external IP.
kubectl get services
That all looks good to me!
Now that the HAProxy Ingress Controller is running we can create another deployment before configuring HAProxy to route traffic to it. In this example I’m just going to deploy my basic Helloworld image that I normally use for tutorials
kubectl create deployment helloworld --image tomaustin/helloworldnetcore
Once created expose the deployment:
kubectl expose deployment helloworld --name helloworld --port 80
We can now just configure the Ingress Controller using Kubectl and that should be pretty much it. Save the following to a file and apply it using Kubectl, make sure to update ‘yourdnsnamegoeshere’ with your dns address.
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress namespace: default annotations: haproxy.org/check: "true" spec: rules: - host: yourdnsnamegoeshere http: paths: - path: / backend: serviceName: helloworld servicePort: 80
kubectl apply -f ingress.yml
That should be it! If all went to plan you should be able to navigate to your dns address and see your service
The HAProxy Ingress Controller can do a fair bit so make sure to check out the documentation here. If you encountered any issues then don’t hesitate to get in touch by either leaving a comment or contacting me on Twitter. Thanks!