Kubernetes Cluster

Kubernetes Cluster terdiri dari sekumpulan mesin pekerja (worker), yang disebut node. Setiap cluster memiliki setidaknya satu node pekerja (worker node) dan master node sebagai control plane. Sebelumnya dijelaskan pada komponen utama Kubernetes. Setidaknya SysAdmin haru paham node jenis mana yang cocok dan dibutuhkan untuk perusahaan apakah ingin memakai single node atau multi node.

Proses Planning Pembuatan Cluster
Sebelum SysAdmin memikirkan bagaimana membuat sebuah atau sekumpulan node agar dapat memiliki sebuah cluster untuk kubernetes, secara umum ada beberapa opsi yang harus disesuaikan dengan budget dan kebutuhan. Cluster dapat dibuat di local machine, local data center atau bare metal environments, atau ada juga solusi khusus di berbagai cloud provider seperti yang disediakan oleh GCP (Google Cloud Platform).

Beberapa pertimbangannya adalah sebagai berikut


 * Mau mencoba Kubernetes di komputer (sekedar pengujian lab) atau ingin membuat sebuah cluster dengan High-Availability (HA), multi-node? Maka, pilihlah distro yang sesuai dengan kebutuhan
 * Apabila merencanakan cluster dengan high-availability, pelajari bagaimana cara mengonfigurasi cluster pada multiple zone.
 * Apakah ingin menggunakan Kubernetes cluster disebuah hosting, seperti Google Kubernetes Engine (GKE) (CaaS/KaaS), Azure Kubernetes Service (AKS)(PaaS), atau ingin hosting sendiri cluster tersebut?
 * Apakah klaster tersebut akan berada pada on-premises, atau di cloud (IaaS)? Sayang sekali Kubernetes belum mendukung secara langsung hybrid kubernetes cluster semacam IaaS. Sebagai gantinya, kamu dapat membuat beberapa cluster di GKE atau AKS.
 * Jika ingin mengkonfigurasi Kubernetes di on-premises, pertimbangkan model jaringan yang paling sesuai.
 * Apakah ingin menjalankan Kubernetes pada "bare metal" hardware (server fisik) atau pada virtual machines (VM)?
 * Pastikan sudah paham dan terbiasa dengan beberapa komponen cluster yang dibutuhkan untuk menjalankan sebuah cluster.

Pembuatan Sebuah Cluster dengan kubeadm
Kalau mempunyai sebuah komputer atau laptop setidaknya 4GB RAM itu sebetulnya dapat dimanfaatkan untuk dijadikan sebuah beberapa server node (worker node) dan master node atau control plane.

Master server
root@master-node:~# cat /etc/hosts ... 192.168.1.6 master-node 192.168.1.10 worker-01 Pada sisi control plane hal yang diperlukan adalah sebuah Kubernetes v1.20 tidak memerlukan docker engine, maka tidak perlu install docker atau podman pada node master maupun node worker. Yang diperlukan saat ini ialah kubelet, kubeadm, dan kubectl.


 * Kubelet: service yang bekerja keras untuk berjalan di semua node sebagai keberlangsungan sebuah cluster.
 * Kubeadm: makhluk berupa command line tool yang berguna untuk memasang dan mengkonfigurasi setiap komponen cluster yang dibutuhkan
 * Kubectl: sebuah tool yang digunakan untuk mengirim perintah yang diintruksikan oleh SysAdmin ke cluster melalui perantara API

Proses instalasi dan persiapan kubelet, kubeadm, dan kubectl $ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg $ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" $ sudo apt-get install -y kubelet kubeadm kubectl docker-ce $ sudo apt-mark hold kubelet kubeadm kubectl sudo usermod -aG docker ${USER} su - ${USER} ~ ❯❯❯ sudo systemctl enable kubelet ~ ❯❯❯ sudo systemctl enable docker ~ ❯❯❯ sudo systemctl start kubelet ~ ❯❯❯ sudo systemctl start docker ~ ❯❯❯ kubeadm config images pull [config/images] Pulled k8s.gcr.io/kube-apiserver:v1.20.5 [config/images] Pulled k8s.gcr.io/kube-controller-manager:v1.20.5 [config/images] Pulled k8s.gcr.io/kube-scheduler:v1.20.5 [config/images] Pulled k8s.gcr.io/kube-proxy:v1.20.5 [config/images] Pulled k8s.gcr.io/pause:3.2 [config/images] Pulled k8s.gcr.io/etcd:3.4.13-0 [config/images] Pulled k8s.gcr.io/coredns:1.7.0 ~ ❯❯❯ sudo swapoff -a ~ ❯❯❯ sudo apt install socat conntrack ~ ❯❯❯ sudo kubeadm reset -y ~ ❯❯❯ sudo kubeadm init --api-advertise-address=192.168.1.6 --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=master ... '''Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.1.6:6443 --token 0frr6y.gl5lo88a9xb0y6ft \ --discovery-token-ca-cert-hash sha256:6223aeaf3cbf9e20f6f4b3029b686f9020bc23c1ad3aa4591d7a535e330ed605 Sampai sini cluster yang baru sukses terbuat. Namun, belum ada Master dan Woker yang join ke cluster tersebut menggunakan kubeadm. Maka berikut adalah proses mesin ini (sebagai master node) untuk join. Jika ingin menampilkan output tersebut berupa informasi node join command dapat dilakukan dengan kubeadm token create --print-join-command.
 * 1) Running Docker as normal user ###
 * 1) Start services ###
 * 1) download required services for cluster ###
 * 1) disable swap ###
 * 1) some required tool ###
 * 1) if before has a control plane installation and wan't to start again from beginning ###
 * 1) installing control plane service with api-advertise-address is master node ip address ###

Perintah berikut sekaligus menjalankan yang diinstruksikan sistem untuk master node. ~ ❯❯❯ mkdir -p $HOME/.kube ~ ❯❯❯ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config cp: overwrite '/home/bima/.kube/config'? bima@x220:~$ chown $(id -u):$(id -g) $HOME/.kube/config
 * 1) Menyetel agar user non-root dapat bisa menggunakan kubectl ###

~ ❯❯❯ kubectl --kubeconfig=/etc/kubernetes/admin.conf create -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
 * 1) deploy a pod network to the cluster using calico ###

Setelah itu tinggal Worker node untuk melakukan proses join ke control plane/master node yang telah dibuat

Worker 01
root@worker-01:~# cat /etc/hosts ... 192.168.1.6 master 192.168.1.10 worker-01 Pada virtual machine host worker 01 melakukan join ke cluster yang telah dibuat menggunakan kredensial berupa token dan cert hash yang sebelumnya digenerate oleh master node root@worker-01:~# kubeadm join 192.168.1.6:6443 --token 0frr6y.gl5lo88a9xb0y6ft \ > --discovery-token-ca-cert-hash sha256:6223aeaf3cbf9e20f6f4b3029b686f9020bc23c1ad3aa4591d7a535e330ed605 [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver, and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster. root@worker-01:~#

Pengecekan Status Satu Cluster Yang Telah Dibuat
Pada master server akan dilakukan pengecekan apakah worker node 01 telah berhasil join cluster. root@master-node:~# kubectl get nodes NAME         STATUS ROLES  AGE   VERSION master-node  Ready  master 55m   v1.19.3 worker-01    Ready         4m48s v1.19.3 Selanjutnya, akan dilakukan menambahkan sebuah aplikasi ke cluster yang telah berhasil dibuat. Proses membuat aplikasi baru tidak masalah dilakukan menggunakan server dengan roles master ataupun worker. root@master-node:~# kubectl apply -f https://k8s.io/examples/pods/commands.yaml pod / command-demo created Terakhir, dapat dilihat untuk memeriksa apakah sebuah pod yang pertama dengan aplikasi bernama command-demo telah berjalan. root@master-node:~# kubectl get pods NAME        READY STATUS    RESTARTS AGE command-demo 0/1  Completed 0        30s

Beberapa Opsi Dalam Pembuatan Sebuah Cluster
Selain cara sebelumnya dalam membuat sebuah cluster Kubernetes. Berikut ada beberapa opsi yang lebih simpel seperti menggunakan Minikube dan k3s:

Minikube
lightweight, easy to use, dashboard UI (minikube dashboard), single node (local kubernetes), 2 CPUs, 2GB RAM, 20GB disk $ sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils && curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube $ minikube start $ minikube start --driver=docker or $ minikube start --driver=kvm2 $ minikube start $ kubectl get po -A NAMESPACE    NAME                               READY   STATUS    RESTARTS   AGE kube-system  coredns-f9fd979d6-mbkk7            1/1     Running   0          2m41s kube-system  etcd-minikube                      1/1     Running   0          2m44s kube-system  kube-apiserver-minikube            1/1     Running   0          2m44s kube-system  kube-controller-manager-minikube   1/1     Running   0          2m44s kube-system  kube-proxy-rdw5n                   1/1     Running   0          2m41s kube-system  kube-scheduler-minikube            1/1     Running   0          2m43s kube-system  storage-provisioner                1/1     Running   0          2m46s ...
 * 1) prepare for minikube base system ###
 * 1) if error try with spesific driver ###
 * 1) start again ###
 * 1) accessing new cluster ###

k3s
lightweight, multi node, easy to use.

Proses setup k3s pada master node (VM host 1) or $ curl -sfL https://get.k3s.io | sh - $ systemctl status k3s $ sudo cat /etc/rancher/k3s/k3s.yaml apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3F ...    server: https://127.0.0.1:6443 name: default contexts: - context: cluster: default user: default name: default current-context: default kind: Config preferences: {} users: - name: default user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrakNDQVRlZ0F3SUJBZ0lJUC8wamtDWU9...    client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSVA3NHlEQzVBRGJkVmQxMFh... - name: default user: username: bima password: bismillah client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrakNDQVRlZ0F3SUJBZ0lJUC8wamtDWU9...    client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSVA3NHlEQzVBRGJkVmQxMFh... $ sudo cat /var/lib/rancher/k3s/server/node-token K1098526a9f3f28921a0248386d6c207bde4c260edec841da201b757d25f7d1c931::server:666367da95e338a438510908665a6f2d (this token will be placed in worker host. In my case I use Debian as worker node.) Proses join k3s pada worker node (VM host 2) $ curl -sfL https://get.k3s.io | sh -
 * 1) Download from https://github.com/rancher/k3s/releases/latest ###
 * 1) The kubeconfig file is written to /etc/rancher/k3s/k3s.yaml. This file is required for the Kubernetes configuration. Let see configuration ###
 * 1) Add authentication ###
 * 1) To install K3s on the server, the agent needs to pass K3S_URL along with the K3S_TOKEN or K3S_CLUSTER_SECRET variables. ###
 * 2) We will use the K3S_TOKEN variable, we can see it in /var/lib/rancher/k3s/server/node-token ###

$ NODE_TOKEN="K1098526a9f3f28921a0248386d6c207bde4c260edec841da201b757d25f7d1c931::server:666367da95e338a438510908665a6f2d" sudo k3s agent --server https://192.168.0.15:6443 --token ${NODE_TOKEN}

Pranala Menarik

 * https://kubernetes.io/docs/tasks/access-application-cluster/connecting-frontend-backend/
 * Skupper.io: Let your services communicate across Kubernetes clusters

Referensi

 * https://kubernetes.io/docs/concepts/overview/components/
 * https://www.liquidweb.com/kb/how-to-install-kubernetes-using-kubeadm-on-ubuntu-18/
 * https://help.ubuntu.com/community/KVM/Installation