Saat kami menyiapkan Kubernetes (k8s) cluster di tempat untuk lingkungan produksi maka disarankan untuk menyebarkannya dalam ketersediaan tinggi. Di sini ketersediaan tinggi berarti menginstal master atau control plane Kubernetes di HA. Pada artikel ini saya akan mendemonstrasikan cara setup cluster Kubernetes(k8s) di HA (High Availability) dengan utilitas kubeadm.
Untuk demonstrasi, saya telah menggunakan lima sistem CentOS 7 dengan rincian sebagai berikut:
- k8s-master-1 – Minimal CentOS 7 – 192.168.1.40 – RAM 2 GB, 2vCPU, Disk 40 GB
- k8s-master-2 – Minimal CentOS 7 – 192.168.1.41 – RAM 2GB, 2vCPU, Disk 40 GB
- k8s-master-3 – Minimal CentOS 7 – 192.168.1.42 – RAM 2 GB, 2vCPU, Disk 40 GB
- k8s-worker-1 – Minimal CentOS 7 – 192.168.1.43 – RAM 2GB, 2vCPU, Disk 40 GB
- k8s-worker-2 – Minimal CentOS 7 – 192.168.1.44 – RAM 2GB, 2vCPU, Disk 40 GB
Catatan:cluster etcd juga dapat dibentuk di luar node master tetapi untuk itu kita memerlukan perangkat keras tambahan, jadi saya menginstal etcd di dalam node master saya.
Persyaratan minimum untuk menyiapkan cluster Sangat K8
- Instal Kubeadm , kubelet dan kubectl pada semua Node master dan pekerja
- Konektivitas Jaringan antara node master dan pekerja
- Konektivitas Internet di semua node
- Kredensial root atau sudo memberikan hak istimewa kepada pengguna di semua node
Mari masuk ke langkah instalasi dan konfigurasi
Langkah 1) Atur Hostname dan tambahkan entri di file /etc/hosts
Jalankan perintah hostnamectl untuk mengatur nama host pada setiap node, contoh ditunjukkan untuk node k8s-master-1,
$ hostnamectl set-hostname "k8s-master-1"$ exec bash
Demikian pula, jalankan perintah di atas pada node yang tersisa dan atur nama host masing-masing. Setelah nama host disetel di semua node master dan pekerja, tambahkan entri berikut di /etc/hosts file di semua node.
192.168.1.40 k8s-master-1192.168.1.41 k8s-master-2192.168.1.42 k8s-master-3192.168.1.43 k8s-worker-1192.168.1.44 k8s-worker-2192.168.1.45 vip-k8s-master
Saya telah menggunakan satu entri tambahan “192.168.1.45 vip-k8s-master” di file host karena saya akan menggunakan IP dan nama host ini saat mengonfigurasi haproxy dan tetap hidup di semua node master. IP ini akan digunakan sebagai kube-apiserver penyeimbang beban ip. Semua permintaan kube-apiserver akan datang ke IP ini dan kemudian permintaan tersebut akan didistribusikan di antara kube-apiservers backend yang sebenarnya.
Langkah 2) Instal dan Konfigurasi Keepalive dan HAProxy di semua node master / control plane
Instal keepalived dan haproxy pada setiap node master menggunakan perintah yum berikut,
$ sudo yum install haproxy keepalived -y
Konfigurasi Keepalive di k8s-master-1 terlebih dahulu, buat script check_apiserver.sh akan konten berikut,
[[email protected] ~]$ sudo vi /etc/keepalived/check_apiserver.sh#!/bin/shAPISERVER_VIP=192.168.1.45APISERVER_DEST_PORT=6443errorExit() { echo "*** $*" 1>&2 exit 1 }curl --silent --max-time 2 --insecure https://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Kesalahan DAPATKAN https://localhost:${APISERVER_DEST_PORT}/"jika ip addr | grep -q ${APISERVER_VIP}; lalu curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Kesalahan DAPATKAN https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"fi
simpan dan keluar dari file.
Setel izin yang dapat dieksekusi
$ sudo chmod +x /etc/keepalive/check_apiserver.sh
Ambil cadangan file keepalived.conf lalu potong file tersebut.
[[email protected] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org[[email protected] ~]$ sudo sh -c '> /etc/keepalived/ keepalived.conf'
Sekarang rekatkan konten berikut ke file /etc/keepalived/keepalived.conf
[[email protected] ~]$ sudo vi /etc/keepalived/keepalived.conf! /etc/keepalive/keepalived.conf! File Konfigurasi untuk keepalivedglobal_defs { router_id LVS_DEVEL}vrrp_script check_apiserver { script "/etc/keepalived/check_apiserver.sh" interval 3 weight -2 fall 10 rise 2}vrrp_instance VI_1 { state MASTER interface enp0 _ id aupass autentikasi prioritas id dilindungi]##D321! } virtual_ipaddress { 192.168.1.45/24 } track_script { check_apiserver }}
Simpan dan tutup file.
Catatan: Hanya dua parameter dari file ini yang perlu diubah untuk master-2 &3 node. Negara Bagian akan menjadi BUDAK untuk master 2 dan 3, prioritas masing-masing adalah 254 dan 253.
Konfigurasi HAProxy pada node k8s-master-1, edit file konfigurasinya dan tambahkan konten berikut:
[[email protected] ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org
Hapus semua baris setelah bagian default dan tambahkan baris berikut
[[email protected] ~]$ sudo vi /etc/haproxy/haproxy.cfg#---------------------------- -----------------------------------------# frontend apiserver yang diproksi ke master# -------------------------------------------------- -------------------frontend apiserver bind *:8443 mode tcp option tcplog default_backend apiserver#------------------ -------------------------------------------------- -# penyeimbangan round robin untuk apiserver#------------------------------------------ ---------------------------backend apiserver option httpchk GET /healthz http-check expect status 200 mode tcp option ssl-hello-chk balance roundrobin server k8s-master-1 192.168.1.40:6443 periksa server k8s-master-2 192.168.1.41:6443 periksa server k8s-master-3 192.168.1.42:6443 periksa
Simpan dan keluar dari file
Sekarang salin tiga file ini (check_apiserver.sh , keepalived.conf dan haproxy.cfg) dari k8s-master-1 ke k8s-master-2 &3
Jalankan for loop berikut untuk scp file-file ini ke master 2 dan 3
[[email protected] ~]$ for f in k8s-master-2 k8s-master-3; do scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [email protected]$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg [dilindungi email]$f:/etc/haproxy; selesai
Catatan: Jangan lupa ubah dua parameter di file keepalived.conf yang sudah kita bahas di atas untuk k8s-master-2 &3
Jika firewall berjalan pada node master, tambahkan aturan firewall berikut pada ketiga node master
$ sudo firewall-cmd --add-rich-rule='rule protokol value="vrrp" accept' --permanent$ sudo firewall-cmd --permanent --add-port=8443/tcp$ sudo firewall- cmd --reload
Sekarang Akhirnya mulai dan aktifkan layanan keepalived dan haproxy pada ketiga node master menggunakan perintah berikut:
$ sudo systemctl aktifkan keepalived --now$ sudo systemctl aktifkan haproxy --now
Setelah layanan ini dimulai dengan sukses, verifikasi apakah VIP (IP virtual) diaktifkan pada node k8s-master-1 karena kami telah menandai k8s-master-1 sebagai node MASTER dalam file konfigurasi keepalive.
Sempurna, output di atas mengonfirmasi bahwa VIP telah diaktifkan di k8s-master-1.
Langkah 3) Nonaktifkan Swap, setel SELinux sebagai aturan permisif dan firewall untuk node Master dan pekerja
Nonaktifkan Swap Space pada semua node termasuk node pekerja, Jalankan perintah berikut
$ sudo swapoff -a $ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Tetapkan SELinux sebagai Permisif pada semua node master dan pekerja, jalankan perintah berikut,
$ sudo setenforce 0$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Aturan Firewall untuk Node Master:
Jika firewall berjalan pada node master, maka izinkan port berikut di firewall,
Jalankan perintah firewall-cmd berikut di semua node master,
$ sudo firewall-cmd --permanent --add-port=6443/tcp$ sudo firewall-cmd --permanent --add-port=2379-2380/tcp$ sudo firewall-cmd --permanent --add -port=10250/tcp$ sudo firewall-cmd --permanent --add-port=10251/tcp$ sudo firewall-cmd --permanent --add-port=10252/tcp$ sudo firewall-cmd --permanent -- add-port=179/tcp$ sudo firewall-cmd --permanent --add-port=4789/udp$ sudo firewall-cmd --reload$ sudo modprobe br_netfilter$ sudo sh -c "echo '1'> /proc/ sys/net/bridge/bridge-nf-call-iptables"$ sudo sh -c "echo '1'> /proc/sys/net/ipv4/ip_forward"
Aturan Firewall untuk node Pekerja:
Jika firewall berjalan pada node pekerja, maka izinkan port berikut di firewall pada semua node pekerja
Jalankan perintah berikut pada semua node pekerja,
$ sudo firewall-cmd --permanent --add-port=10250/tcp$ sudo firewall-cmd --permanent --add-port=30000-32767/tcp -port=179/tcp$ sudo firewall-cmd --permanent --add-port=4789/udp$ sudo firewall-cmd --reload$ sudo modprobe br_netfilter$ sudo sh -c "echo '1'> /proc/sys /net/bridge/bridge-nf-call-iptables"$ sudo sh -c "echo '1'> /proc/sys/net/ipv4/ip_forward"
Langkah 4) Instal Docker Container Run Time (CRI) pada Master &Worker Nodes
Instal Docker (Container Run Time) di semua node master dan node pekerja, jalankan perintah berikut,
$ sudo yum install -y yum-utils$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo$ sudo yum install docker-ce -y
Jalankan perintah systemctl berikut untuk memulai dan mengaktifkan layanan buruh pelabuhan, (Jalankan perintah ini juga pada semua node master dan pekerja)
$ sudo systemctl aktifkan buruh pelabuhan --now
Sekarang, mari kita instal kubeadm , kubelet dan kubectl di langkah selanjutnya
Langkah 5) Instal Kubeadm, kubelet dan kubectl
Instal kubeadm, kubelet dan kubectl di semua node master serta node pekerja. Sebelum menginstal paket-paket ini terlebih dahulu, kita harus mengkonfigurasi repositori Kubernetes, jalankan perintah berikut pada setiap node master dan pekerja,
kucing <Sekarang jalankan perintah yum di bawah ini untuk menginstal paket-paket ini,
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetesJalankan perintah systemctl berikut untuk mengaktifkan layanan kubelet di semua node ( node master dan pekerja)
$ sudo systemctl aktifkan kubelet --nowLangkah 6) Inisialisasi Cluster Kubernetes dari node master pertama
Sekarang pindah ke master node / control plane pertama dan jalankan perintah berikut,
[[email protected] ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certsPada perintah di atas, –control-plane-endpoint atur nama dns dan port untuk penyeimbang beban (kube-apiserver), dalam kasus saya nama dns adalah “vip-k8s-master” dan port adalah “8443”, selain ini ‘–upload-certs ' akan membagikan sertifikat di antara node master secara otomatis,
Output dari perintah kubeadm akan seperti di bawah ini:
Bagus, output di atas mengonfirmasi bahwa cluster Kubernetes telah berhasil diinisialisasi. Dalam output, kami juga mendapatkan perintah untuk node master dan pekerja lain untuk bergabung dengan cluster.
Catatan: Disarankan untuk menyalin output ini ke file teks untuk referensi di masa mendatang.
Jalankan perintah berikut untuk mengizinkan pengguna lokal menggunakan perintah kubectl untuk berinteraksi dengan cluster,
[[email protected] ~]$ mkdir -p $HOME/.kube[[email protected] ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[[email protected ] ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config[[email protected] ~]$Sekarang, Mari kita gunakan jaringan pod (CNI – Antarmuka Jaringan Kontainer), dalam kasus saya, saya akan menggunakan addon belacu sebagai jaringan pod, jalankan perintah kubectl berikut
[[email protected] ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yamlSetelah jaringan pod berhasil di-deploy, tambahkan dua node master yang tersisa ke cluster. Cukup salin perintah untuk master node untuk bergabung dengan cluster dari output dan paste di k8s-master-2 dan k8s-master-3, contoh di bawah ini
[[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab kunci a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4
Outputnya adalah:
Jalankan juga perintah yang sama pada k8s-master-3,
Outputnya adalah:
Output di atas mengkonfirmasi bahwa k8s-master-3 juga telah berhasil bergabung dengan cluster. Mari kita verifikasi status node dari perintah kubectl, buka node master-1 dan jalankan perintah di bawah ini,
[[email protected] ~]$ kubectl get nodesNAME PERAN STATUS USIA VERSIONk8s-master-1 Siap master 31m v1.18.6k8s-master-2 Siap master 10m vmaster-38.6k master [[dilindungi email] ~]$
Sempurna, ketiga node master atau control plane kami sudah siap dan bergabung dengan cluster.
Langkah 7) Bergabung dengan node Worker ke cluster Kubernetes
Untuk menggabungkan node pekerja ke cluster, salin perintah untuk node pekerja dari output dan melewatinya di kedua node pekerja, contoh ditunjukkan di bawah ini:
Outputnya akan seperti di bawah ini:
Sekarang menuju ke node k8s-master-1 dan jalankan perintah kubectl di bawah ini untuk mendapatkan node status worker,
[[email protected] ~]$ kubectl get nodesNAME STATUS PERAN USIA VERSIONk8s-master-1 Siap master 43m v1.18.6k8s-master-2 Siap master 21m vmaster-38.6k master k8s-worker-1 Siap6m11s v1.18.6k8s-worker-2 Siap 5m22s v1.18.6[[email protected] ~]$
Output di atas mengkonfirmasi bahwa kedua pekerja juga telah bergabung dengan cluster dan dalam kondisi siap.
Jalankan perintah di bawah ini untuk memverifikasi status infra pod yang di-deploy di namespace kube-system.
[[email protected] ~]$ kubectl get pods -n kube-system
Langkah 8) Uji cluster Kubernetes yang sangat tersedia
Mari kita coba sambungkan ke cluster dari mesin jarak jauh (sistem CentOS) menggunakan nama dan port dns penyeimbang beban. Pada mesin remote terlebih dahulu, kita harus menginstal paket kubectl. Jalankan perintah di bawah ini untuk mengatur repositori kubernetes.
kucing <Sekarang tambahkan entri berikut di file /etc/host,
192.168.1.45 vip-k8s-masterBuat direktori kube dan salin file /etc/kubernetes/admin.conf dari node k8s-master-1 ke $HOME/.kube/config ,
$ mkdir -p $HOME/.kube$ scp [dilindungi email]:/etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/configSekarang jalankan perintah “kubectl get node”,
[[email protected] ~]$ kubectl get nodesNAME STATUS PERAN USIA VERSIONk8s-master-1 Siap master 3h5m v1.18.6k8s-master-2 Siap master 163m v1.18.6k Siap master 163m v1.18.6k k8s-worker-1 Siap148m v1.18.6k8s-worker-2 Siap 147m v1.18.6[[email protected] ~]$ Mari buat penerapan dengan nama nginx-lab dengan gambar ‘nginx ' dan kemudian mengekspos penerapan ini sebagai layanan jenis “NodePort ”
[[email protected] ~]$ kubectl create deployment nginx-lab --image=nginxdeployment.apps/nginx-lab created[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps NGINX-LABNAME SIAP TRE-TO-TANGGAL TERSEBUT AGENGINX-LAB 1/1 1 1 59S [[Email Dilindungi] ~] $ Kubectl Dapatkan Podsname Siap Status Restart Agenginx-Lab-5DF4577D49-RZV9Q 1/1 Berjalan 0 68Stest-844B6666C-PXPH9Q 1/1 1/1 Berlari 3 154m[[email protected] ~]$Mari kita coba skala replika dari 1 hingga 4, jalankan perintah berikut,
[[email protected] ~]$ kubectl scale deployment nginx-lab --replicas=4deployment.apps/nginx-lab scaled[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps nginx-labNAME SIAP TERBARU TERSEDIA AGEnginx-lab 4/4 4 4 3m10s[[email protected] ~]$Sekarang ekspos penerapan sebagai layanan, jalankan
[[email protected] ~]$ kubectl expose penerapan nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80service/nginx-lab terkena[[email protected ] ~]$Dapatkan detail port dan coba akses server web nginx menggunakan curl,
[[email protected] ~]$ kubectl get svc nginx-labNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-lab NodePort 10.102.3[Untuk mengakses server web nginx, kita dapat menggunakan IP dan port node master atau pekerja sebagai “31766”
[[email protected] ~]$ curl http://192.168.1.44:31766Outputnya akan seperti di bawah ini:
Sempurna, itu konfirmasi bahwa kami telah berhasil menerapkan cluster Kubernetes yang sangat tersedia dengan kubeadm di server CentOS 7. Jangan ragu untuk membagikan umpan balik dan komentar Anda yang berharga.
Baca Juga :Cara Menyetel Pengontrol Ingress NGINX di Kubernetes
Cara Mengonfigurasi Volume Persisten berbasis NFS di Kubernetes Cara Menyiapkan Cluster Kubernetes di Google Cloud Platform (GCP)Linux