Di era perkembangan teknologi saat ini, dimana aplikasi ber-arsitektur monolitik mulai ditinggalkan dan bermigrasi ke microservices. Untuk memenuhi kebutuhan tersebut, diperlukan infrastruktur yang dapat diandalkan dengan ketersediaan tinggi-nya.
Kubernetes Cluster harus di rancang tanpa adanya single point of failure. Apabila anda ingin menyiapkan Kubernetes Cluster untuk lingkungan produksi, sangat disarankan untuk merancangnya dengan HA.
Pada artikel ini saya akan mendemostrasikan bagaimana cara mengonfigurasi Kubernetes Cluster di High Availability dengan kubeadm. Untuk demonstrasi saya menggunakan 6 sistem CentOS, dengan detil sebagai berikut :
Hostname | IP Address | Role |
lb-01 | 10.102.0.40 | Load Balancer, VRRP |
lb-02 | 10.102.0.41 | Load Balancer, VRRP |
master-01 | 10.102.0.11 | Control Plane, Master |
master-02 | 10.102.0.12 | Control Plane, Master |
worker-01 | 10.102.0.13 | Worker Node |
worker-02 | 10.102.0.14 | Worker Node |
Pada topologi diatas dapat terlihat, masing-masing peran mempunyai ketersediaan tinggi. Konfigurasi ini membuat sistem mempunyai SLA yang lebih tinggi, apabila salah satu sistem dari masing-masing peran offline. Sistem lain akan mengambil alih peran tersebut.
Disini saya memakai topologi berbasis stacked-etcd. Stacked-etcd adalah topologi di mana cluster penyimpanan data terdistribusi yang disediakan oleh etcd ditumpuk di atas cluster yang dibentuk oleh node yang dikelola oleh kubeadm yang menjalankan komponen bidang kontrol.
Requirements
- Minimal 2 Worker Node, Master Node, & Loadbalancer dengan spesifikasi (2CPUs & 2GB ram).
- Akses Root.
- Akses internet untuk masing-masing node.
- Mengubah hostname sesuai dengan Role.
- Menonaktifkan Selinux.
- Menonaktifkan Firewalld.
All Node Load Balancer
Paket installasi HAProxy secara default sudah tersedia di repositori CentOS 7, anda harus update paket instalasi menggunakan perintah berikut.
yum update -y
Selanjutnya Install HAProxy dan Keeplived, jalankan perintah ini.
yum install -y keepalived haproxy
Jika sudah terinstall, disarankan untuk membackup file konfigurasi haproxy dan keepalived tersebut.
cp -r /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
cp -r /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
Tambahkan skrip health check untuk api server pada /etc/keepalive.
cat >> /etc/keepalived/check_apiserver.sh <<EOF
#!/bin/sh
errorExit() {
echo "*** $@" 1>&2
exit 1
}
curl --silent --max-time 2 --insecure https://localhost:6443/ -o /dev/null || errorExit "Error GET https://localhost:6443/"
if ip addr | grep -q 10.102.0.50; then
curl --silent --max-time 2 --insecure https://10.102.0.50:6443/ -o /dev/null || errorExit "Error GET https://10.102.0.50:6443/"
fi
EOF
chmod +x /etc/keepalived/check_apiserver.sh
Berikutnya, masukkan buat file konfigurasi baru untuk keepalived, setelah itu save.
rm -rf /etc/keepalived/keepalived.conf
cat >> /etc/keepalived/keepalived.conf <<EOF
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
timeout 10
fall 5
rise 2
weight -2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 1
priority 100
advert_int 5
authentication {
auth_type PASS
auth_pass mypassword123
}
virtual_ipaddress {
10.102.0.50
}
track_script {
check_apiserver
}
}
EOF
Aktifkan & mulai layanan keepalive
systemctl enable --now keepalived
Edit konfigurasi haproxy di /etc/haproxy/haproxy.cfg. Lalu hapus konfigurasi default seperti dibawah.
Setelah itu tambahkan konfigurasi berikut pada baris paling bawah.
frontend kubernetes-frontend
bind *:6443
mode tcp
option tcplog
default_backend kubernetes-backend
backend kubernetes-backend
option httpchk GET /healthz
http-check expect status 200
mode tcp
option ssl-hello-chk
balance roundrobin
server master01 10.102.0.11:6443 check fall 3 rise 2
server master02 10.102.0.12:6443 check fall 3 rise 2
Berikutnya konfigurasi daemon rsyslog untuk mencatat statistik HAProxy. Edit file rsyslog.conf untuk mengaktifkan port UDP 514 yang digunakan oleh rsyslog.
nano /etc/ryslog.conf
Buka Baris konfigurasi berikut.
Tambahkan script ini pada baris berikut, untuk menyimpan log haproxy.
local2.* /var/log/haproxy.log
Sekarang Restart layanan HAProxy dan Rsyslog.
systemctl enable haproxy && systemctl restart haproxy && systemctl restart rsyslog
All Node Kubernetes (Master & Worker)
Pastikan alamat MAC dan product_uuid unik untuk setiap node.
sudo cat /sys/class/dmi/id/product_uuid
ifconfig -a
Pastikan network bridge dikonfigurasi pada module kubernetes.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
Berikutnya disable swap di semua node.
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a
Tambahkan kubernetes repositori.
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
Jalankan perintah berikut untuk menginstall kubeadm, kubelet, kubectl, dan docker.
sudo yum install -y kubelet kubeadm kubectl docker -y
systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker
Initialize on Master 01
Jalankan perintah berikut untuk inisialisasi control-plane :
kubeadm init --control-plane-endpoint="apik8s.syscloud.tech:6443" --upload-certs --apiserver-advertise-address=10.102.0.11 --pod-network-cidr=192.168.0.0/20
- –control-plane-endpoint : harus diatur sesuai dengan endpoint DNS.
- –apiserver-advertise-address : harus diatur sesuai dengan ip address master 01.
- –upload-certs : digunakan untuk mengunggah sertifikat secara otomatis ke semua instance control plane di cluster.
- –pod-network-cidr : harus diatur sesuai dengan ip address yang sudah anda alokasikan sesuai kebutuhan.
Apabila inisialisasi sudah selesai, simpan perintah join cluster untuk worker dan master node lainnya.
Berikutnya adalah instalasi CNI ( Container Network Interfaces). Disini saya memakai Weave Net sebagai CNI, jalankan perintah berikut untuk memulai instalasi:
kubectl --kubeconfig=/etc/kubernetes/admin.conf apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
Gunakan perintah berikut untuk memeriksa pod baru:
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pod -n kube-system -w
Pastikan status pada pod weave-net berjalan dengan normal.
Setelah itu jalankan perintah join untuk master node yang sudah disimpan sebelumnya sehingga terlihat seperti ini:
kubeadm join apik8s.syscloud.tech:6443 --token iim02o.7hf9bxg9xsr5qjta \
--discovery-token-ca-cert-hash sha256:7653122c056e5acdb07860d1330509bff16121e4a98b10e807c34de4a1269bf1 \
--control-plane --certificate-key a7b97d6b8efb28f0751ea05f0ad431a8679d01fc70e8c037ee85a7247c00f5da
Selanjutnya jalankan perintah join untuk worker node yang sudah disimpan sebelumnya sehingga terlihat seperti ini:
kubeadm join apik8s.syscloud.tech:6443 --token iim02o.7hf9bxg9xsr5qjta \
--discovery-token-ca-cert-hash sha256:7653122c056e5acdb07860d1330509bff16121e4a98b10e807c34de4a1269bf1
Jika sudah selesai, verifikasi node menggunakan perintah berikut :
kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes
Connecting to Cluster from Local Machine
Agar dapat terhubung ke cluster, Anda perlu mengunduh file kubeconfig ke mesin lokal Anda (terletak di /etc/kubernetes/, file defaultnya disebut admin.conf).
Jika file admin.conf sudah diunduh ke lokal mesin, ubah nama file menjadi config dan letakkan pada direktori C:\Users\namauser\.kube jika anda memakai sistem operasi windows.
Install Kubectl for Windows setelah itu anda dapat terhubung ke cluster dari lokal mesin.
Pada tahap ini, anda sudah berhasil membuat Kubernetes Cluster dengan HA. Dalam artikel yang akan mendatang, saya akan membahas lebih dalam tentang penerapan Kubernetes Cluster.
Cheers !