Memakai GitHub Actions dan Github Packages Untuk Mengelola Image Docker

Salah satu tugas yang umum dilakukan oleh DevOps engineer adalah mengotomatisasikan proses building kode program yang dibuat oleh programmer. Misalnya, saat ada commit baru di branch master, Continuous Integration (CI) platform seperti Jenkins akan bekerja menghasilkan artifact yang dibuat dari kode program terbaru (misalnya file Jar/War untuk aplikasi Java, Python modules untuk aplikasi Python, dan sebagainya). Khusus untuk aplikasi yang dijalankan di cluster Kubernetes, artifact yang dihasilkan adalah sebuah image Docker yang biasanya dibuat berdasarkan isi file Dockerfile. Pada tulisan ini, saya akan mencoba menggunakan Github Actions sebagai CI platform untuk menghasilkan image Docker dan mempublikasikannya di GitHub Packages sehingga dapat saya pakai di cluster Kubernetes nantinya. Kedua fitur tersebut dapat dipakai tanpa biaya dengan batas eksekusi 2.000 menit untuk GitHub Actions dan penyimpanan 500 MB untuk Github Packages.

Kategori: DevOps Tags: Docker Kubernetes

Memakai Ingress Controller Di Kubernetes

Pada tulisan sebelumnya, saya menggunakan IP publik untuk mengakses service melalui load balancer eksternal dengan menggunakan tipe LoadBalancer. Kali ini, saya akan mencoba menggunakan ingress untuk mendapatkan lebih banyak kendali lagi. Seperti biasa, saya akan menggunakan minikube di komputer lokal. Kubernetes tidak dilengkapi dengan ingress controller sehingga langkah pertama adalah memilih salah satu ingress controller yang hendak dipakai. Kode program untuk ingress controller AWS, GCE dan NGINX secara resmi dikelola oleh tim Kubernetes; ada juga ingress controller lainnya dari pihak ketiga yang daftar selengkapnya dapat dijumpai di https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers.

Kategori: DevOps Tags: Kubernetes

Pengalamatan Pod dan Service Di Kubernetes

Kubernetes bekerja pada sistem terdistribusi yang terdiri atas satu atau lebih server yang disebut node. Untuk mencobanya di komputer lokal, saya tidak perlu sampai membangun home networking. Saya bisa menggunakan minikube yang merupakan implementasi ringan dari Kubernetes yang memang ditujukan untuk dipakai di komputer lokal. Minikube dapat menggunakan hypervisor dan virtual machine untuk men-simulasi-kan node Kubernetes di komputer yang sama. Khusus untuk sistem operasi Linux, minikube juga dapat langsung menggunakan Docker untuk menciptakan node Kubernetes tanpa menggunakan VM. Walaupun konsep “memakai container Docker untuk menjalankan Kubernetes yang akan mengelola container Docker lainnya” terdengar rekursif, ia menawarkan kinerja yang lebih baik.

Kategori: DevOps Tags: Kubernetes

Belajar Melihat Arsitektur Software

Pada suatu hari, saat berkunjung ke dokter umum, saya sudah mendapatkan resep obat hanya dalam beberapa menit. Bukankah setiap pasien adalah unik? Sang dokter tidak memeriksa apa aktifitas saya selama beberapa hari terakhir, mengetahui apa saja yang saya konsumsi, termasuk menanyakan alergi, dan sebagainya. Namun, bila sang dokter melakukan hal ini untuk seluruh pasiennya, saya tidak akan pernah mendapatkan antrian konsultasi. Sepertinya dokter tersebut punya preset resep tertentu berdasarkan tipe pasien dan penyakit yang sedang populer. Begitu juga saya tidak begitu berbeda: disaat saya harus merancang aplikasi dari nol, saya sudah punya beberapa “setelan” standar. Pada artikel ini, saya akan membahas dua arsitektur di benak saya: Kubernetes native dan cloud native. Dua arsitektur ini saling bertolak belakang sehingga mudah untuk melihat perbedaanya. Saya juga telah menyediakan contoh implementasi Kubernetes native dapat dilihat di GitHub latihan-k8s dan contoh implementasi cloud native di GitHub latihan-cloud-native.

