Kubernetes di GIO Public

-

PENDAHULUAN

Kubernetes adalah platform open-source berbasis Linux yang dirancang untuk mengotomatisasi penempatan, penskalaan, dan manajemen aplikasi yang berada dalam kontainer. Kubernetes dimulai oleh Google pada tahun 2015 dan saat ini merupakan salah satu bagian dari Cloud Native Computing Foundation project.

Fitur Kubernetes

  1. Automatic Binpacking : Kubernetes mengizinkan user untuk memberikan kontainer dengan CPU dan RAM secara spesifik. Ketika kontainer memiliki sumber daya yang ditentukan, Kubernetes dapat membuat keputusan yang lebih baik dalam mengelola sumber daya untuk kontainer.
  2. Horizontal Scaling : Kubernetes dapat melakukan scale up dan down aplikasi mengunakan perintah sederhana, dengan UI atau dengan otomatis berdasarkan pengunaan cpu.
  3. Self-healing : Kubernetes dapat merestart kontainer yang gagal, mematikan dan mengganti kontainer yang tidak menanggapai request, dan kubernetes tidak akan memberikan trafik ke kontainer sampai kontainer benar-benar siap untuk menerima request (ready to serve).
  4. Service discovery and load balancing : Kubernetes dapat mengekspose kontainer menggunakan nama DNS atau menggunakan IP address server itu sendiri. Jika trafik ke kontainer besar, kubernetes akan otomatis melakukan load balancing trafik (penyeimbanagn beban) dan melakukan distribusi trafik sehingga aplikasi selalu stabil.
  5. Secret and configuration management : Kubernetes memungkinkan anda untuk menyimpan data-data yang sentitif, seperti password, auth token dan ssh keys. Anda dapat membangun dan mengupdate secret tanpa harus membangun ulang container image anda, dan tanpa mengekspose secret anda didalam konfigurasi anda.
  6. Storage orchestration : Kubernetes memungkinkan untuk me-mount sistem storage yang anda inginkan, seperti lokal storage, storage dari cloud provider, ataupun network storage seperti NFS, iSCSI, Gluster, Ceph, dan Cinder.

Arsitektur Kubernetes

Komponen Kubernetes

  1. Komponen Master
  • Kube-apiserver : merupakan front-end dari kontrol plane Kubernetes dan merupakan komponen di node master yang mengekspos API Kubernetes. Komponen ini didesain agar dapat di-scale secara horizontal. Server API Kubernetes memvalidasi dan mengonfigurasikan data untuk objek api yang mencakup pod, services, replication controller, dan lainnya.
  • Kube-controller-manager : merupakan komponen di node master yang menjalankan kontroler. Secara logis, setiap kontroler adalah sebuah proses yang berbeda, tetapi untuk mengurangi kompleksitas, kontroler-kontroler ini dikompilasi menjadi sebuah binary yang dijalankan sebagai satu proses.
  • Kube-scheduler : merupakan komponen di master yang bertugas mengamati pod yang baru dibuat dan belum di-assign ke suatu node dan kemudian akan memilih sebuah node dimana pod baru tersebut akan dijalankan.

2. Komponen Worker :

  • Container runtime (Contohnya Docker)
  • Kubelet : merupakan agen yang dijalankan pada setiap node di kluster dan bertugas memastikan kontainer dijalankan di dalam pod.
  • Kube-proxy : bertugas membantu abstraksi service Kubernetes melakukan tugasnya. Hal ini terjadi dengan cara memelihara aturan-aturan jaringan (network rules) serta meneruskan koneksi yang ditujukan pada suatu host.

