Membangun High-availability Kubernetes untuk Production Ready

Hanya ingin berbagi pengalaman sewaktu bermain dengan kubernetes (k8s) untuk Membangun High-availability Kubernetes yang siap digunakan pada Production. Disini kita akan menggunakan 3 master yg tiap masternya terletak disetiap zones (datacenter) dan 3 workers dengan masing-masing pada tiap region. Untuk kebutuhan POC ini saya hanya akan menggunakan sesuai kebutuhan POC saja yaitu 3 Masters (t2.medium) dan 3 Workers (t2.medium).

Saran penulis, masters dikalikan 2 disetiap zonenya. Jadi andai di region master-eu-west-1a kita memiliki satu master, ditambahkan melebihi setiap zone yang ada dengan syarat quarum. Dan untuk workers silahkan disesuaikan dengan kebutuhan app anda.

Kita akan membangunnya di AWS Cloud dengan KOPS. Kops adalah tool yang digunakan untuk me-manage kube pada AWS cloud. Seperti layaknya kubectl. Kita juga akan menggunakan kubctl tapi pada tahap awal akan kita gunakan Kops. Untuk membangun dashboard, cluster-info dan lain-lain akan memakai kubectl. Untuk pengertian kubernetes, cara menginstall kops, maupun kubectl, saya kira sudah banyak yang menjelaskannya dan itu InsyaAlloh mudah.

Syarat persiapan sebelum memulai yang tidak perlu saya jabarkan disini adalah

1. Config AWS credentials pada environment kita, seperti dengan menginstall aws-cli
2. Install Kops
3. Install Kubectl
4. Membuat bucket di S3 untuk tempat state kops

Berikut adalah tahapan yang akan kita lakukan:

1. Membuat cluster Kubernetes
2. Setup Kubernetes Dashboard
3. Percobaan



1. Untuk membuat cluster yang dengan kapabilitas "High-availability" kuncinya adalah pada letak zones baik itu zones untuk pods maupun zones untuk masters.

contoh: --zones=eu-west-1a,eu-west-1b,eu-west-1c dan --master-zones=eu-west-1a,eu-west-1b,eu-west-1c.

Berikut perintah lengkapnya:

kops create cluster --name k8s.olxid.com --state=s3://kubernetes-state-heri --zones=eu-west-1a,eu-west-1b,eu-west-1c --master-zones=eu-west-1a,eu-west-1b,eu-west-1c --node-count=3 --master-count=3 --node-size=t2.micro  --master-size=t2.micro --dns-zone=olxid.com

Setelah mereview perubahan apa saja yg akan dibuat oleh kops saatnya kita apply dengan perintah berikut:
kops update cluster k8s.olxid.com --yes --state=s3://kubernetes-state-heri



Kita perlu menunggu AWS membuat apa yg kita sudah KOPS perintahkan tadi, seperti VPC, EC2 instances, Security group dan lain-lain. Kita bisa melihat pada AWS console, misal pada gambar dibawah ini adalah EC2 instances yang sudah terbentuk dengan rapih,

Bisa dilihat masters dan nodes yang sudah kita setup terbentuk di masing-masing region:



Proses lengkapnya biasanya akan memakan waktu sekitar 5-10 menit. Jika sudah kita bisa mengconfirm dengan perintah berikut:

 kubectl get nodes atau  kubectl get nodes --show-labels




Cek pod untuk namespace kube-system apakah sudah terbentuk dan running semua dengan:
kubectl get pod --namespace=kube-system



2. Untuk lebih greget kita install beberapa addonnya:

kubectl create -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/kubernetes-dashboard/v1.5.0.yaml
kubectl create -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/monitoring-standalone/v1.3.0.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/route53-mapper/v1.3.0.yml


Saatnya final check dengan perintah berikut:

kubectl cluster-info



3. Untuk mengetes HA-nya percobaan akan kita lakukan dengan membuat rc / replicas controller terlebih dahulu yang akan membentuk 1 pod, kemudian kita akan mematikan salah satu worker yang disitu terletak container aktif. Berikut stepnya: 
a. Buat replicas controller
b. Cari di instance mana letak container yang aktif
c. Matikan secara paksa instance yang ada container aktif
d. Lihat lagi dimana letak containernya berada

a. Buat replicas controller. Berikut yml filenya:

➜  my-kubernetes-files git:(master) ✗ cat unixhat-controller.yml
apiVersion: v1
kind: ReplicationController
metadata:
  name: unixhat-controller
spec:
  replicas: 1
  selector:
    app: ha-test
  template:
    metadata:
      labels:
        app: ha-test
    spec:
      containers:
      - name: k8s
        image: heriyanto/k8s
        ports:
        - name: nodejs-port
          containerPort: 3000

Perintahkan Kubernetes untuk buat replica controller:

kubectl create -f unixhat-controller.yml

Cek apakah rc dan pods sudah komplit terbentuk:

kubectl get rc
kubectl get pods



Terlihat jelas 1 buah pods sudah jadi, status running.

b. Sekarang mari kita cari tau di instance mana containernya terletak dengan perintah berikut:

kubectl get pods
kubectl describe pod [nama pod yang tercantum dari perintah diatas] | grep Node:



Nah terlihat pada instance mana container tersebut berada. pada Case yaitu:
Node: ip-172-20-71-68.eu-west-1.compute.internal/172.20.71.68

c. Sekarang kita coba untuk terminate instance tersebut, anggap Datacenter AWS di eu-west-1a down. Maka terputuslah semua services AWS.

Paste kan informasi yang didapat tadi pilih nama hostnya ip-172-20-71-68.eu-west-1.compute.internal atau ip internal 172.20.71.68.


Mari kita coba terminate instance tersebut.




d. Sekarang kita langsung cek pod dan letak containernya terletak dimana:

kubectl get pods
kubectl describe pod [nama pod yang tercantum dari perintah diatas] | grep Node:
kubectl describe pod unixhat-controller-n99pj |grep Node:


Jika kita perhatikan nama pod sudah berubah walaupun kita belum cari tau containernya dimana, dari situ juga sudah terlihat hilalnya #eh. Nah untuk membuktikan kita describe pod tersebut yang ternyata berada di instance yang berbeda dengan sebelumnya:

Node: ip-172-20-43-170.eu-west-1.compute.internal/172.20.43.170.

Nah.. Alhamdulillah saya sudah tunaikan amanah ilmu ini :D. Sebenarnya untuk di Production pods harus di replica menjadi lebih dari 1, disini tidak saya replica agar mudah di cari podsnya dimana berada dan membuktikan dengan 1 container aktif kubernetes melakukan tindakan HA.