Konfigurasi Jaringan Di Ubuntu Dengan Netplan

Pada suatu hari, saya ingin melakukan konfigurasi sederhana di server Ubuntu. Saya ingin mengubah yang sebelumnya menggunakan DHCP menjadi alamat statis dan memakai DNS yang saya tentukan. Seperti biasanya, saya segera melakukan pencarian di Google. Namun, semakin banyak membaca hasil pencarian yang muncul, saya semakin bingung apa yang harus dilakukan. Saya menemukan beberapa kata kunci seperti NetworkManager, systemd-networkd, dan Netplan, namun tidak mendapatkan penjelasan yang berarti mengenai seperti apa hubungan mereka dan mana yang harus saya pakai. Saya pun melakukan sedikit riset untuk mencari tahu jawaban ini.

Kategori: Network Tags: Ubuntu

Memakai Iterator Dan Generator Di Node.js

Di JavaScript, tidak ada class khusus untuk mewakili iterator. Semua object adalah iterator bila object tersebut memiliki sebuah method dengan nama next() yang mengembalikan sebuah object yang mengandung value dan/atau done. Ini disebut sebagai iterator protocol. Sebuah object disebut sebagai iterable apabila ia memiliki method dengan nama @@iterator (Symbol.iterator) yang mengembalikan sebuah iterator. Untuk next() yang dikerjakan secara asynchronous (seperti async next()), saya dapat mengganti @@iterator menjadi @@asyncIterator (Symbol.asyncIterator). Object dari String, Array, TypedArray, Map dan Set merupakan iterable. Konstruksi for...of dan for await...of dapat dipakai untuk melakukan iterasi pada iterable.

Kategori: Pemograman Tags: Node

Memakai Stream Di Node.js

Untuk membaca sebuah file, saya dapat menggunakan modul fasilitas yang ditawarkan oleh fs seperti readFile() untuk versi asynchronous atau readFileSync() untuk versi synchronous. Kedua functions tersebut akan membaca seluruh isi file dan menyimpannya ke memori (RAM) sebagai Buffer. Namun, sama seperti proses lainnya di sistem operasi, aplikasi Node.js juga memiliki batasan alokasi memori. Sebagai contoh, pada sistem saya, ukuran Buffer maksimum adalah 2 GB. Bila saya membaca file lebih besar dari 2 GB dengan readFile() atau readFileSync(), saya akan memperoleh pesan kesalahan seperti Range Error [ERR_FS_FILE_TOO_LARGE]: File size is greater than 2 GB. Apa yang harus saya lakukan bila tetap ingin memproses file tersebut? Saya bisa menggunakan Stream yang akan memproses file dalam bentuk potongan-potongan kecil. Secara garis besar, walaupun lebih rumit, stream akan lebih efisien terutama dalam memproses file besar.

Kategori: Pemograman Tags: Node

Menjalankan Kode Program Native Di Node.js

Ada kalanya modul bawaan Node.js tidak cukup dan programmer perlu mengakses fitur native di sistem operasi. Untuk itu, Node.js memiliki fasilitas memanggil kode program native yang ditulis dalam bahasa C/C++. Untuk mengetahui package yang menggunakan kode program native, saya dapat mencari file berakhiran *.node di node_modules. Sebagai contoh, package fsevents yang popular berisi kode program native dalam C untuk memberikan notifikasi bila file di folder tertentu berubah di sistem operasi Mac. Pada artikel ini, saya akan mencoba memanggil kode program native C yang menggunakan Xlib untuk menampilkan sebuah window di dekstop Linux.

Kategori: Pemograman Tags: Node