Showing posts with label Containerization. Show all posts
Showing posts with label Containerization. Show all posts

Sunday, September 17, 2017

Deploy Stateless and Stateful Application in Kubernetes

Halo sobat Nostra, artikel selanjutnya kita akan membahas tentang bagaimana cara deploy sebuah aplikasi pada Kubernetes, baik itu aplikasi yang bersifat stateless maupun stateful. Dalam tutorial ini, diasumsikan bahwa Kubernetes sudah berjalan dengan baik pada environtment anda baik itu yang di setup sendiri di local anda, cloud, dan environment yang lain. Untuk mengecek status dari kubernetes yang sudah kita setup sebelumnya kita dapat menjalankan perintah: kubectl get nodes

1. Output perintah kubectl get nodes
Pada tampilan gambar 1. menampilkan berapa nodes yang sedang kita gunakan dalam kubernetes cluster kita. Dari output diatas kita dapat melihat bahwa status dari masing-masing node adalah "Ready" yang artinya kubernetes cluster sudah siap untuk digunakan. 
Sebelum kita deploy sebuah aplikasi di Kubernetes, saya akan jelaskan sedikit terkait apa itu aplikasi stateless dan stateful. Aplikasi yang bersifat stateless adalah sebuah aplikasi dimana sistem tersebut tidak menyimpan state dari user untuk request selanjutnya contohnya adalah aplikasi halaman landing page sebuah website, sementara aplikasi yang bersifat stateful adalah sebuah aplikasi yang menyimpan data dari setiap request yang diminta oleh user. Dan stateful application umumnya membutuhkan storage untuk menyimpan data dari user. Pada tutorial kali ini, saya akan deploy mysql-server namun yang bersifat stateless.
1. Stateless application

Pada kubernetes, ketika kita ingin deploy sebuah aplikasi kita harus membuat file.yaml nya terlebih dahulu untuk aplikasi tersebut.
2. mysql service

Berikut adalah contoh file simple service deployment untuk kubernetes dimana pertama kita menetukan versi api yang kita gunakan untuk objek tersebut. Kedua kita menentuka objek apa yang akan kita deploy, dalam hal ini kita akan deploy sebuah sevice terlebih dahulu dimana namanya adalah "wordpress-mysql". Selanjutnya adalah kita tentukan port berapa yang digunakan oleh container dalam deployment tersebut. Misalnya untuk mysql adalah 3306. 
 Setelah kita membuat service untuk  mysql, selanjutnya kita akan membuat deployment untk mysql tersebut. 
Seperti pada gambar 3, pertama terlebih dahulu kita membuat versi API yang kita gunakan untuk deploment tersebut. Lalu selanjutnya jenis objek yang akan kita gunakan, karena kita membuat sebuah deployment, maka kita masukkan value "Deployment". 
3. mysql deployment
Lalu selanjutnya ada beberapa label, yang kita gunakan pada file tersebut seperti "wordpress", nantinya label tersebut akan digunakan pada objek lain. Selanjutnya adalah menentukan image yang akan kita gunakan pada deployment tersebut. Bagian ini kita masukkan pada bagian container, serta beberapa environment lain yang jika dibutuhkan. Seperti pada file tersebut, adalah saya tambahkan environment untuk MYSQL_ROOT_PASSWORD, dimana password tersebut sudah terlebih dahulu disimpan ke dalam sebuah objek berupa secret. Lalu pada bagian terakhir, kita tentukan port container yang akan kita gunakan.
Selanjutnya kita akan coba jalankan deployment mysql tersebut pada kubernetes.
Untuk menjalankan deployment pada kubernetes dapat dilakukan dengan cara :
$ kubectl create -f "namafile.yaml" 



Selanjutnya kita akan cek bagaimana status deployment yang sudah kita buat.








Dari gambar diatas, tampil bahwa container sudah berjalan dengan baik. Selanjutnya kita akan masuk ke dalam container untuk melihat apakah deployment tersebut bersifat stateless atau tidak. Pada gambar dibawah ini, kita masuk ke dalam container dengan menjalankan perintah: $ kubectl exec -it "nama_container" bash. 
Lalu kita akan diarahkan pada sebuah container mysql, kita coba membuat database di dalam container dengan menjalankan perintah " create database testingaja". Lalu pod tersebut di hapus. 





Setelah pod tersebut dihapus, kubernetes akan otomatis create container yang sama dengan container sebelumnya seperti yang tampil pada gambar dibawah ini. Lalu kita masuk ke dalam container yang baru dengan cara sama dengan sebelumnya. Lalu kita cek databasenya, dan ternyata database yang sebelumnya kita create tidak ada. Ini adalah contoh deployment yang bersifat stateless, dimana data dari user tidak akan tersimpan secara permanen