Istilah-istilah Pada Kubernetes

  1. Pod : merupakan objek terkecil didalam cluster kubernetes. Pod menjalankan docker images sehingga membentuk sebuah container didalam pod. Sebuah pod memiliki ip address dan hanya bisa diakses dari lokal kubernetes cluster itu sendiri.
  2. Service : digunakan untuk mengekpose pod supaya pod bisa diakses dari luar. Service seperti Load Balancer dan pod merupakan targetnya. Jadi satu service bisa mengarahkan request ke beberapa pod.
  3. Volume : merupakan sebuah directory yang memungkinkan data di simpan didalamnya dan terletak diluar container.
  4. Namespace : digunakan untuk memisahkan resource atau environment. Anda dapat membuat tiap project di berbeda namespace untuk mengisolasi project supaya tidak saling terganggu satu sama lain. Jika anda tidak mendeklarasikan namespace, maka namespace yang akan digunakan adalah namespace default.

Gambaran Topologi


LANGKAH KERJA

PERSIAPAN

1. Persiapkan Network Non VPC di GIOPublic.

  • Login ke https://cloud.biznetgiocloud.com -> GIOCloud Portal.
  • Pilih My Services -> Manage Resources.
  • Pilih Network -> Add New.
  • Isikan detailnya, sebagai contoh:



2. Persiapkan Virtual Machines (Buat 3 Virtual Machine)

  • Login ke https://cloud.biznetgiocloud.com -> GIOCloud Portal.
  • Pilih My Services -> Manage Resources.
  • Pilih Instances -> Launch VM-- Pilih spek VM yang diinginkan, sebagai contoh XL04.
    -- Pilih Ubuntu 16.04 template.
    -- Configure & Subscribe.
    -- Isikan hostname dan display name.
    -- Pilih network yang sebelumnya dipersiapkan dan isikan ip static.
    -- Ceklis agreement
    -- Subscribe and provision.
  • Buat 2 buah Virtual Machine spek sama untuk Kubernetes Worker Node


3. Konfigurasi NAT di Node Master.

  • Pilih My Services -> IP Address.
  • Pilih Acquire IP untuk mendapatkan IP Public.
  • Pilih IP Address -> Setting -> Enable Static NAT
  • Pilih VirtualMachine = Master.


4. Konfigurasi firewall di Portal GIO GIO.Masuk ke Portal -> IP Address -> Pilih IP Master -> Firewall.

-- Untuk Node Master, buka port 6443, 2379-2380, 10250-10252.
-- Referensi : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/


5. Login ke setiap node Kubernetes, lakukan:

  • update OS : apt-get update && apt-get upgrade && apt-get clean all && apt-get autoremove
  • upgrade OS ke Ubuntu 18.04 : do-release-upgrade && apt-get dist-upgrade
  • reboot Virtual Machine.
  • cek versi Virtual Machine. Pastikan sudah 18.04.



KUBERNETES CLUSTER SETUP

Konfigurasi Konektivitas antar node dan tambahkan user.

Login ke setiap node melalui ssh dengan user root.

1. Mapping nama node di setiap /etc/hosts virtual machine :

kubernetes.master# cat >> /etc/hosts
10.10.10.2             kubernetes.master
10.10.10.3             kubernetes.worker01
10.10.10.4             kubernetes.worker02
Kubernetes.worker01# cat >> /etc/hosts
10.10.10.2             kubernetes.master
10.10.10.3             kubernetes.worker01
10.10.10.4             kubernetes.worker02
kubernetes.worker02# cat >> /etc/hosts
10.10.10.2             kubernetes.master
10.10.10.3             kubernetes.worker01
10.10.10.4             kubernetes.worker02

2. Pastikan konektivitas antar node sudah oke.

kubernetes.master# ping -c3 kubernetes.master
kubernetes.master# ping -c3 kubernetes.worker01
kubernetes.master# ping -c3 kubernetes.worker02
kubernetes.worker01# ping -c3 kubernetes.master
kubernetes.worker01# ping -c3 kubernetes.worker01
kubernetes. worker01# ping -c3 kubernetes.worker02
kubernetes.worker02# ping -c3 kubernetes.master
kubernetes.worker02# ping -c3 kubernetes.worker01
kubernetes.worker02# ping -c3 kubernetes.worker02

