Scaled, Virtualised, Clustered

Baru-baru ini saya menunjukan sebuah rancangan desain arsitektur platform pada seorang rekan dan meminta feedbacknya. Berikut komentarnya,

You might want to look into coreos for your *****, its trimmed down to be very easily deployable at scale, and etcd migth come in handy. The graph you drew is a “static” layout, this isn’t really anymore desireable actually. Take a look at Mesos and its “dynamic” restructuring of compute units. Since you might want to repurpose resources depending on time, so that its not running empty. Are you using any distributed filesystem? Looking at the graph I’m wondering why you are not building ontop of a flexible compute grid.

Cryptic, as always. Sebenarnya saya anggap cryptic karena keterbatasan saya pada topik yang dia sampaikan. Dia ingin saya cari tahu sendiri dengan mengekstrak isi feedback tersebut dan memahami maknanya melalui proses pencarian informasi yang lebih dalam. Padahal arsitektur platform yang saya perlihatkan sudah saya anggap ‘canggih’ karena digunakan pada produk yang sudah 5 tahun ini saya handle, tentunya dengan modifikasi sesuai dengan kebutuhan.

Setelah mendapatkan feedback tersebut mulailah mencari tau tentang coreos dan jeroan-jeroannya. Dari proses belajar tersebut saya bisa katakan bahwa yang dikatakan rekan tersebut sangat tepat, arsitektur yang saya tunjukan sudah ‘jadul’, ketinggalan jaman. Mungkin di dunia telekomunikasi masih dipakai tapi umurnya tidak akan lama lagi. Dengan melihat roadmap kedepan bisa saya pastikan bahwa arsitektur yang coba disampaikan oleh rekan ini akan menjadi pengganti arsitektur saat ini.

CoreOS

CoreOS merupakan sistem operasi opensource berbasis linux yang memanfaatkan beberapa teknologi ‘baru’ seperti systemd, container, cluster management, iPXE, dsb yang didesain dengan filosofi cukup unik. Untuk lebih jelasnya bisa melihat presentasi salah satu co-founder CoreOS berikut ini. Perbedaan paling jelas antara CoreOS dengan distro linux yang lain ditunjukan oleh gambar berikut ini (diambil dari presentasi pada link youtube yang sama).

Distro Linux Pada Umumnya
CoreOS

Distro Linux pada umumnya melakukan packaging berupa kernel linux, toolchain hingga aplikasi dasar yang umumnya dibutuhkan oleh aplikasi seperti scripting lang, database, ssl, java, dsb. Masalah yang umum terjadi adalah aplikasi dibuat dengan dependency tertentu seperti python versi 2.8 sementara distro linux yang digunakan memberikan package python versi 2.7. Filosofi CoreOS adalah memindahkan garis diatas sehingga sebuah distro seharusnya disederhanakan pada 4 hal saja: kernel, systemd, ssh, dan docker.

Buat saya systemd dan docker terasa cukup asing pada awalnya. Bagaimana caranya sebuah distro bisa bermanfaat hanya dengan 4 komponen diatas. Docker sebenarnya adalah hal umum buat para developer aplikasi. Docker menjadi favorite terutama karena para developer tidak perlu berurusan banyak dengan tetek bengek sistem. Sudah menjadi rahasia umum bahwa software development dan system administration adalah dua ilmu yang sangat sulit melekat secara bersamaan pada satu individu. Bagi software developer docker adalah anugerah, untuk mendapatkan sebuah database mysql mereka cukup pull docker image dan konek pada database. Simple. Tidak perlu lagi install sana sini, configure sana sini, dsb.

Namun banyak yang berpikir bahwa teknologi docker sama dengan teknologi virtual mesin, jadi kadang suka bingung juga apakah lebih baik menggunakan docker atau vagrant misalnya. Memahami teknologi docker akan membuat kita sadar kenapa komponen ini menjadi bagian dari CoreOS.

Docker

Sejatinya docker adalah sebuah aplikasi yang memanfaatkan linux container. Berikut ini penjelasan dari wikipedia.

Docker is an open-source project that automates the deployment of applications inside software containers, by providing an additional layer of abstraction and automation of operating-system-level virtualization on Linux

Untuk memahami docker lebih dalam kita harus memahami terlebih dahulu linux container. Penjelasan detail bisa dibaca langsung pada laman wikipedia. Dan untuk memahami linux container, ada baiknya kita membaca juga mengenai cgroups. Perbedaan mendasar dan signifikan antara LXC (linux container) dan aplikasi virtual mesin seperti virtualbox, vmware, parallels adalah LXC menyediakan operating system-level virtualization melalui virtual environment yang memiliki proses dan network space sendiri, dibandingkan teknologi virtual mesin yang membuat full-fledged virtual machine. Dan operating system-level virtualization ini memanfaatkan feature cgroup dari kernel linux yang di release sejak versi 2.6.24.

Bahasa gampangnya, jika kita install aplikasi seperti virtualbox maka virtualbox tersebut akan membuat semacam emulator hardware cpu, memory, disk, network interface yang sejatinya dibuat pada user space dan kemudian akan dimanfaatkan oleh sistem operasi yang akan berjalan diatas aplikasi virtual mesin tersebut. LXC beda, ketika suatu aplikasi berjalan didalam LXC maka aplikasi terebut akan mendapatkan akses langsung pada hardware host mesin, tidak ada emulator yang berjalan diatas user space sehingga sudah pasti performanya akan lebih baik. Fasilitas untuk LXC ini disediakan oleh kernel linux melalui cgroups.

