Deploy Aplikasi NodeJS di Kubernetes KOPS AWS (Bagian 5)

Sudah install-install, dilanjut mendeploy aplikasi sederhana di K8s. Panduan ini saya sadur dari tautan github ini. Pilih bagian 6 Kops. Pada bagian ini saya berasumsi docker, kubectl, kops sudah terpasang. Cluster k8s sudah dibuat. Dashboard k8s sudah bisa diakses.

image from https://github.com/nathanpeck/nodejs-aws-workshop/tree/master/6%20-%20Kubernetes%20(kops)

Step Ujicoba

Clone Repo

git clone https://github.com/nathanpeck/nodejs-aws-workshop.git

Konsep

Konsepnya adalah ada dua aplikasi nodejs (locations dan characters) yang jalan di port 8081. Kemudian akan dimapping oleh nginx sebagai load balancer. Konfigurasi minimalnya akan seperti ini:

location /api/locations {
  proxy_pass http://locations-service:8081;
}
location /api/characters {
  proxy_pass http://characters-service:8081;
}

Selanjutnya kita akan membangun image dari 2 service tadi (location dan characters) plus nginx. Kemudian image yang sudah dibangun akan kita unggah ke docker registry (Docker Hub). Selanjutnya kita akan memasang dua aplikasi itu ke cluster k8s. Dilanjutkan dengan mengekpos dua aplikasi itu sehingga bisa diakses publik. Lanjutkan membaca “Deploy Aplikasi NodeJS di Kubernetes KOPS AWS (Bagian 5)”

Iklan

Memasang Kops dan Membuat Kubernetes Cluster (Bagian 4)

Sudah sampe bagian 4 aja ini. Silahkan membaca bagian satu, dua, tiga dulu.

Di bagian ini saya akan menuliskan urutan pemasangan tools, pembuatan cluster k8s, dan pemasangan dashboard k8s. Di bagian ini belum akan membahas bagaimana menjalankan aplikasi di Kubernetes.

Tahap-tahap instalasi dibawah ini saya ambil dari dokumentasi kops di github:

0. https://github.com/kubernetes/kops/blob/master/docs/aws.md

Pengaturan Environment

Domain=kube.example.com
bucket_name=kube-state-store
KOPS_CLUSTER_NAME=kube.example.com
KOPS_STATE_STORE=s3://${bucket_name}

Menyiapkan Lingkungan Kerja

Perintah dibawah ini dilakukan di lapto/PC yang digunakan untuk memanajemen cluster k8s. Dalam kasus saya adalah Thinkpad x230 dengan OS openSUSE Leap 15.1.

  1. Lakukan installasi AWS CLI. Bisa mengambil dari dokumentasi aws dan lakukan konfigurasi dasar.
  2. Buat IAM khusus kops, bisa mengacu ke panduan diatas
  3. Install kops dan kubectl
    curl -LO https://github.com/kubernetes/kops/releases/download/1.10.0/kops-linux-amd64
    chmod +x kops-linux-amd64
    sudo mv kops-linux-amd64 /usr/local/bin/kops
    
    wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/v1.11.3/bin/linux/amd64/kubectl
    chmod +x ./kubectl
    sudo mv ./kubectl /usr/local/bin/kubectl
    
  4. Atur router 53.
    ID=$(uuidgen) && aws route53 create-hosted-zone --name kube.example.com --caller-reference $ID | jq .DelegationSet.NameServers
    
  5. Lakukan update dns ke CloudFlare dari hasil output sebelumnya (dalam kasus saya).
  6. Atur env
    export bucket_name=kube-state-store
    export KOPS_CLUSTER_NAME=kube.example.com
    export KOPS_STATE_STORE=s3://${bucket_name}
    
  7. Silahkan buat bucket di s3 dengan nama kube-state-store, gunakan webconsole AWS saja.

Lanjutkan membaca “Memasang Kops dan Membuat Kubernetes Cluster (Bagian 4)”

Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 3)

Setelah bagian 1 dan bagian 2. Mari mbahas ke yang lebih serius.

Kubernetes

Kubernetes (selanjutnya ditulis k8s) adalah salah satu orchestration untuk docker. Sebelum ke k8s saya sempat menyicip docker swarm dengan dua mesin. Namun proses ini menurut saya kurang pas untuk implementasi di Binar Academy. Kubernetes merupakan tool bersumber terbuka yang awalnya didesain oleh Google dan kemudian dipelihara oleh Cloud Native Computing Foundation.

Saya pertama belajar menggunakan minikube dengan 2 mesin di Digital Ocean. Tantangan pertama saya gagal paham menggunakan k8s dashboard. Kalo ingat masa itu adalah lucu sekali. Dan masih bingung dengan istilah: pods, deployment. Kemudian juga gagal dalam konfigurasi network menggunakan cinder. Padahal runut mengikuti panduan resmi. Entahlah, mungkin ada langkah yang luput dan sebagainya.

K8s Cluster

Ilustrasi dari https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/

Minikube

Silahkan install minikube dan ikuti panduan hello-minikube.

Tautan berikut juga layak untuk dibaca:

