Kubernetes 1.24 HA(highly available) cluster kurulumu

Bu yazımda sizlere HAProxy ve Keepalived kullanarak nasıl “highly available” bir Kubernetes cluster’ı kurabileceğinizi anlatacağım.

Gerçekleştirmek istediğimiz yapı 2 adet load balancer, 3 adet master node ve 3 adet de worker node içeriyor.

Bu cluster’da gerçekleşmek istediğimiz senaryoda load balancer node’larından birini kaybetmemiz durumunda ve/veya cluster’ımızın master node’larından birini kaybetmemiz durumunda sistemin kesintiye uğramadan çalışmasını sağlayacağız

Gerçekleştirmek istediğimiz yapıyı daha iyi kavrayabilmek adına tasarladığım mimari görselini şöyle göstereyim:

Cluster Design

Ön Gereksinimler:

  • Node’lar internete ve birbirlerine erişebilmeliler.
  • Master ve worker node’lar minimum 2 GB RAM ve 2 CPU’ya sahip olmalılar (Production seviyesindeki ortamlar daha fazla kaynağa ihtiyaç duyabilir).
  • Node’lar üzerinde root seviyesinde işlem gerçekleştirebiliyor olmalıyız.
  • Load-balancer node’ları üzerindeki Keepalived tarafından yönetilecek bir adet boş sanal IP adresi (Ben 10.190.1.70 kullandım.)

Load Balancer’ların Kurulumu

Her iki load balancer node’unda da aşağıdaki komutu çalıştırarak Keepalived ve HAProxy paketlerini kuruyoruz.

apt update && apt install -y keepalived haproxy

Sonrasında her iki load balancer node’unda da Keepalived konfigürasyonlarını yapmamız gerekiyor.

API server’ın çalışıp çalışmadığını kontrol edebilmek bir kontrol script’ine ihtiyacımız var. Aşağıda yer alan komutun 10 ve 11 numaralı satırlarını kendi belirlediğiniz sanal IP adresinize göre düzenleyip her iki load balancer node’u üzerinde de çalıştırın.

Şimdi her iki load balancer node’u üzerinde de keepalived config dosyasını oluşturmamız gerekiyor. 13 numaralı satırı network interface adınıza göre, 22 numaralı da satırı belirlemiş olduğunuz sanal ip adresinize göre düzenleyip çalıştırın.

Bu işlemi de yaptıktan sonra keepalived servisini aktif edelim.

systemctl enable --now keepalived

HAProxy Konfigürasyonu

Şimdi HAProxy konfig dosyasını güncellememiz gerekiyor. Aşağıdaki komutun 15, 16 ve 17 numaralı satırlarını master node’larınızın hostname ve IP adresi bilgilerine göre düzenleyip her iki load balancer node’u üzerinde de çalıştırın.

Çalıştırdıktan sonra HAProxy servisini aktif edip yeniden başlatalım.

systemctl enable haproxy && systemctl restart haproxy

Master ve Worker Node Konfigürasyonları

Cluster’ı kurmaya başlamadan önce bütün master ve worker node’larını hazır hale getirmemiz gerekiyor. Sırayla başlayalım.

Buradaki komutları bütün master ve worker node’larında çalıştırın.

  1. Swap’i kapatalım.
swapoff -a; sed -i '/swap/d' /etc/fstab

2. Firewall’ı devre dışı bırakalım.

systemctl disable --now ufw

3. Gerekli kernel modüllerini aktif edelim.

{
cat >> /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
}

4. Gerekli kernel ayarlarını yapalım

{
cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl --system
}

5. Container runtime için containerd kurulumunu yapalım.

