Kubernetes
Tutorial Kubernetes Series 3— Tugas dan Arsitektur Kubernetes
Tugas Kubernetes yang pertama adalah memastikan aplikasi berbasis container yang kita buat tidak mengalami downtime. Contohnya ketika kita ingin mengupdate versi dari aplikasi kita, tidak boleh ada downtime, Kalau ada lonjakan request juga tidak boleh ada downtime.
Kedua, kubernetes harus bisa melakukan scaling container aplikasi secara cepat (Scalability). kalau ada lonjakan request, maka jumlah container bertambah. Sebaliknya kalau request sepi, maka dapat menurunkan jumlah container untuk menghemat billing system.
Arsitektur Kubernetes
Kubernetes terdiri dari komponen berikut:
Control Plane (Otak kubernetes)
Komponen yang mengatur 1 atau lebih worker node. Tiap node dapat berupa Baremetal server/fisik VM ataupun Cloud.
Worker node
Masing-masing worker node berisi agent yaitu kubelet untuk dapat berkomunikasi dengan control-plane.
Jadi, aplikasi kita berjalan di worker-node dan sistem kubernetes jalan di control-plane.
Komponen di Control-plane
- API-Server
jalan sebagai linux proses atau container. Sebagai gerbang masuk ke cluster kubernetes. Baik menerima Call dari CLI (Kubectl), UI (Kube8s dashboard), API dari sistem terkait lainnya baik kubelet, dari aplikasi atau dari scripting kita.
2. Controller-Manager
Bertugas untuk memanage berbagai state didalam cluster. Memastikan jumlah container sesuai dengan kebutuhan dan memastikan container bisa diakses dengan IP tertentu dan manage hal lainnya terkait state workload aplikasi container kita.
3. Scheduler
Bertugas Menempatkan pod yang isinya container kita ke Worker-node yang tepat. Jadi node punya kapasitas CPU dan Memory, maka Scheduler bakal mencari node mana yang masih kosong/available yang dapat menampung aplikasi kita.
4. ETCD
Bertugas menyimpan state atau stateful. Kalau komponen lain mati atau di restart tidak masalah, karena tidak menyimpan state apa-apa. Sementara pada ETCD kita harus hati-hati. Karena kalau data hilang di ETCD, Cluster kita bisa rusak dan aplikasi kita bisa mati (downtime).
Pertanyaannya:
Bagaimana menghubungkan komponen yang ada di worker node dengan komponen yang ada di control-plane?
Jawabannya, adalah Virtual network. yang menghubungkan antar container dan komponen yang lain yang tersebar diberbagai worker node, Membuat agent/kubelet di tiap worker node dapat berkomunikasi dengan komponen yang ada di control-plane.
Akibatnya, Mesin-mesin worker node dan control-plane yang terpisah ini seolah-olah bergabung menjadi satu mesin yang besar. Dengan kubernetes, kita punya cluster atau kumpulan mesin yang kecil-kecil spec-nya digabung seolah-olah menjadi satu super-computer. Misal: masing-masing mesing memiliki: 4 Core VCPU dan 16 GB RAM. kalau kita punya 100 cluster node, maka kita bakal punya 400 VCPU dan 1600 GB RAM.
Konsep Dasar Kubernetes
- Pod merupakan unit terkecil yang bisa dideploy atau dijalankan didalam cluster.
- Pod adalah wrapper dari container, tiap worker node bisa menjalankan 1 atau lebih Pod. Dan 1 pod bisa terdiri dari 1 atau lebih container. Biasanya, 1 pod 1 aplikasi/container.
Contohnya:
Aplikasi database Postgre jalan sebagai 1 pod, aplikasi java jalan sebagai 1 pod, aplikasi golang jalan sebagai 1 pod. Kecuali beberapa aplikasi helper container yang coupled dengan aplikasinya bisa dibungkus menjadi 1 pod.
3. Semua worker node dihubungkan/dikomunikasikan oleh sebuah virtual network. Sehingga tiap Pod bisa punya IP adress lokal di dalam cluster bisa saling berkomunikasi lewat IP berikut. Jadi, setiap Pod bisa jadi merupakan server-server tersendiri. Bisa diakses oleh ip dan port dari masing-masing Pod.
4. Di kubernetes, kita tidak bisa menjalankan container secara langsung, tetapi harus melalui Pod nya. Dengan abstraksi Pod ini, kubernetes bisa restart container/aplikasi kita jika crash, dapat mengecek apakah aplikasi kita sehat atau tidak.
5. Konsekuensi Design dari Kubernetes, Pod bersifat Ephemeral, artinya sementara. jadi, IP pod tersebut akan berganti-ganti setiap dibuat oleh kubernetes. jadi, kalau ada pod yang crash, atau dimatikan sengaja oleh kubernetes, terus dibikin ulang lagi/restart maka Pod akan mendapatkan IP baru. Jadi, Kita gak dapat mengandalkan IP pod untuk berkomunikasi.
Solusi dari Point 5 adalah: Service
Lewat IP si service, aplikasi kita bisa dapat 1 IP permanent yang bisa diakses dari node mana saja di dalam 1 cluster.
6. Service juga berfungsi sebagai load balancer, dan aplikasi kita yang berjalan sebagai Pod. Jika kita punya 3 pod, maka si service akan melakukan load balance secara Round Robin dan menggilir/mendistribusikan request ke 3 pod tersebut secara adil.
Contoh File Konfigurasi kubernetes
Client yang call kubernetes API-Server harus memberikan payload dalam format: JSON atau YAML. Berikut Contohnya file konfigurasi dalam format YAML. Dalam hal ini saya ingin membuat sebuah deployment. yang merupakan template yang disediakan untuk mebuat Pod dalam cluster kubernetes. Kita sedang membuat 3 pod (replica: 3), yang didalam nya menjalankan container dari image nginx. ini sebuah reverse proxy yang kita expose di port 80.
Kita bisa lihat, file konfigurasi YAML bersifat deklaratif. Artinya, kita bisa tulis definisi state akhir di file konfigurasi.