Kubernetes HaProxy+Keepalived Kurulumu

Deniz TÜRKMEN
8 min readOct 3, 2022

--

Ubuntu 20.04 & On-Premise

Merhabalar,

Bu yazımda Kubernetes Clusterımıza HaProxy ve Keepalived kurulumunu inceliycez.

  • HaProxy -> Load Balancer olarak,
  • Keepalived -> Ip devretme olarak kullancaz.

HaProxy(High Availability Proxy): Open sourcedır. İş yükünü uygunluğuna göre birden çok sunucu üzerine dağıtarak sunucu ortamının performansını ve güvenliğini artırmak için kullanılan bir Tcp/Http yük dengeleyici ve proxy çözümüdür.

  • TCP Proxy: Belirli bir port üzerinden TCP bağlantısı kabul eder ve sunucuya bağlanarak bu port üzerinden iki yönlü trafiğin akmasınıa izin verir.
  • HTTP Reserve Proxy: Client ile Sunucu arasındaki istekleri alan ve bu istekleri sunucuya gönderen ve proxy sunucundan gelen cevapları kendisinden gelmiş gibi yanıtları Client a ileten proxy olarak çalışır.

Örnek senoryamıza bakacak olursak,

  • 3 Master
  • 1 Worker
  • 2 Load balancer sunucusu kurulumunu gerçekleştireceğiz. Aşağıdaki şekilde sunucu detaylarına bakalibilirsiniz.
  • Virtual IP

Not: Virtual IP bizim belirlediğiniz sanal bir ip’dir. Bu ip ile herhangi bir sıkıntıdan dolayı clusterımızda oluşan hatalar ve/veya sıkıntılardan dolayı kurmuş olduğumuz iki load balancer sunucusunda yer değiştirerek trafiği yöneten ip adresi olarak düşenebiliriz.

Örneğimizi VirtualBox üzerinde kurulmuş 6 adet sanal sunucu ile gerçekleştircez.

VirtualBox

İlk olarak Load Balancer sunucularımızı ayarlayalım. Bunun için tek terminalden yönetmek için sunuculara ssh bağlantısı yapıyorum.

  • Load-Balancer-1 -> 192.168.1.29
  • Load-Balancer-2 -> 192.168.1.31

Not: Eğer ssh yüklü değil ise sudo apt install -y openssh-server komutu ile yükleme yapabilirsiniz.

Terminalin sol tarafındaki Load-Balancer-1 sağ tarafındaise Load-balancer-2 sunucuna bağlandığımızı görmekteyiz. HaProxy ve Keepalive kurulumlarını Load Balancer olarak kullancağımız sunuculara kurulumlarını gerçekleştiriyoruz. Bunun için terminalden,

sudo apt install -y haproxysudo apt install -y keepalived

Komutları ile kurulumları gerçekleştirelim. Bizim senaryamızda 2 adet load balancer sunucusu kullandığımız için bu sunuculara kurulumları gerçekleştiriyoruz.

Şimdi de keepalive kurulumuna yapalım.

HaProxy ve Keepalive kurulumu başarılı ile gerçekleştirdik. Şimdi de keepalive ve HaProxy yapılandırmasını yapalım. İlk olarak keepalive ile IP devretmesi için ayarlamayı yapalım.

Yukarıdaki komutu iki load balancer kurulumu yaptığımız sunucuda çalıştırıyoruz. /etc/keepalived/check_apiserver.sh komutu ile dosyayı oluşturup script çalıştırmamız için chmod ile çalıştırma izni veriyoruz.

Bu scripte bilmemiz gereken nokta;

  • Bizim belirlediğimiz Virtual IP adresini vermemizdir. Çünkü bu virtual ip ile load balancer arasında gidip-gelerek ayakta olan ve sıkıntısız trafiği üzerine alan masterı belirleyen ip’dir.

İki sunucuda ilk olarak “root” kullanıcısına geçiyoruz ve bundan sonraki ayarlamaları root kullanıcı ile devam ediyoruz.

ikinci olarak keepalived.conf ayarlıyoruz.

Yukarıdaki keepalived.conf bilmemiz gerekenler;

  • apiserver_check edecek script gösteriyoruz.
  • State backup olarak ayarladım ama siz senaryonuza göre master yada slave olarak ayarlabilirsiniz. Bu ayarla için keepalive dökümanı okuyabilirsiniz.
  • interface ile enps03 sanal bir tane ethernet oluşturuyoruz.
  • Burada en önemli nokta ise virtual ip adresidir.
  • keepalived.conf dosyasında isterseniz priority ile hangi sunucunun öncelikli olarak ayarlanmasını ayarlayabilirsiniz.

Not: Priority yüksek olan önceliklidir.

Şimdide keepalive service ni enable edelim. Bunun için iki sunucuda,

systemctl enable --now keepalivedjournalctl -flu keepalived

Yukarıdaki şekilde görüldüğü gibi load-balancer-1 makinemiz master olarak laod-balancer-2 ise backup olarak ayarlandı.

keepalived status göz atalım.

Şimdide Virtual IP adresimizi kontrol edelim. Yukarıdaki şekilde gözüktüğü üzere master ımız Load-balancer-1 sunucusu bundan dolayı virtual ip miz bu makine üzerinde olmalıdır. Kontrol için terminalden ip a s komutu kullanalım ya da sadace belirlediğimiz interface görmek için ip a s interface_name kullanabiliriz.

Keepalive yapılandırması başarılı şekilde ayarladık. Şimdide HaProxy yapılandırmasını yapalım.Bunun için iki load balancer kurulumu yaptığımız sunucuda aşağıdaki kodu çalıştırıyoruz.