(Farklı bir container runtime kullanmak istiyorsanız: https://kubernetes.io/docs/setup/production-environment/container-runtimes/)

{
apt update
apt install -y containerd apt-transport-https
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
systemctl restart containerd
systemctl enable containerd
}

6. Kubernetes bileşenlerini kurabilmek için gerekli repository’yi ekleyelim.

{
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
}

7. Gerekli Kubernetes bileşenlerini kuralım.

{
apt update
apt install -y kubeadm=1.24.0-00 kubelet=1.24.0-00 kubectl=1.24.0-00
}

Hatırlatma: Yukarıdaki 7 aşama bütün master ve worker node’larında gerçekleştirilmelidir.

Kubernetes Cluster’ı Oluşturma

Bütün node’larda gerekli paket kurulumlarını ve konfigürasyonlarını yaptığımıza göre artık Kubernetes cluster’ımızı oluşturma aşamasına geçebiliriz.

master01 nodu’na giderek aşağıdaki komutu düzenleyip çalıştıralım. Benim kuracağım cluster için sanal IP adresi 10.190.1.70 ve master01 node IP adresi 10.190.1.50.

kubeadm init --control-plane-endpoint="<Sanal IP Adresi>:6443" --upload-certs --apiserver-advertise-address=<Master01 Node IP Adresi> --pod-network-cidr=192.168.0.0/16

Bu işlemi yaptıktan sonra şu şekilde bir ekranla karşılaşmamız gerekiyor.

Cluster Networking

Cluster’ımızı başarıyla oluşturduk. Şimdi POD’ların kendi aralarındaki iletişimleri, servislerle arasındaki iletişimi ve dış dünyayla olan iletişimlerini yönetebilecek bir network plugin’ine ihtiyacımız var. Burada Flannel, Weave Net, Calico, Canal gibi birçok seçeneğimiz var ben sağladığı esneklik ve performans nedeniyle Calico ile devam edeceğim.

Aşağıdaki komutu master01 node’unda iken çalıştıralım.

kubectl --kubeconfig=/etc/kubernetes/admin.conf create -f https://projectcalico.docs.tigera.io/manifests/calico.yaml

Master Node’ları Cluster’a Dahil Etme

Cluster kurulumumuzu tamamlamak için son olarak geri kalan master ve worker node’ları dahil etme işlemlerini yapacağız.

master02 ve master03 node’larını dahil etmek için

“You can now join any number of the control-plane node runiing the following command on each as root:” yazısının altındaki komuta --apiserver-advertise-address parametresini ekleyerek çalıştıralım.

Master02 için:

kubeadm join 10.190.1.70:6443 --apiserver-advertise-address=10.190.1.51 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx \
--control-plane --certificate-key xxx

Master03 için:

kubeadm join 10.190.1.70:6443 --apiserver-advertise-address=10.190.1.52 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx \
--control-plane --certificate-key xxx

Worker Node’ları Cluster’a Dahil Etme

Worker node’larını cluster’a dahil etmek için bütün worker node’larında

“Then you can join any number of worker nodes by running the following on each as a root:” yazısının altındaki komutunu olduğu gibi çalıştıralım.

worker01, worker02, worker03 için:

kubeadm join 10.190.1.70:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx

HA Testleri

Cluster kurulumumuz bitti. Şimdi yapımızın load balancer’lardan birini kaybettiğinde yada master node’larından bir tanesini dahi kaybetse çalışabilir olduğunu doğrulayalım.

Load Balancer HA

İlk senaryomuz herhangi bir load balancer node’u giderse ne olur?

Öncelikle her iki load balancer node’unda atanan IP adreslerine bakalım.

Load Balancer 1
Load Balancer 2

10.190.1.70 yani sanal IP adresimiz şuan load balancer 1 interface’ine atanmış durumda. Şimdi load balancer 1 node’unu kapatıyorum ve sonrasında load balancer 2'ye atanan IP adreslerini tekrar inceleyelim.

Load Balancer 2

Gördüğünüz gibi 10.190.1.70 IP adresi load balancer 2 interface’ine atandı. Yani load balancer’lardan herhangi birini kaybetmemiz cluster’a erişimimizde herhangi bir sorun teşkil etmiyor.

Master Node HA Test

Şimdide master node’larından herhangi birisini kaybettiğimizde cluster’ın sağlıklı bir şekilde çalışıp çalışmadığını görelim. master01 ve master03 node’larını ayrı ayrı kapatarak testimizi gerçekleştirelim.

Master01 Down

master01 kapatılmadan önce

İlk olarak master01 node’unu kapattım ve HAProxy kısa bir süre sonra master01 node’unun down olduğu bilgisini verdi.

Cluster’a tekrar erişmeye çalıştığımızda master01'in NotReady durumunda olduğunu görüyoruz fakat cluster’a erişim konusunda herhangi bir problemle karşılaşmadık.

Şimdi master01 node’unu tekrar ayağa kaldırıp aynı testi master03 için yapalım.

Master03 Down

Master03 node’unu kapattım ve HAProxy aynı şekilde master03 node’unun down olduğu bilgisini verdi.

Fakat cluster’a erişimimizde gene bir problem yok.

Kubernetes HA cluster’ımızı başarıyla kurmuş olduk.

Vakit ayırıp yazımı okuduğunuz için teşekkürler.

Diğer yazılarım

Konu hakkındaki geri dönüşlerinizi mail adresime iletebilirseniz çok memnun olurum.

📧: suleyman@suleyman.tech

--

--