Telepresence: Lokal Development pada Kubernetes

Irvi Aini
Pujangga Teknologi
Published in
4 min readMar 13, 2019

Microservice merupakan sebuah arsitektur yang saat ini mulai banyak diterapkan. Arsitektur ini ditandai dengan sebuah aplikasi yang sebenarnya merupakan kumpulan dari beberapa servis dengan karakteristik sebagai berikut:

  • mudah di-maintain serta memungkinkan untuk dites
  • dapat di-deploy secara independen
  • loosely coupled
  • terorganisasi dalam kapabilitas bisnis

Mekanisme deployment dengan menggunakan VM yang sebelumnya dilakukan dianggap kurang scalable. Permasalahan lain yang muncul adalah kemungkinan adanya perbedaan versi software yang digunakan oleh Engineer selama masa development dan deployment. Dengan menggunakan container Engineer dapat lebih fokus terhadap logika yang digunakan selama proses development serta dependensi yang digunakan pada software yang sedang di-develop. Sementara itu, hal ini juga akan memudahkan bagian ops selama proses deployment berlangsung karena mereka tidak perlu pusing terhadap adanya perbedaan software yang digunakan dalam packaging application.

Seiring dengan munculnya kebutuhan deployment dengan menggunakan container ini, beberapa research yang dilakukan kemudian mengarah terhadap penggunaan Kubernetes sebagai orkestrasi kontainer. Kubernetes menyediakan beberapa konsep seperti self healing dan health check yang memudahkan dalam proses manajemen aplikasi yang dilakukan, termasuk proses rollout dan rollback aplikasi. Dengan demikian hanya aplikasi yang sudah siap untuk melayani traffic saja yang akan dihadapkan pada client.

Meskipun Kubernetes merupakan platform orkestrasi kontainer yang memudahkan mekanisme deployment di level production, tetapi terdapat beberapa kesulitan yang dihadapi ketika seorang engineer melakukan proses deployment di local machine mereka. Pada umumnya, hal ini terkait dengan perbedaan antara proses penyimpanan konfigurasi dan environment variable. Selain itu, permasalahan yang mungkin timbul adalah bagaimana mekanisme service discovery dapat dilakukan pada local machine. Selama ini proses service discovery dilakukan dengan cara menjalankan semua servis yang terlibat sekaligus meskipun pada kenyataannya hanya satu servis saja yang sedang di-develop. Hal ini terkadang menghambat proses development, mengingat suatu servis bisa saja memiliki lebih dari satu servis yang dependen terhadap servis tersebut. Hal penting lain yang menjadi landasan dilakukannya riset ini adalah proses onboarding yang diharapkan tidak memiliki learning curve yang terlalu tinggi di bagian infrastruktur, sehingga mereka lebih bisa berfokus terhadap proses development pada minggu-minggu awal mereka.

Salah satu solusi awal yang terpikir adalah dengan melakukan mekanisme testing dengan cara mengubah traffic dependency yang ada pada cluster test dan mengarahkannya pada kode yang akan dites. Masalah lain yang muncul adalah teknik ini kurang efisien. Untuk setiap image yang di-build dengan menggunakan CI/CD dan di-push ke private container registry, kita akan dikenakan biaya sesuai dengan berapa lama kita melakukan proses build. Solusi lain yang mungkin dilakukan adalah dengan cara menjalankan Minikube di local machine. Akan tetapi, hal ini juga masih dianggap cukup sulit. Segala hal yang terkait dengan mekanisme setup tidaklah semudah yang dibayangkan. Dengan mempertimbangkan hal-hal yang sudah dikatakan sebelumnya, akan sangat efisien apabila kita bisa langsung menjalankan kode di lokal dengan menggunakan dependensi servis lain yang sudah di-deploy pada cluster remote. Kemudian, suatu hari saya menemukan Telepresence, sebuah software yang di-develop oleh Datawire.

Pada dasarnya, Telepresence ini merupakan dual proxy, implementasi proxy ini dilakukan dengan menggunakan shuttle. Shuttle melakukan forwarding setiap port yang ada ke suatu network tertentu, tidak yang spesifik pada port yang ditentukan. Proses yang dilakukan oleh shuttle lebih menyerupai port forwarding, dibandingkan dengan VPN.

