Burada kurduğumuz load balancer (yük dengeleyici) kurma amacımız contoller olan sunuculara tek bir noktadan erişebilmek ve çalışmayan conroller sunucularına istek göndermemek. Ancak burada da load balancer'ımızı high available yapmamız gerekiyor. Bu nedenle keepalived'ı kuruyoruz.
Load balancer'lar için VIP adresimiz : 10.240.10.10
lxc kullanalar için ssh kullanmadan giriş yapmak isterseniz aşağıdaki komutu kullanabilirsiniz.
lxc exec lb-01 bash # lb-01 makinasına giriş yapmış oluruz.
İki load balancer makinamıza da (lb-01, lb-02) Haproxy ve Keepalived'ı kuruyoruz.
apt install keepalived
apt install haproxy
Daha sonra iki load balancer makinamızda da Haproxy konfigürasyon dosyasının yedeğini alıyoruz.
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy_backup.cfg
vim /etc/haproxy/haproxy.cfg
Aşağıdaki konfigürasyonun tamamını haproxy.cfg dosyasına kopyalıyoruz.
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 kube-apiserver
bind *:6443
mode tcp
option tcplog
default_backend kube-apiserver
backend kube-apiserver
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 kube-apiserver-1 10.240.10.4:6443 check
server kube-apiserver-2 10.240.10.5:6443 check
server kube-apiserver-3 10.240.10.6:6443 check
Dosyayı kaydediyoruz ardından servisi restart ediyoruz ve enable yapıyoruz.
systemctl restart haproxy
systemctl enable haproxy
UYARI: Eğer restart ederken hata alırsanız, büyük ihtimalle syntax hatası vardır. config dosyanızı doğrulama ve hataları görmek için aşağıdaki kodu çalıştırınız.
haproxy -c -V -f /etc/haproxy/haproxy.cfg
Daha sonra lb-01 keepalived konfigürasyon dosyasını aşağdaki gibi oluşturuyoruz.
vim /etc/keepalived/keepalived.conf
conf dosyası içeriğini kopyalıyoruz ve kaydediyoruz.
global_defs {
notification_email {
}
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "kill -0 haproxy"
interval 2
weight 2
}
vrrp_instance haproxy-vip {
state MASTER # lb-01 in master olduğunu belirtiyoruz
priority 101 # bu makinadaki konfigürasyonun ağırlığını belirtir.
#lb-02 de bu değer 100 olacak. Yani büyük rakan daha ağır basıyor.
interface eth0 # makina üzerindeki network kartımız
virtual_router_id 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.240.10.2 # lb-01 ın ip adresi.
unicast_peer {
10.240.10.3 # peer yapılan lb-02 makinasının ip adresi
}
virtual_ipaddress {
10.240.10.10/24 dev eth0 # ortak kullanılacak virtual ip (floating ip)
}
track_script {
chk_haproxy
}
}
lb-02 deki keepalived konfigürasyon dosyamız da aşağıdaki gibi olacak. Dikkat edilirse 4 yerde lb-01 ile farklılık gösterdiği görülecektir.
- unicast_src_ip
- unicast_peer
- state
- priority
Özellikle priority değeri çok önemli. lb-01 makinasının ağırlığı haproxy servisi çalıştığı sürece weight+priority=102 olacak hesaplanacaktır. Eğer haproxy servisi cevap vermezse 100 olarak hesaplanacaktır. Bu durumda lb-02 makinasının toplam ağırlığı lb-01 deki haproxy servisi çalıştığında lb-01'İn toplam ağırlığından küçük, çalışmadığında ise büyük olmalıdır. Bu nedenle aşağıda görüleceği üzere lb-02'de priority değerini 100 olarak girdik.
lb-02 keepalived konfigürasyon dosyasını da lb-01 de olduğu gibi kopyalıyoruz.
global_defs {
notification_email {
}
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "kill -0 haproxy"
interval 2
weight 2
}
vrrp_instance haproxy-vip {
state BACKUP # lb-02 in backup olduğunu belirtiyoruz
priority 100 # bu makinadaki konfigürasyonun ağırlığını belirtir.
#lb-01 de bu değer 200 dü olacak. Yani büyük rakam daha ağır basıyor.
interface eth0 # makina üzerindeki network kartımız
virtual_router_id 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.240.10.3 # lb-02 ın ip adresi.
unicast_peer {
10.240.10.2 # peer yapılan lb-01 makinasının ip adresi
}
virtual_ipaddress {
10.240.10.10/24 dev eth0 # ortak kullanılacak virtual ip (floating ip)
}
track_script {
chk_haproxy
}
}
Daha sonra her iki sunucuda da (lb-01, lb-02) keepalived servisini restart ediyoruz ve ardından enabled yapıyoruz.
systemctl restart keepalived
systemctl enable haproxy
Şimdi High Availability kurgumuzu doğrulayalım.Öncelikle ip ayarlarımızı kontrol ediyoruz.
UYARI: lb-01 makinası için ip ayarlarını kontrol ettiğimizde keepalived'ın VIP ayarını doğru yaptığını eth0 üzerinde 10.240.10.10 ipsinin tanımlandığını görebiliriz. lb-02 makinasında aynı komutu çalıştırdığınızda tek ip'nin olduğunu görebilirsiniz.
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:fa:b0:11 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.240.10.2/24 brd 10.240.10.255 scope global dynamic eth0
valid_lft 2764sec preferred_lft 2764sec
inet 10.240.10.10/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fefa:b011/64 scope link
valid_lft forever preferred_lft forever
lb-01 makinasında Haproxy servisini stop ettiğimizde 10.240.10.10 ipsinin lb-02 makinasına geçtiğini görmemiz gerekiyor.
lb-01 üzerinde haproxy yi stop ediyoruz.
systemctl stop haproxy
lb-02 makinasında kontrol ediyoruz.
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:c3:f2:6d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.240.10.3/24 brd 10.240.10.255 scope global dynamic eth0
valid_lft 2854sec preferred_lft 2854sec
inet 10.240.10.10/24 scope global secondary eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec3:f26d/64 scope link
valid_lft forever preferred_lft forever
Birde Haproxy'nin doğru çalışıp çalışmadığını doğrulayalım. Henüz Kubernetes kurulumu yapmadığımız için 6443 portunu controller sunucularında dinleyecek bir servise ihtiyacımız olacak. Bunun için netcat kullanacağız. Aşağıdaki komutu bütün controller makinalarında çalıştırmalıyız.
nohup sh -c 'while true ; do (echo -e "HTTP/1.1 200 OK\n\n" ; echo -e "\t$(date)\n") | sudo netcat -l -w 1 -p 6443; done' &
lb-01 ve lb-02 makinlarında çalıştırılacak test komutları
wget 10.240.10.10:6443
# sonuç olarak bir index.html dosyasının indiğini ve içinde de tarih bilginin olduğunu görmemiz grekiyor.
Bu bölümü de bitirdik. Bir sonraki bölümde amacımız CA ve TLS sertifikalarını oluşturmak olacak.
- Giriş ve Lab Ortamının Kurulması
- İstemci Araçlarının Kurulumu
- Harici Yük Dengeleyici Kurulumu
- Certificate Authority ve TLS Sertifikalarının Oluşturulması
- Kubeconfig Dosyalarının Oluşturulması
- Data Encryption Config ve Key Oluşturulması
- Etcd Cluster Kurulumu
- Control Plane'nin Kurulumu ve Konfigürasyonu
- Worker Node'ların Kurulumu ve Konfigürasyonu
- Uzak Bağlantı için Kubectl Konfigürasyonu
- Pod Network Route'larının Ayarlanması
- DNS'in Kurulumu ve Konfigürasyonu
- Smoke Test