Multi-Master Kubernetes Cluster with HAProxy

H. Alperen Selcuk
5 min readOct 3, 2022

Bu yazımda multi master bir kubernetes cluster kuracağım.

burada farklı olarak bu kubernetes masterların önüne load balancer olarak bir haproxy koyacağız ve istekleri bu sunucuya yapacağız. bu sayede arkadaki masterlara round-robin olarak isteklerimiz gidecek. bununla birlikte masterları High Avaliable olarak yapmış olacağız.

kurulumları kubeadm ile yapacağım, container runtime olarak containerd CNI olarak da weave-work kullanacağım.

sunucuları RNG cloud üzerinde açacağım. RNG cloud aws benzeri edge cloud hizmeti vermekte. arayüzü gerçekten kullanışlı. bedavaya sadece mail ile kredi kartsız kullanabiliyorsunuz. esktra ihtiyaçlarınızı da anında karşılıyorlar. siz de hızlıca aşağıdaki linkten üye olabilirsiniz.

önce haproxy ve master kurulumları olacak.

kurulumları Ubuntu 18.04 üzerinde yapacağım. bastion host açtım private key i koydum oradan tüm sunuculara erişerek işlem yapacağım

haproxy installation

öncelikle normal apt ile haproxy kuracağız.

apt-get update && apt-get install haproxy -y

haproxy kurduktan sonra kubernetes masterlar için backend ayarlayacağız. frontend haproxy backend master sunucuları IP si olacak.

basit olarak şöyle bir config kullanabiliyoruz. /etc/haproxy/haproxy.cfg dosyasına aşağıdaki confiği masterlarınızın IP si ile beraber gireceğiz.

global
log /dev/log local0 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

stats socket /var/lib/haproxy/stats

defaults
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000

frontend masters
bind *:6443
mode tcp
option tcplog
default_backend masters

backend masters
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server master1 172.31.0.17:6443
server master2 172.31.0.6:6443
server master3 172.31.0.7:6443

girdikten haproxy servisi restart ve enable edelim ve çalıştığından emin olalım.

pre-req

öncelikle bütün sunucularda aşağıdaki işlem yapılır.

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

fstab disable

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

containerd intallation

öncelikle runtime olarak containerd kuralım. aşağıdaki adımları takip edebilirsiniz.

kubernetes components

kubeadm ile kuracağımız için gerekli paketleri yükleyceğiz.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpgecho "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

kubeadm init

normalde kubeadm init ve pod networkü vererek bir cluster kuruyoruz. böyle yaptığımızda master üzerindeki IP yi baz alarak sertifika üretiyor ve master üzerinden kubeapi ye erişebiliyorsunuz

şimdi sertifika üretmesi ve endpoint olması için haproxy i göstereceğiz. çünkü istekler haproxy e gelecek.

kubeadm init --control-plane-endpoint="172.31.0.11:6443" --upload-certs --apiserver-advertise-address=172.31.0.17 --pod-network-cidr=10.222.0.0/16

sonra kurulmasını bekleyeceğiz.

ve master initialize oluyor.

önceki kubeadm init den farklı olarak burada 2 tane join komutu görüyorsunuz.

kubeadm join 172.31.0.11:6443 --token rc2rrn.rnjywh5y71tbuwap \
--discovery-token-ca-cert-hash sha256:e6bc342f89b067577ecd0382e1b66ed53d7764b3e6adc9ae30640396c8eb3277

bu bildiğiniz master a worker node dahil etmek için olan komut.

kubeadm join 172.31.0.11:6443 --token rc2rrn.rnjywh5y71tbuwap \
--discovery-token-ca-cert-hash sha256:e6bc342f89b067577ecd0382e1b66ed53d7764b3e6adc9ae30640396c8eb3277 \
--control-plane --certificate-key a19f21d711bf79bc0399382f3e7f8ce34e68314ea829e196db419ce340ea06e6

bu join komutu ise master1 dışında diğer master2 ve master3 de kullanacağız. yani clustera yeni master dahil etmek için kullandığımız komut olacak.

şimdi master2 ve master3 e gidip join komutu çalıştıracağız.

master2 dahil oldu.

master3 de dahil oldu.

kubeconfig i .kube e koyarak şimdi clusterın durumuna bakalım.

gördüğünüz gibi artık clusterımızda 3 control plane mevcut.

asıl burada kontrol etmemiz gereken haproxy üzerinden clustera erişmek. şimdi öncelikle ha proxy e kubectl yükleyelim.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check

sudo apt-get update

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

master1 den config file ı alıp haproxy e koyduğumuz anda yine clustera erişiyoruz çünkü API istekleri haproxy üzerinden dağılıyor.

şuan haproxy üzerinden masterlara round robin olarak erişiyoruz. herhangi bir masterda bir sorun olsa clustera erişimde sorun yaşanmayacak.

worker tarafı için bir installation yapmayacağım masterlardan tek farkı join komutu oluyor.

umarım yararlı olur.

bir sonraki yazımda görüşmek üzere.

--

--