Kubernetes

Kubernetes merupakan salah satu Container Orchestration open-source yang digunakan untuk melakukan manajemen workloads aplikasi yang dikontainerisasi, serta menyediakan konfigurasi dan otomatisasi secara deklaratif. Kubernetes berada di dalam ekosistem yang besar dan berkembang cepat. Service, support, dan perkakas Kubernetes tersedia secara meluas.

Google membuka Kubernetes sebagai proyek open source pada tahun 2014. Kubernetes dibangun berdasarkan pengalaman Google selama satu setengah dekade dalam menjalankan workloads bersamaan dengan kontribusi berupa ide-ide terbaik yang diberikan oleh komunitas.

Komponen Utama
"komponen-komponen tersebut lebih mudah dipahami saat dalam bentuk praktek (bukan saat belajar)"
 * pod: sekumpulan service yang di-manage cluster atau yang di-deploy ke satu node. Mudahnya pod itu ada didalam sebuah cluster.
 * cluster: sekumpulan mesin node (setidaknya satu) untuk menjalankan aplikasi dalam container (playgorunds pods). Mudahnya cluster itu sekumpulan rumah (perumahan), dan pod itu dalah rumahnya. Untuk membuat cluster maka dibutuhkan sebuah node yang dibuat dengan banyak cara, seperti menggunakan k3s, build from stratch, dan lain-lain.
 * node: node itu sebuah mesin worker di kubernetes (mencakup single/multi node) Sebuah node bisa berupa VM ataupun mesin fisik, tergantung dari klaster-nya. Jika node dianalogikan server fisik. Maka posisi sebuah cluster merupakan servis yang berjalan pada server fisik tersebut. Mesin ini melakukan tugas yang diberikan oleh control plane. Tanpa node, pods dan cluster tidak akan jalan. Lihat dokumentasi resmi di Arsitektur Kubernetes
 * namespace: ialah virtual cluster. Namespaces memungkinkan Kubernetes untuk mengelola beberapa cluster (untuk beberapa tim atau project) dalam cluster fisik yang sama.
 * control plane: kumpulan proses yang mengontrol node Kubernetes. Di sinilah semua tugas berasal. Pada level production biasanya berjalan di banyak komputer/server dan cluster-nya biasanya juga menjalankan banyak node.
 * services: proses dimana aplikasi yang berjalan diekspos dari sekumpulan pod sebagai layanan jaringan. Tujuan nya adalah agar client dapat mengakses service yang terdapat di dalam sebuah pods.
 * container: container ini mewakili dari 1 aplikasi, misalnya ada database postgresql atau ada web server apache tomcat.

Bagian Kubernetes Master (Control Plane)

 * kube-controller-manager: makhluk yang bertanggung jawab untuk memperhitungkan status cluster (seperti, jumlah pod yang berjalan) sampai status service didalam cluster (sejumlah pod) itu aktif atau sedang mati. Teknik bekerja kube-controller sederhana, yaitu hanya mendengarkan informasi kube-api-server untuk informasi detail dari status cluster
 * kuber-api-server: makhluk yang digunakan oleh dasbor Web UI dan service command line seperti kubeclt dalam mendapatkan service pada worker node sebagai mana fungsi api pada umumnya yang selanjutnya akan digunakan berinteraksi dengan cluster Kubernetes.
 * kube-scheduler: makhluk yang digunakan administrator untuk memutuskan bagaimana suatu event, resource, dan policy pada cluster yang dimiliki. Sama seperti kube-controller-manager, kube-scheduler mendapatkan informasi status cluster dari kube-api-server.
 * etcd: sebuah "storage stack" untuk master node Kubernetes yang digunakan key-value pairs dan digunakan untuk menyimpan policies, definitions, secrets, status sistem, dan lain-lain.

Bagian Kubernetes Node (Worker Node)



 * kubelet: makhluk yang menyampaikan informasi tentang kesehatan node kembali ke master node melalui api-server yang berada pada master node (control plane) serta menjalankan instruksi yang diberikan kepadanya oleh master node.




 * kube-proxy: service yang memungkinkan sebuah pod yang didalamnya adalah sebuah aplikasi untuk berkomunikasi satu sama lain di dalam satu cluster. Serta melempar keluar eksistensi dari aplikasi pada pod yang dimiliki ke jaringan luar (internet) jika memang dibutuhkan. Karena adanya kube-proxy, setiap pod dapat berbicara dengan setiap pod lainnya melalui sebuah proxy ini.




 * docker: makhluk yang merupakan dalang dari sistem per-kontaineran. Dalam satu cluster setiap node memiliki mesin docker engine untuk mengelola Container. (lihat halaman Docker)

Limitation of Container (Batasan kemampuan container)
Container menyediakan cara mudah untuk mengemas dan menjalankan layanan. Namun, seiring dengan bertambahnya jumlah container yang dikelola oleh perusahaan, pekerjaan SysAdmin terasa berat karena beban semakin meningkat seiring dengan kebutuhan untuk dengan cepat menanggapi kebutuhan.

