Setting Up HAProxy for Kubernetes High Availability

Introduction

Setting up HAProxy for Kubernetes high availability involves configuring HAProxy as a load balancer to distribute incoming traffic across multiple Kubernetes control plane nodes. HAProxy ensures redundancy and fault tolerance by directing requests to healthy nodes, thereby enhancing the availability and reliability of the Kubernetes cluster. This setup optimizes resource utilization and ensures continuous operation even if individual nodes experience failures, thereby supporting seamless scaling and robust performance for containerized applications.

If you are looking to set up a Kubernetes Cluster on your favourite distro, refer below internal URLs

Setting up HAProxy

Set the hostname

# hostnamectl set-hostname haproxy.linuxsysadmins.lan

Install the package to configure the HAProxy

# dnf install haproxy -y

Make sure to backup the original configuration prior to the changes.

# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-original

We have defined status to check the traffic, frontend and backend for the Kubernetes HA setup.

#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats # utilize system-wide crypto-policies ssl-default-bind-ciphers PROFILE=SYSTEM ssl-default-server-ciphers PROFILE=SYSTEM #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option dontlognull option http-server-close option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 5000 timeout client 50000 timeout server 50000 timeout http-keep-alive 10s timeout check 10s maxconn 3000 # status listen stats bind *:9000 mode http stats enable stats hide-version stats uri /stats stats refresh 30s stats realm Haproxy\ Statistics stats auth admin:haproxypassword #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend	kube-apiserver bind	*:6443 mode	tcp tcp-request	inspect-delay 5s tcp-request content accept if { req.ssl_hello_type 1 } default_backend	kube-apiserver #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend	kube-apiserver mode	tcp option	tcp-check balance	roundrobin default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100 server k8smas1 192.168.0.21:6443 check server k8smas2 192.168.0.22:6443 check server k8smas3 192.168.0.23:6443 check #---------------------------------------------------------------------

Check for the Syntax error.

# haproxy -c -V -f /etc/haproxy/haproxy.cfg

Start and enable the HAProxy service

# systemctl start haproxy.service # systemctl enable haproxy.service

Incase, if the service failed to start check for the logs and remediate.

# journalctl -xeu haproxy.service

Firewall Requirement

Allow the traffic out of the box.

# firewall-cmd --add-port={9000,6443}/tcp --permanent # firewall-cmd --reload # firewall-cmd --list-all

Service Validation

To confirm the status of HAProxy page and Kubernetes API port, do a query as follow.

# ss -tunlp | grep "9000\|6443"

The status can be viewed from any web browser by navigating to HAProxy IP.

Setting Up HAProxy for Kubernetes High Availability 1

That’s it, we have completed with setting up a HAProxy Load Balancer for Kubernetes HA setup.