Persiapan

Saya menggunakan tiga node VM untuk proyek lab rumah ini dengan 4 Core, Memori 4GB, dan 20GB untuk penyimpanan container dengan sistem operasi Rocky Linux 9.5 dengan kubernetes v1.32.5+k3s1 dan cri-o v1.32.

Node Hostname vCPU Memory Storage PrivateNet
litekube01 4 Core 4GB 20GB 172.16.0.111
litekube02 4 Core 4GB 20GB 172.16.0.112
litekube03 4 Core 4GB 20GB 172.16.0.113

Semua operasi menggunakan user root, berhati-hatilah saat menjalankan perintah!
Pada langkah ini, eksekusi dilakukan di semua node

Opsional: Setel SElinux ke mode permissive untuk lingkungan pengembangan

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Setel hostname statis

Siapkan environment

NODE_01=litekube01
NODE_02=litekube02
NODE_03=litekube03
NODE_IP01=172.16.0.111
NODE_IP02=172.16.0.112
NODE_IP03=172.16.0.113

kemudian tambahkan hostname statis di /etc/hosts untuk semua node.

cat <<EOF >> /etc/hosts
$NODE_IP01 $NODE_01
$NODE_IP02 $NODE_02
$NODE_IP03 $NODE_03
EOF

Tambahkan Repository dan Instal CRI-O

CRIO_VERSION=v1.32
cat <<EOF > /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/rpm/
enabled=1
gpgcheck=1
gpgkey=https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/rpm/repodata/repomd.xml.key
EOF

Instal paket & dependensi

dnf install -y epel-release
dnf install -y container-selinux cri-o

Unduh dan instal k3s

curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_START=true INSTALL_K3S_CHANNEL=v1.32.5+k3s1 sh -s - server

Bootsraping cluster

Eksekusi hanya di node control-plane pertama

Buat folder /etc/rancher/k3s kemudian buat file konfigurasi berdasarkan variabel environment yang telah kita definisikan sebelumnya

mkdir -p /etc/rancher/k3s
cat <<EOF | tee /etc/rancher/k3s/config.yaml
cluster-init: true
node-ip: $(hostname -I | awk '{print $1}')
write-kubeconfig-mode: "0600"
tls-san:
  - "localhost"
  - "127.0.0.1"
  - "$NODE_01"
  - "$NODE_IP01"
  - "$NODE_02"
  - "$NODE_IP02"
  - "$NODE_03"
  - "$NODE_IP03"
container-runtime-endpoint: unix:///var/run/crio/crio.sock
cluster-cidr: 10.42.0.0/16
service-cidr: 10.43.0.0/16
# Buat snapshot etcd setiap 6 jam
etcd-snapshot-schedule-cron: " */6 * * *"
# Simpan 56 snapshot etcd (setara dengan 2 minggu dengan 6 snapshot per hari)
etcd-snapshot-retention: 56
EOF

Jika semuanya sudah siap, jalankan service dan terapkan agar berjalan saat VM booting

systemctl enable --now k3s.service

Terapkan Canal CNI (Calico untuk policy dan flannel untuk networking)

curl -sSL https://raw.githubusercontent.com/projectcalico/calico/v3.30.1/manifests/canal.yaml -o $HOME/canal.yaml
sed -i 's|10.244.0.0/16|10.42.0.0/16|g' $HOME/canal.yaml
cp $HOME/canal.yaml /var/lib/rancher/k3s/server/manifests/canal.yaml

Gabung node control-plane lain ke cluster

Dapatkan token cluster di node pertama di /var/lib/rancher/k3s/server/agent-token tampilannya seperti ini

[root@litekube01 ~]# cat /var/lib/rancher/k3s/server/agent-token
K10bb908f13304637e4547ad7a40edac1c3c25165c6812c65a36f327fb99d33aa86::server:359dbfc03ab8ef930664d10adeb45397
curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_START=true INSTALL_K3S_CHANNEL=v1.32.5+k3s1 sh -s - server

Sama seperti node pertama, buat folder /etc/rancher/k3s kemudian buat file konfigurasi berdasarkan variabel environment yang telah kita definisikan sebelumnya tetapi kita menambahkan nilai token dan server.

mkdir -p /etc/rancher/k3s
cat <<EOF | tee /etc/rancher/k3s/config.yaml
server: https://$NODE_01:6443
token: K10bb908f13304637e4547ad7a40edac1c3c25165c6812c65a36f327fb99d33aa86::server:359dbfc03ab8ef930664d10adeb45397
node-ip: $(hostname -I | awk '{print $1}')
write-kubeconfig-mode: "0600"
tls-san:
  - "localhost"
  - "127.0.0.1"
  - "$NODE_01"
  - "$NODE_IP01"
  - "$NODE_02"
  - "$NODE_IP02"
  - "$NODE_03"
  - "$NODE_IP03"
container-runtime-endpoint: unix:///var/run/crio/crio.sock
cluster-cidr: 10.42.0.0/16
service-cidr: 10.43.0.0/16
# Buat snapshot etcd setiap 6 jam
etcd-snapshot-schedule-cron: " */6 * * *"
# Simpan 56 snapshot etcd (setara dengan 2 minggu dengan 6 snapshot per hari)
etcd-snapshot-retention: 56
EOF

Post Bootsraping Cluster

Pada langkah ini, eksekusi dilakukan di semua node

Perbarui PATH di file .bashrc di $HOME/.bashrc dan /etc/skel/.bashrc dengan text editor kemudian sesuaikan seperti ini:

#export PATH
export PATH=$PATH:/usr/local/bin

Buat dan tautkan atau salin file kredensial cluster.

mkdir -p $HOME/.kube
ln -s /etc/rancher/k3s/k3s.yaml $HOME/.kube/config

Buat file konfigurasi cri-tools.

cat <<EOF > /etc/crictl.yaml
runtime-endpoint:  unix:///var/run/crio/crio.sock
image-endpoint:  unix:///var/run/crio/crio.sock
timeout: 10
debug: false
EOF

Instal helm versi terbaru

HELM_VER=$(curl -sL https://get.helm.sh/helm-latest-version)
HELM_FILE=helm-$HELM_VER-linux-amd64.tar.gz
curl -sSL https://get.helm.sh/helm-$HELM_VER-linux-amd64.tar.gz -o $HELM_FILE; tar -zxf $HELM_FILE
mv linux-amd64/helm /usr/local/bin

Perbarui bash completion untuk memudahkan administrasi cluster

for i in kubectl crictl helm; do
   $i completion bash | tee /etc/bash_completion.d/$i > /dev/null;
done
source /usr/share/bash-completion/bash_completion

Sekarang Anda dapat mengadministrasi cluster k3s dan men-debug node kubernetes dengan crictl tampilannya seperti ini: kubectl-crictl.webp

Agent/Worker gabung node ke cluster

Ketika kita membutuhkan penskalaan cluster horizontal, kita dapat menambahkan node agent/worker. Unduh dan instal k3s untuk agent dan salin token cluster di node pertama $NODE_01 di /var/lib/rancher/k3s/server/agent-token

curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=v1.32.5+k3s1 sh -s - agent --server https://$NODE_01:6443 \
--token K10bb908f13304637e4547ad7a40edac1c3c25165c6812c65a36f327fb99d33aa86::server:359dbfc03ab8ef930664d10adeb45397

Referensi: