Kubernetes adalah sistem container yang free dan open-source yang dapat digunakan untuk menggunakan dan mengelola container.

Kubernetes dikembangkan oleh Google dan dirancang khusus untuk autoscaling dan deployments otomatis. Kubernetes dapat berjalan di infrastruktur cloud apa pun dan bare metal.

Kubernetes memungkinkan Anda untuk mendistribusikan banyak aplikasi melintasi sekelompok node. Kubernetes hadir dengan serangkaian fitur yang kaya, termasuk Auto-scalability, Batch execution, Load balancing, Self-healing, Horizontal scaling, Service discovery, Storage orchestration, dan banyak lagi.

Dalam tutorial ini, kita akan membahas cara konfigurasi load balancing Nginx dengan Kubernetes di Ubuntu 18.04.

Persyaratan

  • Dua server dengan Ubuntu 18.04.
  • Minimal 2 GB RAM dipasang di setiap server.
  • Kata sandi root dikonfigurasikan di kedua server.

Memulai

Pertama, perbarui kedua server dengan versi stable terbaru. Jalankan perintah berikut untuk memperbarui server:

apt-get update && apt-get upgrade

Setelah kedua server diperbarui, restart untuk menerapkan semua perubahan.

Secara default, Kuberenetes tidak mendukung memori swap dan tidak akan berfungsi jika swap aktif. Jadi, Anda harus menonaktifkan swap memory di kedua server.

Untuk menonaktifkan swap memory, jalankan perintah berikut:

swapoff -a

Untuk menonaktifkan swap memory secara permanen, buka file /etc/fstab :

nano /etc/fstab