http://en.wikipedia.org/wiki/Cgroups

Inilah alasannya kenapa LXC ataupun docker tidak bisa berjalan langsung pada sistem operasi selain linux, karena cgroups hanya dimiliki oleh kernel linux. Ketika sistem operasi lain seperti MacOSX ingin menggunakan docker maka sebenarnya docker tersebut di install pada linux yang berjalan diatas virtualbox (mis. melalui vagrant).

Pemahaman lebih lanjut mengenai LXC bisa didapatkan dari project LinuxContainers, project tersebut memberikan beberapa contoh LXC API untuk create, start, stop, destroy container. Docker, menggunakan prinsip yang sama. Namun docker juga dilengkapi oleh beragam feature tambahan lainnya seperti sharing container dengan komunitas secara otomatis sehingga kita bisa share hasil ‘build’ docker image suatu aplikasi mis. LAMP untuk kemudian digunakan oleh orang lain.

CoreOS ibarat kotak kosong / sebuah template. Docker image akan menjadi aplikasi yang berjalan diatas distro tersebut. Kita tinggal build image suatu aplikasi plus dependency-nya dirumah, push ke suatu server repo (public / private), CoreOS akan pull image tersebut dan dalam hitungan detik aplikasi siap digunakan. Dengan prinsip ini maka sistem operasi untuk server tidak seharusnya ‘bulky’ karena porsi terbesar sudah dihandle oleh container.

Systemd

Container adalah solusi untuk software delivery. Bagaimana dengan masalah scale? Ketika suatu aplikasi di deploy bisa jadi awalnya hanya membutuhkan resource sangan minim, katakanlah satu server. Namun ketika sudah berjalan dan pengguna aplikasi bertambah maka dibutuhkan suatu arsitektur yang baik agar bisa menambah kapasitas dengan mudah dan fleksibel. Ditambah lagi kebutuhan redundancy. Tentu saja cara manual bisa dilakukan, namun akan membutuhkan effort yang cukup besar dan skill dev ops tertentu dalam memaintain seluruh sistem.

Umumnya beragam pihak akan membuat framework sendiri untuk memaintain cluster, dan seringkali framework tersebut berada pada level aplikasi saja. Cluster management hampir tidak pernah menyentuh level sistem operasi. Ini yang membuat CoreOS berbeda. Ketika CoreOS booting maka bisa segera bergabung dalam suatu kelompok cluster dan menambah kapasitas cluster tersebut.

https://coreos.com/using-coreos/clustering/

Gambar diatas menunjukan bagaimana contoh cluster pada CoreOS. Aplikasi dalam container bisa berada pada physical server manapun, ketika aplikasi tersebut tiba-tiba mati maka cluster management CoreOS (fleet) akan bertanggung jawab mencari lokasi lain untuk container tersebut, bisa jadi pada server yang sama ataupun pada server lain didalam cluster yang sama. Fleet akan melakukan inisialisasi hingga aplikasi tersebut berjalan kembali.

Fleet memanfaatkan systemd yang merupakan 1 dari 4 komponen dasar CoreOS. Systemd merupakan pengganti init system yang sebelumnya telah digunakan bertahun-tahun oleh sistem operasi berbasis unix. Init merupakan proses pertama yang berjalan pada sistem varian unix termasuk linux setelah server booting. Pada dunia modern sistem init dianggap jadul dan tidak mumpuni lagi untuk memenuhi kebutuhan sistem operasi saat ini, untuk itulah systemd lahir. Systemd merupakan daemon yang akan mengontrol seluruh proses pada suatu sistem operasi. Systemd dapat mengontrol container, reboot server, start / stop proses, dsb. Fleet ibarat systemd pada level cluster, jadi jika dalam suatu cluster ada 10 server dimana masing-masing server terdapat systemd maka fleet dapat mengontrol seluruh server tersebut melalui systemd pada setiap server.

Contoh output dari systemctl

Fleet juga memiliki fungsi untuk provisioning servis. Ketika kita ingin menambakah suatu servis / aplikasi seperti webserver pada cluster, maka fleet akan bertanggungjawab memilih lokasi server, memanggil systemd pada server tersebut untuk melakukan instalasi servis, dan meminta systemd pada server tersebut untuk menjalankan servis / aplikasi. Inilah makna dari cluster management pada level sistem operasi.

Contoh paling menarik yang menunjukan manfaat CoreOS bisa kita lihat pada kedua link youtube berikut ini yang didalamnya menunjukan bagaimana proses ‘scale-up’ server terjadi di datacenter google dan facebook.

Ketika kapasitas butuh untuk ditambahkan maka tinggal masukan satu rack server, booting, dan integrasikan dengan suatu cluster. Dalam sekejap (tentunya dengan file konfigurasi dsb yang sudah dipersiapkan) server tersebut akan siap melayani traffik suatu aplikasi.

Ada lebih banyak lagi manfaat dari CoreOS, yang pasti sangat sesuai dengan kebutuhan saya saat ini dan banyak sekali pengetahuan mengenai sistem operasi modern yang bisa dipelajari. Semoga artikel ini sedikit banyak bermanfaat.

Cheers!

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.