2. Stateful Application
Untuk stateful deployment, pertama kita membutuhkan sebuah volume terlebih yang kita create, lalu volume tersebut di claim oleh deployment yang membutuhkan volume tersebut.
Berikut adalah contoh sederhana untuk membuat volume pada kubernetes.
Yang akan membuat 2 buah volume, dimana storage yang disediakan adalah 10Gb. Dan lokasi path sebagai tempat penyimpanan untuk setiap data yang di mount adalah folder /home/nostra/pv-1 maupun /home/nostra/pv-2 dari host kubernetes. 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-1
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /home/nostra/pv-1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-2
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /home/nostra/pv-2

File : local-volume.yaml --> Untuk menjalankannya : $kubectl create -f local-volume.yaml

Lalu selanjutnya kita akan membuat objek claim volume yang digunakan untuk claim volume yang sudah kita create sebelumnya.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

File : mysql-pv-claim.yaml --> Untuk menjalankannya: $kubectl create -f mysql-pv-claim.yaml
Selanjutnya kita akan create untuk deployment dari mysql.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim


File : wordpress-mysql.yaml --> Untuk menjalankannya: $kubectl create -f wordpress-mysql.yam

Setelah kita create deployment tersebut, kita akan coba masuk ke dalam container. Dan coba lihat kembali apakah database tetat tersimpan walaupun pod nya di hapus.





































Pada gambar diatas tampak bahwa kita sudah membuat sebuah database pada satu container, dengan nama database "testinglagi". Lalu selanjutnya kita akan hapus database tersebut, dan cek apakah database "testinglagi" masih ada.




























Dari gambar tampak bahwa, database yang sebelumnya kita create masih tersimpan. Berarti pada tutorial ini tampak jelas bagaimana caranya deploy sebuah aplikasi yang bersifat stateless dan stateful pada Kubernetes. Semoga tulisan ini bermanfaat bagi teman-teman sekalian.
Terimakasih.

Saturday, March 18, 2017

Mengenal Teknologi Containerization dengan Docker

Pada tulisan ini, Nostra akan sharing tentang salah satu teknologi yang sedang hype, yaitu Containerization. Tulisan ini bukan cuma untuk kalian para DevOps saja, tetapi juga berguna untuk para Application Developer. Mengapa demikian? simak tulisan ini sampai akhir.

Kalau kita bicara tentang Containerization, tentu kita perlu tau terlebih dahulu apa itu Containerization dan apa pilihan selain hal tersebut? Berangkat dari pertanyaan itu, kami akan membahas sekilas tentang Software Architecture. Setiap pengembangan aplikasi ataupun sistem pasti melewati tahap design, dimana pada fase tersebut akan dilakukan berbagai rancangan-rancangan mengenai apa yang akan dibuat. Rancangan pada fase tersebut tidak terbatas pada rancangan UI/UX saja, tetapi juga rancangan arsitektur dari sistem/aplikasi tersebut. Salah satu software architecture adalah microservices, well pembahasan tentang software architecture mungkin akan kami sajikan pada lain kesempatan.

Apa sih microservices itu?
Secara sederhana arsitektur microservices adalah sebuah rancangan dimana aplikasi tersusun atas banyak fungsi-fungsi (services) yang dapat berdiri sendiri.


Pemisahan fungsi tersebut akan membuat sistem/aplikasi menjadi loose coupled dan highly scalable. Mengapa menjadi highly scalable? Hal tersebut dikarenakan dengan arsitektur microservices kita dapat melalukin scaling sesuai kebutuhan dari masing-masing fungsi/service, sehingga ketika terdapat beberapa service yang butuh scaling maka kita cukup melakukan scaling pada fungsi tersebut saja. Keuntungan lain dari arsitektur seperti ini adalah kita dapat melakukan release aplikasi dengan siklus yang lebih cepat, seperti melakukan release setiap satu service selesai dikembangkan.

Lalu bagaimana antar-services tersebut dapat berkomunikasi? Well secara sistem mereka akan saling berkomunikasi dengan menggunakan interfaces yang telah disediakan pada setiap services, dimana komunikasi tersebut dilakukan menggunakan protokol yang ringan sehingga dapat berlangsung secara cepat, seperti menggunakan JSON/REST maupun ProtoBuff/gRPC.

Setelah membahas sekilas tentang microservices, mari kita masuk ke dalam pembahasan mengenai containerization itu sendiri. Well dalam mengelola aplikasi tentunya kita membutuhkan server, dimana umumnya pada server tersebut kita akan membangun Virtual Machines (VM) yang menjadi pijakan aplikasi kita untuk dapat berjalan. Beberapa tahun terakhir muncul sebuah pendekatan baru yang menjadi pesaing environment VMs tersebut, yaitu teknologi Containerization. Sebenarnya teknologi ini sudah lama ada, namun baru menjadi hype ketika Docker memperkenalkan produk mereka kepada dunia.