Burada bilmemiz gerekenler,

  • bind olarak kubernetes api server portunu tanımlıyoruz.
  • Load balancer stratejisi için round robin
  • server olarak bizim ileri de kuracağımız kubernetes clusterımızdaki master nodeların hostname adı ve ip sini giriyoruz. Bu yapımızda virtual ip hangi load balancer sunucumuzda ise bu sunucudan master larının hepsine iletişimini sağlıyoruz.

HaProxy enable edip durumuna bakalım. Bunun için,

systemctl enable haproxysystemctl restart haproxysystemctl status haproxy

Evet!!! HaProxy yapılandırmamız başarılı şekilde gerçekleşti.

Şimde de, Kubernetes Clusterımız kurulumu için gerekli ayarları yapmaya başlayalım.

Bunun 3 master 1 worker sunucumuza tek terminalden komutları girmek için ssh bağlantısı gerçekleştiriyorum.

3 Master 1 Worker sunucumuzu yapılandırmaya başlayalım. İlk olarak swap kapatıyoruz. Bunun için root kullanıcı geçerek “swapoff -a” ya da tamamen kapatmak için “vim /etc/fstab” swapfile ‘#’ ile kaldırıyoruz.

Şimdide 4 sunucumuzda firewall kapatalım. Bunun için

systemctl disable --now ufw

4 Sunucumuzda da IPTABLES aktifleştirelim. Bunun için,

4 Sunucumuzda da IPTABLES ayarlarımızı ekleyelim. Bunun için,

Şimdide 4 adet sunucumuza docker kurulumunu yapalım. Bunun için,

sudo apt-get updatesudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-releasecurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg — dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho \ “deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io -y

Diğer yazımdan detaylı olarak docker kurulumunu okuyabilirsiniz.

Kurulumdan sonra versionlarına bakacak olursak.

Şimdi de 4 sunucumuza da kubernetes kurulumunu yapalım. Bunun için,

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
apt list -a kubeadm
---sudo apt install -y kubeadm=1.18.3–00 kubelet=1.18.3–00 kubectl=1.18.3–00

Dilerseniz daha detaylı Kubernetes Kurulumu için yazımı okuyabilirsiniz.

3 Master 1 Worker sunucumuza kubernetes kurulumu gerçekleştirdik. Şimdide masterları birbirine bağlayalım. Bunun için “master-server-1” sunucumuzdan,

sudo kubeadm init --control-plane-endpoint="192.168.1.76:6443" --apiserver-advertise-address=192.168.1.24 --pod-network-cidr=192.168.0.0/24 --upload-certs

Burada bilmemiz gereken en ama en önemli nokta control-plane-endpoint adresidir. Adrese bakacak olursak bizim kendi belirlediğimiz Virtual IP adresidir. Şimdi bu komutu master-server-1 makinemizden çalıştıralım ve diğer node’lara join olabilmemiz için gereken join komutunu alalım.

Master Node ve Worker Node için tokena bakacak olursak.

Şimdide de master-server-1 ve master-server-2 için Master-node token komutu worker-server-1 için de token’ı terminalden çalıştıralım.

Sunucu -> master-server-2,

Sunucu -> master-server-3,

Sunucu -> worker-server1,

Master-server-1 sunucumuzdan kubectl get nodes komutunu çalıştırdığımızda hazır olmadığını görmekteyiz.

Şimdide Kubernetes Clusterımızı için Container Network Interface kuralım. CNI için Weave-Net kurulumun gerçekleştircez.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d ‘\n’)"

kubectl get nodes komutunu tekrar çalıştırdığımızda

Şimdi de sıra geldi HaProxy ve Keepalived test etmeye.

Load-Balancer Virtual IP hangi sunucuda ilk olarak ona bakalım.

Yukarıdaki şekilde görüldüğü gibi load-balancer-1 sunucumuzda Virtual IP aktif.

Test 1:

ilk olarak “worker-server-1” ve “master-server-2” sunucumuzu kapatıyorum.

kubectl get nodes ile nodelarıma baktığımda,

kubectl cluster-info ile durumuna baktığımızda,

Load-balancer yüklü olduğu sunuculara bakarsak Virtual Ip’nin load-balancer2 sunucu geçtiğini görebiliriz.

Şimdi de master-server-2 tekrar ayağa kaldırıyorum.

kubectl get nodes ile baktığımızda;

Not: Load Balancer master sunucu ayarlarını girdiğim için worker ayağa kaldırmıyorum.

Test-2:

Load-balancer sunucumuzda Virtual-IP hangi sunucuda bakalım.

Görüldüğü gibi load-balancer-2 sunucumuzda. Şimdide load-balancer-2 sunucumuzu kapatalım.

ve tekrardan load-balancer-1 sunucumuzda ip a s enp0s3 komutu ile baktığımızda;

Virtual IP nin load-balancer-1 sunucuna geçtiğini ve kubernetes clusterımızın sıkıntısız çalıştığını görmekteyiz.

Load-Balancer-2 sunucumuzu tekrar başlatıyorum.

Test 3:

Kubernetes Clusterımıza durumuna bakalım.

Virtaul IP bakalım hangi sunucuda olduğuna

Görüldüğü gibi Load-Balancer-2 sunucumuzda şimdide Load-Balancer-2 sunucumuzdaki HaProxy durduralım. Bunun için,

systemctl stop haproxy

Load-balancer-1 geçtiğini ve belli bir süreden sonra Kubernetes Clusterımızın ayakta olduğunu görmekteyiz.

Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler.

--

--

Deniz TÜRKMEN
Deniz TÜRKMEN

No responses yet