Setelah membaca tautan diatas diharapkan sedikit paham apa itu k8s, bagaimana cara bekerjanya. Lanjutkan membaca “Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 3)”

Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 2)

Melanjutkan bagian dua. Sillahkan membaca bagian 1 disini. Ini sepertinya jadi tulisan yang makin ngelantur.

Docker Compose

Docker Compose adalah tool yang akan membaca sekumpulan konfigurasi untuk dapat menjalankan satu atau lebih container dengan lebih mudah. Dalam konfigurasinya juga meliputi proses docker build dan docker run. Pada opsi build, compose akan menjalankan build dengan memanggil file Dockefile yang tersedia. Untuk opsi alamat image, compose akan mengunduh docker images sesuai alamat yang disediakan. Bisa dari docker hub atau juga dari private registry yang membutuhkan krendensial.

Install compose:

Docker compose membutuhkan beberapa pustaka python untuk menjalankannya. Untuk memasang di openSUSE Leap 15.1 cukup menjalankan ini di konsole

sudo zypper in docker-compose

Untuk menjalankan docker-compose, dibuatlah sebuah file dengan format yml standar dengan nama file docker-compose.yml. Didalamnya berisi konfigurasi manual.

Contoh konfigurasi bisa melihat contoh berikut

tree
.
├── docker-compose.yml
├── Dockerfile
└── index.html
0 directories, 3 files

Isi docker-compose adalah sebagai berikut:

version: '3'
services:
## Using image from docker hub
  hello:
    image: tuanpembual/hello
    hostname: hello
    container_name: hello
    ports:
      - "80:8080"
## Using image from local
  hellov2:
    build: .
    hostname: hellov2
    container_name: hellov2
    ports:
      - "80:8081"

Menjalankan Compose

docker-compose up

Perintah diatas dapat dijalankan jika file konfigurasi menggunakan nama standar semisal docker-compose.yml. Namun jika nama file berbeda, butuh mengatur path file seperti berikut:

docker-compose -f p-website-docker-compose.yml

Opsi docker-compose

docker-compose start
docker-compose up
docker-compose ps -a
docker-compose stop
docker-compose down

Ada banyak model penggunaan docker-compose. Model yang saya tulis adalah perintah yg saya gunakan sehar-hari.

Docker Swarm

Swarm adalah tool yang dapat membantu manajemen docker pada multiple host. Bahasa lainnya adalah orkestrasi (orchestration). Swarm sendiri merupakan tools native dari Docker. Tentang swarm sendiri dapat ditemukan di wiki docker dan swarm.

Saya sempat beberapa minggu ngulik swarm, mencoba membuat cluster sederhana. Mencoba untuk mengimplementasikan di AWS, namun setelah mencoba beberapa kali, solusi ini belum mampu menjawab kebutuhan tim di Binar Academy.

Bahan riset selanjutnya adalah bagian tiga, mencoba kubernetes atau k8s.
Estu~

Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 1)

Awal Cerita

Kali ini saya akan cerita (iya cerita, bukan tutorial). Bagaimana saya kenalan dengan docker, apa saja yg saya lakukan, dan bagaimana saya meracuni lingkungan pengembangan melalui docker. Saya sendiri masih merasa kesulitan untuk mengajarkan docker kepada orang lain. Bingung harus memulai dari mana.

Proses belajar docker ini menghantarkan saya dalam proses yang cukup lama. Saya kembali lagi mendalami docker Maret 2018. Dalam kurun waktu 6 bulan terakhir ini merupakan proses yang cukup intens. Peluh dan spaneng yang dikeluarkan menjadi catatan berarti buat saya. Mulai dari membeli buku (beberapa judul yang akhirnya selesai saya baca), course online yang belum jadi saya mulai, membaca dokumentasi satu ke dokumentasi lainnya. Hingga menjadi bunga tidur dalam minggu-minggu penuh tekanan. Namun proses tidak pernah mengkhianati hasil.

Daftar Buku

Saya kebetulan melihat share facebook dari pak Utian Ayuba, promo beli 15 buku 25USD Mei 2018 silam. Humble Book Bundle Dev Ops by Packt. Ya sudah saya beli. Kata kunci yang saya cari adalah: docker, swarm, kubernetes. Berikut daftar buku ditulis berdasarkan saran urutan membaca:

  • Docker Cookbook By Neependra Khare, June 2015
  • Mastering Docker By Scott Gallagher, December 2015
  • Continuous Delivery with Docker and Jenkins By Rafał Leszko August 2017
  • Deployment with Docker By Srdjan Grubor, November 2017
  • Kubernetes Cookbook By Hideto Saito, Hui-Chuan Chloe Lee, Ke-Jou Carol Hsu, June 2016
  • Mastering Kubernetes By Gigi Sayfan, May 2017
  • Getting Started with Kubernetes – Second Edition By Jonathan Baier, May 2017
  • DevOps with Kubernetes By Hideto Saito, Hui-Chuan Chloe Lee, Cheng-Yang Wu, October 2017

Kemudian satu buku tambahan atas rekomendasi mas Agung Setiyawan

  • Docker for Rails Developers by Rob Isenberg, September 2018