Proses development dengan menggunakan Telepresence tidak memerlukan proses pembuatan Docker image setiap kali terdapat perubahan di source code yang akan dites. Proses tes dilakukan dengan cara membuka koneksi antara client dan server. Setelah proxy terbentuk, terdapat beberapa hal yang dapat diakses melalui local machine:

  • akses terhadap servis lain yang ada di remote cluster dengan format:

<nama-service>.<nama-namespace>

  • akses terhadap ConfigMap, Secret, dan environment variable di remote cluster
  • akses cluster remote terhadap servis lokal

Ada beberapa metode proxy yang disediakan oleh Telepresence:

1. New Deployment

Metode ini biasanya dilakukan untuk servis yang baru di-develop. Apabila servis ini memiliki dependensi terhadap beberapa servis lain yang sebelumnya sudah terdapat di test cluster. Kita bisa menambahkan option — new-deployment ketika memulai Telepresence. Ketika kita menjalankan command Telepresence dengan flag ini, Telepresence akan membuat proxy dengan Deployment remote, dengan demikian kita bisa melakukan perubahan kode di local dan segera melihat hasil perubahan kode tersebut tanpa harus melakukan build Dockerimage, redeploy, dan sebagainya.

Sebagai contoh, misalkan kita memiliki sebuah code sebagai berikut:

#!/usr/bin/env python3

from http.server import BaseHTTPRequestHandler, HTTPServer

class RequestHandler(BaseHTTPRequestHandler):

def do_GET(self):

self.send_response(200)

self.send_header(‘Content-type’, ‘text/plain’)

self.end_headers()

self.wfile.write(b”Hello, world!\n”)

return

httpd = HTTPServer((‘’, 8080), RequestHandler)

httpd.serve_forever()

Step selanjutnya yang dilakukan adalah menjalankan command Telepresence:

localhost$ telepresence — new-deployment hello-world — expose 8080
localhost$ python3 helloworld.py

Selanjutnya, kita dapat menjalankan command validasi apakah servis yang diinginkan sudah dapat diakses dari dalam cluster:

localhost$ kubectl — restart=Never run -i -t — image=alpine console /bin/sh
kubernetes# wget -O — -q http://hello-world:8080/
Hello, world!

Misalkan kita ingin melakukan perubahan terhadap kode yang berada pada local machine kita:

python3 helloworld.py
^C
localhost$ sed s/Hello/Goodbye/g -i helloworld.py
localhost$ grep Goodbye helloworld.py
self.wfile.write(b”Goodbye, world!\n”)
localhost$ python3 helloworld.py

Dan kembali melakukan validasi kode:

kubernetes# wget -O — -q http://hello-world:8080/
Goodbye, world!
kubernetes# exit

Dengan demikian kita dapat melakukan proses development secara lebih cepat karena kita tidak perlu melakukan proses build Dockerimage hanya untuk mengetahui apakah servis yang kita kerjakan sudah memiliki behaviour yang sesuai dengan apa yang kita inginkan atau belum.

2. Swap Deployment

Bayangkan suatu saat seorang pegawai melaporkan adanya bug di cluster staging dan kita ingin melakukan debug terhadap service yang ada. Untuk melakukannya kita dapat menambahkan option — swap-deployment ketika memulai Telepresence. Setelah Telepresence dijalankan, maka secara otomatis traffic yang ada akan diarahkan terhadap local machine yang kita miliki. Dengan demikian kita dapat melakukan remote debug terhadap sesuatu yang ada di remote.

Referensi:

[1]. Shuttle. URL: https://github.com/sshuttle/sshuttle

[2]. Telepresence: Fast, Local Development for Kubernetes and Openshift Microservices. URL: https://www.telepresence.io/

P.S. Jika teman-teman menyukai artikel semacam ini, silakan subscribe ke newsletter kita dan dapatkan notifikasi artikel terbaru langsung di inbox kamu!

--

--

Irvi Aini
Pujangga Teknologi

Machine Learning, Natural Language Processing, and Open Source.