Highly Available Kubernetes Cluster with Kubeadm

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 :

HostnameIP AddressRole
lb-0110.102.0.40Load Balancer, VRRP
lb-0210.102.0.41Load Balancer, VRRP
master-0110.102.0.11Control Plane, Master
master-0210.102.0.12Control Plane, Master
worker-0110.102.0.13Worker Node
worker-0210.102.0.14Worker Node
Refrensi : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/#stacked-etcd-topology

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 !

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.