berikan Komentar (tanda #) pada baris terakhir yang ada kata swap:

# /etc/fstab: static file system information.
#
# use 'blkid' to print the universally unique identifier for a
# device; this may be used with uuid= as a more robust way to name devices
# that works even if disks are added and removed. see fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
# swap was on /dev/sda4 during installation
#UUID=65se21r-1d3t-3263-2198-e534c265e216 none            swap    sw              0       0

Simpan dan tutup file. Kemudian, jalankan perintah berikut untuk menerapkan perubahan konfigurasi:

mount -a

Selanjutnya, atur hostname resolution di kedua server. Jadi, setiap server dapat berkomunikasi satu sama lain menggunakan hostname.

Untuk melakukannya, buka file /etc/hosts menggunakan editor pilihan Anda:

nano /etc/hosts

Tambahkan baris berikut:

192.168.0.120 master
192.168.0.110 slave

Jangan lupa untuk mengganti IP 192.168.0.120 dan 192.168.0.110 dengan IP Anda.

Simpan dan tutup file ketika Anda selesai. Kemudian, lanjutkan ke langkah berikutnya.

Instal Docker Dan Kubernetes

Selanjutnya, Anda perlu menginstal Docker dan Kubernetes tool kubelet, kubeadm, dan kubectl di kedua server.

Pertama, instal paket yang diperlukan dan tambahkan GPG key dengan perintah berikut:

apt-get install apt-transport-https ca-certificates curl software-properties-common -y
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

Langkah berikutnya tambahkan repositori Docker CE di kedua server dengan menjalankan perintah berikut:

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Perbarui repositori dan instal Docker CE dengan perintah berikut:

apt-get update && apt-get install docker-ce -y

Setelah instalasi selesai, periksa status Docker CE dengan perintah berikut:

systemctl status docker

Anda akan melihat output berikut:

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-07-18 06:03:50 UTC; 1h 24min ago
     Docs: https://docs.docker.com
 Main PID: 3619 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
           ??3619 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 19 07:05:48 master dockerd[3619]: time="2019-07-18T06:03:48.574491681Z" level=warning msg="Your kernel does not support swap memory limit"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-18T06:03:48.575196691Z" level=warning msg="Your kernel does not support cgroup rt period"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-18T06:03:48.575733336Z" level=warning msg="Your kernel does not support cgroup rt runtime"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-18T06:03:48.582517104Z" level=info msg="Loading containers: start."
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-18T06:03:49.391255541Z" level=info msg="Default bridge (docker0) is assigned with an IP add
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-18T06:03:49.681478822Z" level=info msg="Loading containers: done."
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-18T06:03:50.003776717Z" level=info msg="Docker daemon" commit=0dd43dd graphdriver(s)=overla
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-18T06:03:50.009892901Z" level=info msg="Daemon has completed initialization"
Jul 19 07:05:50 master systemd[1]: Started Docker Application Container Engine.
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-18T06:03:50.279284258Z" level=info msg="API listen on /var/run/docker.sock"

Paket Kubernetes tidak tersedia di repositori default Ubuntu 18.04. Jadi, Anda perlu menambahkan repositori Kubernetes di kedua server.

Anda dapat menambahkannya dengan perintah berikut:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
 echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | tee /etc/apt/sources.list.d/kubernetes.list

Selanjutnya, perbarui repositori dan instal paket Kubernetes dengan perintah berikut:

apt-get install kubelet kubeadm kubectl -y

Setelah semua paket diinstal, Anda dapat melanjutkan untuk mengkonfigurasi server Master.

Konfigurasikan Kubernetes Server Master

Pertama, Anda perlu menginisialisasi cluster dengan alamat IP Private di server Master:

Anda bisa melakukannya dengan perintah kubeadm:

kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.0.120

Setelah Cluster diinisialisasi dengan sukses, Anda akan melihat output berikut:

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

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.0.120:6443 --token zsyq2w.c676bxzjul3upd7u \
    --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c 

Selanjutnya, Anda perlu mengkonfigurasi alat kubectl di server Master. Anda dapat melakukannya dengan perintah berikut:

mkdir -p $HOME/.kube
 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 chown $(id -u):$(id -g) $HOME/.kube/config

Selanjutnya, Anda perlu menggunakan CNI (Container Networking Interface) di server. Karena, cluster tidak memiliki CNI.

Anda bisa deploy CNI ke Cluster dengan perintah berikut:

kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

Anda akan melihat output berikut :

configmap/calico-config created
daemonset.extensions/calico-etcd created
service/calico-etcd created
daemonset.extensions/calico-node created
deployment.extensions/calico-kube-controllers created
deployment.extensions/calico-policy-controller created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
serviceaccount/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

Anda sekarang dapat memeriksa namespaces dengan menjalankan perintah berikut:

kubectl get namespaces

Jika semuanya berjalan dengan baik, Anda akan melihat output berikut:

NAME          STATUS    AGE
default       Active    4h
kube-public   Active    4h
kube-system   Active    4h

Selanjutnya, verifikasi apakah master node sekarang berjalan dengan benar dengan perintah berikut:

kubectl get nodes

Anda akan melihat output berikut:

name          status    roles     age       version
master   Ready     master    12m       v1.15.3

Tambahkan Slave ke Cluster Kubernetes

Selanjutnya, masuk ke server slave dan jalankan perintah berikut untuk menambahkan slave ke cluster Kubernetes:

kubeadm join 192.168.0.120:6443 --token zsyq2w.c676bxzjul3upd7u --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c

Selanjutnya, buka server master dan periksa apakah slave ditambahkan ke cluster Kubernetes Anda dengan perintah berikut:

kubectl get nodes

Anda akan melihat output berikut:

name status roles age version
master ready master 25m v1.15.3
slave ready 2m v1.15.3

Setelah selesai, Anda dapat melanjutkan ke langkah berikutnya.

Deploy NGINX di Cluster Kubernetes

Cluster Kubernetes sekarang telah terinstal, dikonfigurasi, dan berfungsi dengan baik. Saatnya untuk deploy Nginx di cluster Kubernetes.

Login ke server Master dan buat deployment Nginx dengan perintah :

kubectl create deployment nginx --image=nginx

Anda sekarang dapat list Nginx deployment dengan perintah :

kubectl get deployments

Anda akan melihat output :

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           99s

Setelah Nginx telah di deploy, aplikasi dapat diekspos dengan perintah :

kubectl create service nodeport nginx --tcp=80:80

Anda sekarang dapat melihat layanan dan alamat ClusterIP baru ditugaskan dengan perintah :

kubectl get svc

Anda akan melihat output :

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1             443/TCP   15m
nginx        ClusterIP   10.152.183.199           80:32456/TCP    60s

Selamat! Anda telah berhasil deploy Nginx di cluster Kubernetes. Anda juga dapat menambahkan node lain ke cluster Kubernetes dengan mudah. Untuk informasi lebih lanjut, lihat dokumen resmi Kubernetes di Dokumen Kubernetes.