Dan buku terakhir yang belum selesai saya baca,

  • Kubernetes on AWS by Ed Robinson, November 2018

Lanjutkan membaca “Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 1)”

Binar dalam Metabase

Metabase is the easy, open source way for everyone in your company to ask questions and learn from data.

Di Binar Academy, kami menggunakan metabase sebagai mesin untuk mengolah data dari hasil Academy. Metabase dapat dipasang dalam berbagai cara. Namun ketika saya diminta untuk memasang Metabase di lingkungan produksi, baru sadar bahwa stack yang dibutuhkan adalah java. Dan ini membutuhkan resource mesin yang lumayan. Untuk lingkungan development, sebelumnya kita menggunakan Heroku. Dipilihlah untuk menggunakan teknologi container.

Dari halaman dokumentasi, Metabase mampu dipasang pada layanan ElasticBeanstalk. Mari kita coba. Ya Binar Academy menggunakan layanan AWS untuk semua platform infrastruktur. Untuk pemasangan Metabase di ElasticBeanstalk(selanjutnya disingkat EB) saya mencoba menggunakan EB CLI, namun sepertinya terlalu overkill. Saya kembali menggunakan konfigurasi dari dashboard web.

Beberapa langkah yang saya lakukan dalam konfigurasi Metabase:

Memasang metabase di ElasticBeanStalk.

Saya menggunakan panduan dari sini. Beberapa catatan dalam pemasangan:

  • EC2 yang digunakan EB: t2.micro
  • RDS Postgres: t2.micro

Setelah Metabase selesai dipasang, kita akan mendapatkan publik url berupa domain, sebagai contoh: prod-metabase.xxxxxx.ap-southeast-1.elasticbeanstalk.com.

Setting Up Metabase

Silahkan akses domain yang didapat. Saya merujuk dokumentasi resmi untuk melakukan konfigurasi.

  • Setup Admin Account, beserta credential
  • Setup Email untuk notifikasi, saya menggunakan Google Apps, konfigurasinya hampir sama ketika konfigurasi email Mattermost.
  • Setup database internal Metabase (RDS) dan Database Raw Data, (DB Aplikasi, Google Analytic)
  • Invite Team, dengan memasukkan email team.

Setting Domain dan HTTPS

Domain yang didapat merupakan domain costum dari ElasticBeanstalk. Ingin diarahkan ke metabase.domain.id. Caranya:

  • Login ke Domain Management, pilih DNS
  • Buat sebuah CNAME baru dengan isian
    name: metabase
    value: {{enter-your-subdomain}}.elasticbeanstalk.com.
  • Simpan dan tunggu propagasi domain berjalan

Untuk HTTPS, saya menggunakan SSL dari LetsEncrypt. Untuk pembuatannya, saya generate dari mesin lain yang sudah ada certbotnya.

$ sudo service nginx stop
$ sudo certbot certonly --standalone -d metabase.domain.id
$ sudo service nginx start

Kemudian downlaod dua file ini dari sertifikat ke laptop lokal.

  • fullchain.pem
  • privkey.pem

Unggah dua file tadi ke IAM mengunakan AWS CLI dalam format berikut:
aws iam upload-server-certificate –server-certificate-name [berikan nama ssl ke iam] –certificate-body file://[path to fullchain.pem] –private-key file://[path to privkey.pem]

$ aws iam upload-server-certificate --server-certificate-name [berikan nama ssl ke iam] --certificate-body file://[path to fullchain.pem] --private-key file://[path to privkey.pem]
$ cd /path/to/ssl
$ aws iam upload-server-certificate --server-certificate-name metabase.domain.id --certificate-body file://fullchain.pem --private-key file://privkey.pem

Load ssl ke metabase:

  • Buka Elastic Beanstalk dan pilih aplikasi Metabase.
  • Pilih Enviroment metabase
  • Kemudian pilih bagian Load Balancing. Pilih Add Listener. Kemudian isi jendela pop up seperti berikut:
    Listener Port: 443
    Listener Protocol: HTTPS
    Instance Port: 80
    Instance Protocol: HTTP
    SSL Sertificate: metabase.domain.id (sesuai dengan nama yang ditulis ketika Unggah SSL)
  • Simpan.

Silahkan uji akses costum domain dengan HTTPS. Semoga sukses 😀

Dah itu aja.

Estu~

 

Memasang Mattermost di AWS

Rencana Desain

Bagi yang belum mengenal mattermost, bisa membaca postingan saya sebelumnya.

1 Mesin EC2 free tier (1Core1GB) AWS
OS Ubuntu 16.04
IP Publik Static (Elastic IP)

Stack:

  • Nginx (as proxy)
  • Mattermost-server
  • Postgresql
  • SSL letsencrypt

Security Group outbond:

  • 443, 80 (open)
  • Ping (open)
  • 8065 (port mattermost sementara)

Instalasi saya pecah menjadi beberapa bagian

Persiapan Mesin

  1. Buat mesin, sesuai spesifikasi diatas
  2. Login ssh dan mulai masang-masang

Lanjutkan membaca “Memasang Mattermost di AWS”