3. Tambahkan user dengan privileges sudo di setiap node:

kubernetes.master# adduser kubernetes
kubernetes.master# usermod -a -G sudo kubernetes
kubernetes.worker01# adduser kubernetes 
kubernetes.master# usermod -a -G sudo kubernetes
kubernetes.worker02# adduser kubernetes 
kubernetes.master# usermod -a -G sudo kubernetes

4. Matikan service firewall ufw:

kubernetes.master# systemctl stop ufw; systemctl disable ufw
kubernetes.worker01# systemctl stop ufw; systemctl disable ufw
kubernetes.worker02# systemctl stop ufw; systemctl disable ufw

Install Kubernetes Packages.
Login ssh ke setiap node worker kubernetes:

1. Install depedensi pendukung dan docker.

kubernetes.master$ sudo apt update; sudo apt upgrade -y; sudo apt autoremove
kubernetes.master$ sudo apt install -y docker.io; sudo docker version
kubernetes.master$ sudo apt install -y apt-transport-https; curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
kubernetes.worker01$ sudo apt update; sudo apt upgrade -y; sudo apt autoremove
kubernetes.worker01$ sudo apt install -y docker.io; sudo docker version
kubernetes.worker01$ sudo apt install -y apt-transport-https; curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
kubernetes.worker02$ sudo apt update; sudo apt upgrade -y; sudo apt autoremove
kubernetes.worker02$ sudo apt install -y docker.io; sudo docker version
kubernetes.worker02$ sudo apt install -y apt-transport-https; curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add –

2. Tambahkan repository kubernetes:Tambahkan repository kubernetes:

kubernetes.master$ sudo echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > kubernetes.list 
kubernetes.master$ sudo mv kubernetes.list /etc/apt/sources.list.d/kubernetes.list
kubernetes.worker01$ sudo echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > kubernetes.list
kubernetes.worker01$ sudo mv kubernetes.list /etc/apt/sources.list.d/kubernetes.list
kubernetes.worker02$ sudo echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > kubernetes.list
kubernetes.worker02$ sudo mv kubernetes.list /etc/apt/sources.list.d/kubernetes.list

3. Install kubectl, kubelet, and kubeadm

kubernetes.master$ sudo apt update; sudo apt install -y kubectl kubelet kubeadm
kubernetes.master$ sudo apt-mark hold kubelet kubeadm kubectl
kubernetes.worker01$ sudo apt update; sudo apt install -y kubectl kubelet kubeadm 
kubernetes.worker01$ sudo apt-mark hold kubelet kubeadm kubectl
kubernetes.worker02$ sudo apt update; sudo apt install -y kubectl kubelet kubeadm
kubernetes.worker02$ sudo apt-mark hold kubelet kubeadm kubectl

4. Disable swap di setiap node kubernetes

kubernetes.master$ sudo swapoff -a
kubernetes.worker01$ sudo swapoff -a 
kubernetes.worker02$ sudo swapoff -a

Kubernetes Master Setup

SSH login to master node with kubernetes user.

1. Inisialisasi kubernetes master :

kubernetes.master$ sudo kubeadm init --pod-network-cidr=10.244.10.0/16


2. Start kubernetes cluster dan copy file konfigurasi

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

3. Install POD Network Flannel

kubernetes.master$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubernetes.master$ kubectl apply -f kube-flannel.yml
kubernetes.master$ watch -n1 kubectl get pods --all-namespaces
*wait until all pods state became ready


4. Tampilkan token untuk autentikasi node worker join ke cluster:

kubernetes.master$ sudo kubeadm token list
kubernetes.master$ sudo openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'



Kubernetes Worker Setup

Login ssh ke setiap node worker :

1. Join worker node ke cluster kubernetes dengan format perintah berikut :

