Setup Cluster
Pada bagian ini, kita akan coba membahas cara mensetup cluster menggunakan K3s
Arsitektur
Berikut adalah gambaran dari arsitektur cluster yang kita buat:

Requirements
Berikut beberapa requirement yang dibutuhkan untuk mensetup sebuah HA Cluster.\ Dalam hal ini untuk kemudahan akan di lakukan dalam 1 Server Proxmox Saja.
Kita akan butuh paling tidak beberapa VM Berikut:
- 1 VM Untuk Nginx Load Balancer
- 1 VM Untuk MySQL Database
- 3 VM Untuk Control Plane Kubernetes
- 6 VM Untuk Worker Kubernetes
- 1 Template untuk mempermudah Proses Scaling Nanti
Setiap VM Terdiri Dari Base Image Debian 11.4
Perhatikan Gambar Berikut:
Instalasi
Pada bagian kali ini akan coba jabarkan step pertama kali untuk setup
Nginx LB
Kita perlu menggunakan nginx sebagai load balancer untuk mendistribusikan workload ke 3 master / control plane kita.\ Berikut tahapan yang perlu di lakukan:
- Clone VM Dari Template Base Image Debian
- Lakukan Instalasi Nginx Seperti Biasa
- Buat IP Statis
- Ubah Config Nginx
- Restart Nginx
Berikut config IP Statis di debian 11:
Lokasi File ada di\ /etc/network/interface
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
#allow-hotplug ens18
#iface ens18 inet dhcp
auto ens18
iface ens18 inet static
address 10.30.123.153
netmask 255.255.255.0
gateway 10.30.123.1
dns-nameservers 10.30.123.1 8.8.8.8 1.1.1.1
Berikut config nginx yang dapat digunakan:
Lokasi File ada di\ /etc/nginx/nginx.conf
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
events {}
# LB for k3s
stream {
upstream k3s_servers {
server 10.30.123.154:6443;
server 10.30.123.155:6443;
server 10.30.123.166:6443;
}
server {
listen 6443;
proxy_pass k3s_servers;
}
}
# end
Data VM Ini\ vm id: 153\ vm name: k3s-lb-nginx\ vm ip: 10.30.123.153
MySQL DB
Kita perlu menggunakan mysql sebagai database penyimpanan data cluster.\ Berikut tahapan yang perlu di lakukan:
- Clone VM Dari Template Base Image Debian
- Lakukan Instalasi MySQL Seperti Biasa
- Buat IP Statis
- Buat User untuk DB
- Buat Database untuk cluster
- Ubah Config binding ke 0.0.0.0
- Restart MySQL
Berikut config yang dapat digunakan (lihat yang di highlight):
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
# this is read by the standalone daemon and embedded servers
[server]
# this is only for the mysqld standalone daemon
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /run/mysqld/mysqld.pid
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
lc-messages = en_US
skip-external-locking
# Broken reverse DNS slows down connections considerably and name resolve is
# safe to skip if there are no "host by domain name" access grants
#skip-name-resolve
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 0.0.0.0
# ....
Data VM Ini\ vm id: 152\ vm name: k3s-db-mysql\ vm ip: 10.30.123.152
Control Plane
Pada Kubernetes Control Plane digunakan untuk mengatur workload dari worker.\ Jadi kita tidak akan, memberikan workload ke CP tapi hanya ke Worker saja nanti.
Berikut tahapan yang perlu di lakukan:
- Clone VM Dari Template Base Image Debian - General
- Buat IP Statis
- Jalankan Command yang tersedia dibawah ini
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.24.4+k3s1" sh -s - server \
--cluster-init \
--disable traefik \
--disable servicelb \
--datastore-endpoint "mysql://user:pass@tcp(ip:port)/nama_db" \
--write-kubeconfig-mode 644 \
--node-name k3s-cp-1 \
--node-taint CriticalAddonsOnly=true:NoExecute \
--tls-san "ip local lb nginx" \
--tls-san "ip pub outgoing"
Ada Beberapa catatan yaitu:
- token diperlukan untuk terhubung ke control plane 1 dari CP atau Worker lain nya nanti.
- disable traefik, karna kita akan menggunakan Nginx ingress controller nanti.
- disable servicelb, karna kita akan menggunakan MetalLB nanti.
- version bisa menyesuaikan.
Cara mengambil token:
sudo cat /var/lib/rancher/k3s/server/node-token
Jalankan Command Berikut di Control Plane ke - {n}
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.24.4+k3s1" sh -s - server \
--disable traefik \
--disable servicelb \
--datastore-endpoint "mysql://user:pass@tcp(ip:port)/nama_db" \
--write-kubeconfig-mode 644 \
--node-name k3s-cp-{n} \
--node-taint CriticalAddonsOnly=true:NoExecute \
--tls-san "ip local lb nginx" \
--tls-san "ip pub outgouing" \
--server https://ip_cp_1:6443 \
--token isi_token_dari_cp_1
Data VM Ini\ vm id: 153\ vm name: k3s-lb-nginx\ vm ip: 10.30.123.153
Worker
Pada Kubernetes Worker digunakan untuk meletakkan workload dari control plane.
Berikut tahapan yang perlu di lakukan:
- Clone VM Dari Template Base Image Debian k3s
- Buat IP Statis
- Jalankan Command yang tersedia dibawah ini
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.24.4+k3s1" sh -s - agent \
--node-name k3s-worker-{n} \
--server https://ip_local_lb_nginx:6443 \
--token isi_token_dari_cp_1
Metal LB
Digunakan untuk mengatur network terutama ip pada cluster.
Untuk instalasi langsung saja apply manifest yang tersedia:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
Silahkan apply manifes untuk metallb yang telah di install.\ pastikan IP tidak digunakan sebelumnya.
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 10.30.xxx.xxx-10.30.xxx.xxx
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default
Nginx Ingress
Digunakan untuk mengatur network ingress ke cluster.
Untuk instalasi langsung saja apply manifest yang tersedia:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/baremetal/deploy.yaml
Modifikasi Service Menjadi LoadBalancer
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.3.1
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- appProtocol: http
name: http
port: 80
protocol: TCP
targetPort: http
- appProtocol: https
name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: LoadBalancer
Tambahkan Ini di data configmap Ingress Nginx Controller
data:
allow-snippet-annotations: 'true'
forwarded-for-header: CF-Connecting-IP
proxy-real-ip-cidr: >-
173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/12,172.64.0.0/13,131.0.72.0/22,2400:cb00::/32,2606:4700::/32,2803:f800::/32,2405:b500::/32,2405:8100::/32,2a06:98c0::/29,2c0f:f248::/32
use-forwarded-headers: 'true'
Longhorn
Digunakan untuk mengatur persistent volumen pada cluster.\ Pastikan pada semua node di cluster sudah terinstall packge berikut open-iscsi
Untuk instalasi silahkan langsung apply:
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.3.1/deploy/longhorn.yaml
Pastikan deployment sukses:
$ kubectl -n longhorn-system get pod
NAME READY STATUS RESTARTS AGE
csi-attacher-6fdc77c485-8wlpg 1/1 Running 0 9d
csi-attacher-6fdc77c485-psqlr 1/1 Running 0 9d
csi-attacher-6fdc77c485-wkn69 1/1 Running 0 9d
csi-provisioner-78f7db7d6d-rj9pr 1/1 Running 0 9d
csi-provisioner-78f7db7d6d-sgm6w 1/1 Running 0 9d
csi-provisioner-78f7db7d6d-vnjww 1/1 Running 0 9d
engine-image-ei-6e2b0e32-2p9nk 1/1 Running 0 9d
engine-image-ei-6e2b0e32-s8ggt 1/1 Running 0 9d
engine-image-ei-6e2b0e32-wgkj5 1/1 Running 0 9d
longhorn-csi-plugin-g8r4b 2/2 Running 0 9d
longhorn-csi-plugin-kbxrl 2/2 Running 0 9d
longhorn-csi-plugin-wv6sb 2/2 Running 0 9d
longhorn-driver-deployer-788984b49c-zzk7b 1/1 Running 0 9d
longhorn-manager-nr5rs 1/1 Running 0 9d
longhorn-manager-rd4k5 1/1 Running 0 9d
longhorn-manager-snb9t 1/1 Running 0 9d
longhorn-ui-67b9b6887f-n7x9q 1/1 Running 0 9d
Remote
Kita bisa meremote cluster kita dengan mengambil kubeconfig yang ada pada control plane.\ Pastikan kita mengganti server/url dengan IP Load Balancer kita.
sudo cat /etc/rancher/k3s/k3s.yaml