Saat menggunakan container di lingkungan production, perusahaan sering kali membutuhkan:


 * mendapatkan komunikasi yang mudah antara sejumlah besar layanan.
 * Melimitasi penggunaan resource pada sejumlah container. Namun, sistem resource berupa RAM dan CPU pada container tidak dapat dilakukan limitasi
 * Merespons untuk lonjakan penggunaan aplikasi untuk menambah atau mengurangi container yang sedang berjalan yang tidak bisa dilakukan dengan hanya container. Dalam Kubernetes hal ini dapat dilakukan dengan sistem scheduler pada master node. Misal pada saat siang dimana lonjakan trafik penggunaan aplikasi sangat sedang tingginya, administrator dapat membuat rule tersebut secara otomatis untuk menambahkan resource lebih atau melipat gandakan container sesuai load yang dibutuhkan (dalam Kubernetes termasuk kedalam pod) dalam waktu itu secara otomatis.
 * kemungkinan terhadap kerusakan layanan dalam beberapa kasus seperti butuh fitur pada versi terbaru dalam sebuah librari atau tool yang sangat susah (tricky) di-handle secara manual oleh sebuah container dan butuh sebuah orchestration (cluster) semisal Kubernetes atau OpenShift.
 * dapat dengan mudah meluncurkan rilis baru ataupun ingin downgrade versi dari aplikasi yang dibuat kepada user (jika ternyata versi baru mengalami masalah)

Perusahaan sering kali memerlukan teknologi orkestrasi container karena runtime container (seperti Podman) tidak memenuhi persyaratan di atas secara memadai.

Kubernetes Overview
Sudah termasuk hal yang dibicarakan dari Limitation of Container tadi :v Sederhananya ia akan menyederhanakan proses deployment container yang secara manual mulai dari scaling, scheduler, deployment dan lain-lain (biasanya pada konsep kubernetes kata container diganti dengan pod yang isinya berupa satu atau banyak container ). Jika dilihat dalam konsep Kubernetes, prinsip microservices diterapkan sangat baik lagi dibandingkan container/single container (satu container dengan satu image).

Berikut adalah fitur-fitur Kubernetes:

Setelah semua fitur Kubernetes, tidak menjadikan Kubernetes menjadi tertinggi, Karena diangkat berdasarkan kekurangan-kekurangan Kubernetes, ada solusi yang lebih mudah berupa bentuk lain dari kubernetes yaitu sebuah Kubernetes Distro yang dibuat oleh berbagai vendor seperti RedHat dengan OpenShift-nya dan SUSE dengan Rancher-nya.
 * Load Balancing: hal ini terkait dengan penggunaan nginx sebagai load balancer ataupun reverse proxy yang melayani banyak aplikasi, maka jika mengimplementasikan Kubernetes service load balancer tersebut telah built-in tidak perlu mencari alat dari luar untuk sebuah service load balancer. Dimana Kubernetes menyediakan single DNS entry untuk setiap container yang berjalan pada cluster yang mana setiap pod memiliki sebuah IP address yang di-assign oleh Kubernetes akan diatur. Misal satu pod akan diatur untuk 10-20 request. Maka, apabila request yang datang lebih banyak sistem Load Balancing yang akan me-load balancing dari sebuah request yang satu ke pod yang mana, dan request berikutnya ke pod yang mana.
 * Horizontal scaling: di kubernetes sudah bisa men-scale up dan men-scale down dengan konfigurasi otomatis atau manual menggunakan command line ataupun web UI.
 * Self-healing: sebuah sistem yang digunakan untuk mengecek pod yang berisi sebuah container yang terdapat sebuah aplikasi. Sistem tersebut akan memeriksa bagaimana status pod tersebut apakah berjalan baik atau ada masalah. Apabila terdapat masalah maka akan dikirimkan sebuah notifikasi berupa tindakan selanjutnya apakah harus di-restart atau ada sesuatu yang diperbaiki.
 * Automated rollout: sebuah fitur untuk meluncurkan rilis baru (rollout) ataupun ingin downgrade versi dari aplikasi yang dibuat kepada user (jika ternyata versi baru mengalami masalah)
 * Secret and configuration management: hal ini terkait pada proses konfigurasi yang harus diberikan dan disimpan disebuah plain text seperti pada penggunaan docker (container) yang menyimpan informasi kredensial berupa token, password yang mungkin saja terekspos apabila saat di taruh pada repositori. Maka, kubernetes akan menyediakan konfigurasi yang akan di-apply jika ada yang ingin tidak diketahui orang atau terlihat secara plain text, bisa dijadikan private configuration seperti di enkripsi sehingga aplikasi lain tidak bisa baca.
 * Operators: sebuah metode untuk packaging dan deploying aplikasi kubernetes. Biasanya menggunakan sebuah framework seperti operator SDK, Lifecycle Management, dan operator metering yang intinya tidak jauh dari proses publishing sebuah aplikasi kubernetes.

Pranala Menarik

 * Kubernetes Cluster

Referensi

 * https://kubernetes.io/docs/concepts/overview/components/