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.

Membangun Docker Images

cd nodejs-aws-workshop/6\ -\ Kubernetes\ \(kops\)/code
tree
.
├── recipes
│   ├── characters.yml
│   ├── locations.yml
│   └── nginx.yml
└── services
    ├── characters
    │   ├── db.json
    │   ├── Dockerfile
    │   ├── package.json
    │   └── server.js
    ├── locations
    │   ├── db.json
    │   ├── Dockerfile
    │   ├── package.json
    │   └── server.js
    └── nginx
        ├── Dockerfile
        └── nginx.conf
5 directories, 13 files

docker build -t tuanpembual/characters services/characters/.
docker build -t tuanpembual/locations services/locations/.

Dua image diatas dibangun berdasarkan Dockerfile yang berada pada path masing-masing.

docker images
REPOSITORY                TAG                 IMAGE ID            CREATED              SIZE
tuanpembual/locations     latest              ef276a9ad40a        28 seconds ago       58.8 MB
tuanpembual/characters    latest              702e42d339d9        About a minute ago   58.8 MB

Mengunggah Image ke Docker Registry (Docker Hub)

docker login
docker push tuanpembual/characters
docker push tuanpembual/locations

Atur Deployment YML

Ubah file pada recipes/locations.yml dan recipes/characters.yml dibagian url docker images kira-kira seperti ini:

spec:
  containers:
  - name: locations
    image: tuanpembual/locations
    ports:
    - containerPort: 8081

Melakukan deployment ke K8s

Jalankan perintah berikut:

kubectl apply -f recipes/locations.yml
kubectl apply -f recipes/characters.yml

Lakukan verifikasi bahwa deployment telah dilakukan

kubectl get deployments

Hasilnya akan keluar kira-kira seperti ini:

NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
characters-deployment   2         2         2            0           7s
locations-deployment    2         2         2            2           7s

Pada file konfigurasi tadi, terdapat dua bagian, bagain deployment yang mengatur pods, dan bagian service yang mengatur bagaimana mapping service, proxy dan trafik dilakukan. Lakukan verifikasi service:

kubectl get services

Perintah diatas akan menghasilkan output kira-kira begini:

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
characters-service   ClusterIP   100.64.79.235   <none>        8081/TCP   41s
locations-service    ClusterIP   100.64.78.26    <none>        8081/TCP   41s
kubernetes           ClusterIP   100.64.0.1      <none>        443/TCP    3h

Memasang Load Balancer

Setelah pods jalan di cluster k8s, kita butuh sesuatu untuk menyalurkan request dari publik ke pods. Caranya dengan container nginx yang akan mengatur rute ke container aplikasi dan mengekpos nginx ke publik menggunakan load balancer (AWS ELB).

Catatan: Cara ini hanya untuk percobaan. Sedang untuk level produksi, kita akan menggunakan ingress-nginx versi aws yang akan saya tulis terpisah setelah ini.

Lakukan build image nginx dan push image ke docker registry (Docker Hub)

docker build -t tuanpembual/nginx-router services/nginx/.
docker push tuanpembual/nginx-router

Kemudian ubah file recipes/nginx.yml pada bagian url docker image.

spec:
  containers:
  - name: nginx-router
    image: tuanpembual/nginx-router
    ports:
    - containerPort: 80

Lakukan deployment.

kubectl apply -f recipes/nginx.yml

Kemudian cek detail dari load balancer:

kubectl describe service nginx-router

Kira-kira output yang dihasilkan adalah seperti ini:

$ kubectl describe service nginx-router
Name:                     nginx-router
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx-router","namespace":"default"},"spec":{"ports":[{"port":80,"targetPort":...
Selector:                 app=nginx-router
Type:                     LoadBalancer
IP:                       100.69.165.186
LoadBalancer Ingress:     aa788cc64fc9911e7b8820e801320750-1559002290.ap-southeast-1.elb.amazonaws.com
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31419/TCP
Endpoints:
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  1m    service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   1m    service-controller  Ensured load balancer

Perhatikan bagian LoadBalancer Ingress ini akan menjadi DNS Name aplikasi, tinggal dilanjutkan setup CNAME URL tadi ke domain yang diinginkan. Dalam kasus saya, konfigurasi ini saya lakukan di dashboard CloudFlare.

Ujicoba Aplikasi

Gunakan curl dengan mengarah ke url cname (ELB AWS) tadi.

curl http://aa788cc64fc9911e7b8820e801320750-1559002290.ap-southeast-1.elb.amazonaws.com/api/characters
curl http://aa788cc64fc9911e7b8820e801320750-1559002290.ap-southeast-1.elb.amazonaws.com/api/locations

Scaling Service

Ada tiga bagian yang bisa kita naikan sumber dayanya, yaitu:

  • NGINX router deployment
  • Characters deployment
  • Locations deployment

Caranya bisa dengan mengubah file yml deployment dibagian replicas dan ganti angka sesuai kebutuhan. Atau juga bisa menggunakan perintah berikut:

kubectl scale --replicas=3 deployments/characters-deployment

Kemudian verifikasi pods kembali, outputnya kira-kira seperti ini:

kubectl get pods

characters-deployment-6c6846f98-m54bn   1/1       Running   0          38m
characters-deployment-6c6846f98-p4r6x   1/1       Running   0          38m
characters-deployment-6c6846f98-xcmld   1/1       Running   0          39s
locations-deployment-76c6657869-9slws   1/1       Running   0          40m
locations-deployment-76c6657869-zbkzz   1/1       Running   0          40m
nginx-router-d4dd9c94c-jxtfw            1/1       Running   0          15m
nginx-router-d4dd9c94c-wt7b5            1/1       Running   0          15m

Demikian, semoga tidak tambah pusing dan tidak error.

Estu~

 

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google+

You are commenting using your Google+ account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.