Apa sih Containerization itu?
Containerization itu sendiri adalah pendekatan dimana kita menjalankan multiple instances (containers) pada satu Operating System (OS) yang sama, dimana containers tersebut akan memiliki shared kernel.
Serupa dengan VM, dimana pada satu Host OS kita dapat menjalankan berbagai aplikasi lain yang terisolasi dari Host kita. Perbedaan utama antara virtualization dan containerization adalah pada virtualization kita menyalakan OS di dalam OS, sehingga secara resource dan performance akan lebih berat dibandingkan dengan containerization yang melakukan isolasi dari masing-masing aplikasi ke dalam virtual environment dengan shared kernel milik host. Tetapi bukan berarti virtualization adalah teknologi yang buruk, sebenarnya kedua teknologi tersebut memiliki tujuan yang sedikit berbeda. Kalau kita ingin memiliki environment yang sangat terisolasi satu sama lain, maka sebaiknya kita menggunakan VM. Apabila kita tidak perlu isolasi 100% maka containerization bisa menjadi pertimbangan.

Well sekilas sudah kita berbicara tentang arsitektur dan containerization, mari kita mulai membahas Docker. Docker adalah sebuah platform containerization yang sangat populer dan semakin populer. Docker memberikan kemudahan untuk menggunakan ataupun membangun 'isolated' environment untuk aplikasi. Penggunaan containerization dapat membantu kita dalam memahami konsep microservices, dimana satu container hanya untuk satu fungsi saja.



Bagaimana penggunaan Docker itu sendiri?
Docker dapat kita jalankan melalui terminal dengan command yang cukup sederhana, seperti pada gambar berikut.

Menyalakan dan mematikan sebuah container dapat dilakukan dengan command 'start' dan 'stop' melalui command line, demikian juga untuk melihat informasi container apa saja yang sedang berjalan dengan command 'docker ps'. 

Untuk memulai menggunakan Docker pun sesederhana melakukan download dan install docker, kemudian Docker dapat digunakan melalui command line. Serupa dengan virtualization yang membuat VM melalui image dari OS, containerization pada docker pun membutuhkan image untuk dapat menyalakan sebuah containers. Sebagai contoh, untuk dapat menjalankan 'docker start mysql' kita perlu memiliki image dari container tersebut terlebih dahulu, bisa melalui Docker Hub ataupun membuatnya sendiri dengan menggunakan Dockerfile. Setelah memiliki image terkait, kita bisa menjalankannya dengan menggunakan perintah 'docker run', dimana pada momen tersebut kita dapat melakukan berbagai konfigurasi seperti port forwarding, pemberian nama untuk container yang dibuat, bahkan melakukan pengaturan environment variable dari container tersebut.


Demikian hal-hal paling minimum yang perlu diketahui untuk memulai petualangan ke negeri Docker. Masih banyak command pada Docker yang dapat dieksplorasi, seperti 'docker save' dan 'docker load' yang sangat berguna dalam development. Fungsi dua command tersebut sangat sederhana, namun sangat membantu developer dalam satu tim untuk memiliki konfugurasi yang sama. Contoh sederhananya adalah ketika kita mengembangkan aplikasi, kita bisa menggunakan docker container untuk MySQL dan melakukan berbagai konfigurasi terkait database (mungkin mengatur user, privillege, dll). Karena kita menjalankan MySQL Containers, maka dengan menjalankan command 'docker save' kita bisa membagikan image tersebut pada rekan satu tim, sehingga mereka cukup menggunakan 'docker load' dan akan memiliki image dari MySQL containers yang telah dikonfigurasi, sehingga satu tim memiliki environment MySQL yang sama.

Sekian dulu untuk malam ini, semoga bermanfaat.
Selamat melakukan eksplorasi ke negeri Docker!

P.S.
Keuntungan lain dari penggunaan Docker adalah kita dapat menjalankan aplikasi yang mungkin tidak tersedia untuk OS tertentu, seperti tidak tersedianya Oracle Database untuk macOS. Berkat adanya images dari Oracle Database yang berjalan di atas Linux, maka pengguna macOS bisa tersenyum karena hal tersebut berarti macOS dapat menjalankan Oracle Database.






Referensi:
o https://jaxenter.com/containerization-vs-virtualization-docker-introduction-120562.html
o https://www.quora.com/What-is-the-difference-between-Docker-and-Vagrant-When-should-you-use-each-one
o http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-for-creating-an-isolated-environment
o http://www.zdnet.com/article/what-is-docker-and-why-is-it-so-darn-popular/
o https://docs.docker.com
o https://docs.docker.com/engine/reference/run/
o https://docs.docker.com/engine/reference/builder/
o https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/