sudo kubeadm join --token [TOKEN] [NODE-MASTER]:6443 --discovery-token-ca-cert-hash sha256:[TOKEN-CA-CERT-HASH]
kubernetes.worker01$ sudo kubeadm join --token ocnvnq.bqgbb456ng74b2gr kubernetes.master:6443 --discovery-token-ca-cert-hash sha256:3d2e1f85e19671c9cb3eec1f9ee9a9cbed4f84ce23a8949aa61f9abcfb6d3e82
kubernetes.worker02$ sudo kubeadm join --token ocnvnq.bqgbb456ng74b2gr kubernetes.master:6443 --discovery-token-ca-cert-hash sha256:3d2e1f85e19671c9cb3eec1f9ee9a9cbed4f84ce23a8949aa61f9abcfb6d3e82



Kubernetes Cluster Verification

Login ssh ke master node dengan user kubernetes.

1. View cluster and nodes status.

kubernetes.master$ kubectl config view 
kubernetes.master$ kubectl cluster-info 
kubernetes.master$ kubectl get nodes


2. Kubernetes cluster setup has finished and ready to use.

KUBERNETES DASHBOARD SETUP

SSH login to master node with kubernetes user.

1. Install kubernetes dashboard

kubernetes.master$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml

Verification pod dan service kubernetes dashboard sudah rinning

kubernetes.master$ kubectl get svc --all-namespaces -o wide
kubernetes.master$ kubectl -n kubernetes-dashboard get svc

2. Expose kubernetes dashboard ke public dengan tipe service NodePort.

kubernetes.master$ kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard 
*change type: ClusterIP to NodePort, below is the example :


kubernetes.master$ kubectl get svc --all-namespaces -o wide


3. Buka port kubernetes dashboard di portal GIO.


4. Set RBAC permissive permission untuk login ke dashboard kubernetes

kubernetes.master$ kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --user=admin --user=kubelet --group=system:serviceaccounts

5. Akses kubernetes dashboard :
Tampilkan token :

kubernetes.master$ kubectl --kubeconfig config/admin.conf -n kube-system describe secret $(kubectl --kubeconfig config/admin.conf -n kube-system get secret | grep admin-user | awk '{print$1}')


6. Buka url kubernetes dashboard di browser dan masukan token yang muncul.

DEPLOYMENT KUBERNETES POD

Login melalui ssh ke node master

1. Jalankan deployment apache :

kubernetes.master$ kubectl run apache01 --image=httpd --port=80 --replicas=3 --labels="name=apache01"
kubernetes.master$ kubectl run apache02 --image=httpd --port=80 --replicas=3 --labels="name=apache02"
deployment.apps/apache01 created
deployment.apps/apache02 created
kubernetes.master$ kubectl get pods -o wide


2. Expose deployment apache ke public :

kubernetes.master$ kubectl expose deployment apache01 --port=80 --protocol=TCP --type=NodePort --external-ip=103.58.101.182  #using-nodeport 
kubernetes.master$ kubectl expose deployment apache02 --type=LoadBalancer --name=apache --external-ip=103.58.101.182  #using-loadbalancer
kubernetes.master$ kubectl get svc -o wide | grep -i apache 


3. Buka port deployment di portal GIO.

- Open port range 3000 until 32767 in GIOCloud Portal.


4. Akses deployment di browser.


5. Jalankan deployment MySQL (Referensi : https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/)

kubernetes.master$ kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml 
kubernetes.master$ kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml

Tampilkan informasi mengenai deployment:

kubernetes.master$ kubectl describe deployment mysql
kubernetes.master$ kubectl get pods -l app=mysql
kubernetes.master$ kubectl describe pvc mysql-pv-claim

Akses deployment melalui mysql client :

kubernetes.master$ kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql –ppassword


Creating User and Database in MySQL instance

mysql> create user 'userdb'@'%' identified by '@Biznetgio2019';
mysql> create database testdb;
mysql> grant all on testdb.* to 'userdb'@'%'; 
mysql> flush privileges;