Pada kesempatan ini kita akan mencoba membuat aplikasi yang sudah mengimplementasikan Microservice Architecture dengan menggunakan Kubernetes. Agar lebih tergambar bagaimana kita akan mencoba membuatnya yaitu kita bisa melihat gambar dibawah ini.

Pada gambar terlihat kita memiliki Aplikasi voting-app, result-app dan worker dimana pendukung dari semua aplikasi tersebut yaitu membutuhkan Redis sebagai cache dan Postgre sebagai data penyimpanan dari setiap voting yang akan dilakukan oleh aplikasi.
Berikut ini penjelasan lebih lengkapnya:
- Voting-App: website yang digunakan untuk melakukan voting berbasis web
- Result-App: website yang menampilkan hasil voting secara realtime.
- Worker: aplikasi background proses yang melakukan sinkronisasi dari voting dengan hasil voting secara langsung.
- Redis: mekanisme penyimpanan sementara yang digunakan untuk mendukung voting-app.
- Postgre: sebagai data simpan permanent yang nantinya digunakan untuk menampilkan hasil dari semua voting yang sedang berjalan.
Setelah kita tahu semua fungsi dari tiap Pods maka kita perlu menganalisis apa saja yang harus dibuat jika arsitektur aplikasinya seperti ini.
Tahapan microservice ini bisa di deploy ke dalam kubernetes maka perlu analisis sehingga menghasilkan seperti ini:
- Deploy PODs: kita analisis setiap service atau aplikasi menjadi masing-masing Pods yaitu: a. voting-app b. result-app c. worker d. Redis e. Postgres Tahapan ini berarti nantinya kita akan membuat Pods dengan masing-masing kebutuhannya.
- Membuat Services (ClusterIP) kita buat agar setiap service bisa berkomunikasi ke dalam Redis dan Postgres. Kenapa kita menggunakan ClusterIP? karena kebutuhan Redis dan Postgres itu kita akses dari aplikasi hanya menggunakan clusternya saja tidak langsung ke Node tertentu. a. Redis b. Postgres
- Membuat services (NodePort) digunakan untuk komunikasi dari aplikasi terhadap User sehiigga nantinya setiap website bisa diakses oleh pengguna. a. voitng-app b. result-app
Tahapannya sudah terbayang maka kita akan coba mengimplementasikannya dalam bentuk file YAML sehingga kita bisa lebih paham.
Membuat Deployment
Seperti yang sudah dijelaskan diatas tahapan pertama yang perlu kita lakukan yaitu membuat masing-masing PODs menjadi file YAML deployment.
Membuat voting-app Deployments
Kita coba buat file dengan nama voting-app-deployment.yaml dan isi file tersebut seperti dibawah ini.
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: voting-app-deployment
5 labels:
6 app: demo-voting-app
7spec:
8 replicas: 3
9 selector:
10 matchLabels:
11 name: voting-app-pod
12 app: demo-voting-app
13 template:
14 metadata:
15 name: voting-app-pod
16 labels:
17 name: voting-app-pod
18 app: demo-voting-app
19
20 spec:
21 containers:
22 - name: voting-app
23 image: dockersamples/examplevotingapp_vote
24 ports:
25 - containerPort: 80Pada file tersebut kita akan mereplikasi service kita menjadi 3 sehingga nanti akan terlihat service voting-app 3 Pods.
lalu selanjutnya kita create dengan perintah dibawah ini
1➜ kubectl create -f code/demo/voting-app/voting-app-deployment.yaml
2pod/voting-app-deployment createdMembuat result-app Deployments
Kita lanjut dengan membuat file dengan nama result-app-deployment.yaml dan isi file tersebut dengan kode dibawah ini.
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: result-app-deployment
5 labels:
6 app: demo-voting-app
7spec:
8 replicas: 1
9 selector:
10 matchLabels:
11 name: result-app-pod
12 app: demo-voting-app
13 template:
14 metadata:
15 name: result-app-pod
16 labels:
17 name: result-app-pod
18 app: demo-voting-app
19
20 spec:
21 containers:
22 - name: result-app
23 image: dockersamples/examplevotingapp_result
24 ports:
25 - containerPort: 80Untuk service result-app kita buat replikasinya 1 saja karena tidak perlu memiliki kebutuhan yang banyak.
lalu dilanjutkan create dengan perintah ini
1➜ kubectl create -f code/demo/result-app/result-app-deployment.yaml
2pod/result-app-deployment createdMembuat worker-app Deployment
Kita lanjut dengan membuat file dengan nama worker-app-deployment.yaml dan isi file tersebut dengan kode dibawah ini.
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: worker-app-deployment
5 labels:
6 app: demo-voting-app
7spec:
8 replicas: 3
9 selector:
10 matchLabels:
11 name: worker-app-pod
12 app: demo-voting-app
13 template:
14 metadata:
15 name: worker-app-pod
16 labels:
17 name: worker-app-pod
18 app: demo-voting-app
19
20 spec:
21 containers:
22 - name: worker-app
23 image: dockersamples/examplevotingapp_workerKita buat replikasinya sebesar 3 jika dilihat dari file YAML tersebut. Lalu dilanjutkan create dengan perintah ini
1➜ kubectl create -f code/demo/worker-app/worker-app-deployment.yaml
2pod/worker-app-deployment createdMembuat Redis Deployment
Redis deployment ini digunakan untuk penyimpanan sementara dengan membuat file dibawah ini
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: redis-deployment
5 labels:
6 app: demo-voting-app
7spec:
8 replicas: 1
9 selector:
10 matchLabels:
11 name: redis-pod
12 app: demo-voting-app
13 template:
14 metadata:
15 name: redis-pod
16 labels:
17 name: redis-pod
18 app: demo-voting-app
19
20 spec:
21 containers:
22 - name: redis
23 image: redis
24 ports:
25 - containerPort: 6379Redis biasanya memiliki standar Port yaitu 6379 walaupun sebenarnya bisa berapapun tetapi agar sesuai dengan standar aplikasi maka kita set sesuai kebutuhannya.
lalu dilanjutkan create dengan perintah ini
1➜ kubectl create -f code/demo/redis/redis-deployment.yaml
2pod/redis-deployment createdMembuat Postgres Deployment
Postgres Pods ini digunakan untuk penyimpanan permanen untuk hasil akhir dari voting app tersebut dengan membuat file dibawah ini
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: postgres-deployment
5 labels:
6 app: demo-voting-app
7spec:
8 replicas: 1
9 selector:
10 matchLabels:
11 name: postgres-pod
12 app: demo-voting-app
13 template:
14 metadata:
15 name: postgres-pod
16 labels:
17 name: postgres-pod
18 app: demo-voting-app
19
20 spec:
21 containers:
22 - name: postgres
23 image: postgres:9.4
24 ports:
25 - containerPort: 5432
26 env:
27 - name: POSTGRES_HOST_AUTH_METHOD
28 value: trustPostgres sebagai database pun kita set Port 5432 karena standar dari postgres menggunakan port tersebut.
Dan kita juga menambahkan environment seperti user dan password yang digunakan untuk koneksi ke dalam database postgres.
- POSTGRES_HOST_AUTH_METHOD = trust
lalu dilanjutkan create dengan perintah ini
1➜ kubectl create -f code/demo/postgres/postgres-deployment.yaml
2pod/postgres-deployment createdMembuat Services
Ada dua tipe services yang akan kita pakai pada aplikasi ini dengan yaitu ClusterIP dan NodePort.
Cluster IP untuk Redis
Kita akan membuat service ClusterIP untuk Redis agar bisa berkomunikasi dengan aplikasi voting kita yaitu dengan kode dibawah ini.
1apiVersion: v1
2kind: Service
3metadata:
4 name: redis
5 labels:
6 name: redis-service
7 app: demo-voting-app
8spec:
9 ports:
10 - port: 6379
11 targetPort: 6379
12 selector:
13 name: redis-pod
14 app: demo-voting-appClusterIP untuk Postgres
Membuat ClusterIP untuk Postgres agar service kita bisa berkomunikasi dengan database. Berikut ini kode YAML service yang perlu kita buat.
1apiVersion: v1
2kind: Service
3metadata:
4 name: db
5 labels:
6 name: db-service
7 app: demo-voting-app
8spec:
9 ports:
10 - port: 5432
11 targetPort: 5432
12 selector:
13 name: postgres-pod
14 app: demo-voting-appLoadBalancer untuk voting-app
Tipe pada voting-app adalah NodePort karena kita akan meng-establish port ke pengguna sehingga menggunakan NodePort. Berikut file YAML yang harus kita buat.
1apiVersion: v1
2kind: Service
3metadata:
4 name: voting-service
5 labels:
6 name: voting-service
7 app: demo-voting-app
8spec:
9 type: LoadBalancer
10 ports:
11 - port: 80
12 targetPort: 80
13 selector:
14 name: voting-app-pod
15 app: demo-voting-appLoadBalancer untuk result-app
Tipe pada result-app adalah NodePort juga karena kita akan meng-establish port ke pengguna sehingga menggunakan NodePort. Berikut file YAML yang harus kita buat.
1apiVersion: v1
2kind: Service
3metadata:
4 name: result-service
5 labels:
6 name: result-service
7 app: demo-voting-app
8spec:
9 type: LoadBalancer
10 ports:
11 - port: 80
12 targetPort: 80
13 selector:
14 name: result-app-pod
15 app: demo-voting-appBuat semua service tersebut dengan perintah dibawah ini.
1➜ kubectl create -f code/demo/postgres/postgres-service.yaml
2service/db created
3➜ kubectl create -f code/demo/redis/redis-service.yaml
4service/redis created
5➜ kubectl create -f code/demo/voting-app/voting-app-service.yaml
6service/voting-service created
7➜ kubectl create -f code/demo/result-app/result-app-service.yaml
8service/result-service createdJika ingin melihat semuanya bisa kita gunakan terminal dengan perintah dibawah ini.
1➜ kubectl get all
2NAME READY STATUS RESTARTS AGE
3pod/postgres-deployment-7d47dd5bd8-hrsgq 1/1 Running 0 54s
4pod/redis-deployment-58bdbddb55-6x4nk 1/1 Running 0 46s
5pod/result-app-deployment-6ff54bbb5-9gz7q 1/1 Running 0 37s
6pod/voting-app-deployment-5bd496ccd8-cmb5x 1/1 Running 0 28s
7pod/voting-app-deployment-5bd496ccd8-nq4zl 1/1 Running 0 28s
8pod/voting-app-deployment-5bd496ccd8-tqhwt 1/1 Running 0 28s
9pod/worker-app-deployment-785b6c695d-28np4 1/1 Running 0 16s
10pod/worker-app-deployment-785b6c695d-2gfnz 1/1 Running 0 16s
11pod/worker-app-deployment-785b6c695d-gz7jx 1/1 Running 0 16s
12
13NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
14service/db ClusterIP 10.97.181.193 <none> 5432/TCP 51s
15service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25d
16service/redis ClusterIP 10.109.77.202 <none> 6379/TCP 44s
17service/result-service LoadBalancer 10.100.125.49 <pending> 80:31289/TCP 34s
18service/voting-service LoadBalancer 10.97.64.194 <pending> 80:31266/TCP 23s
19
20NAME READY UP-TO-DATE AVAILABLE AGE
21deployment.apps/postgres-deployment 1/1 1 1 54s
22deployment.apps/redis-deployment 1/1 1 1 46s
23deployment.apps/result-app-deployment 1/1 1 1 37s
24deployment.apps/voting-app-deployment 3/3 3 3 28s
25deployment.apps/worker-app-deployment 3/3 3 3 16s
26
27NAME DESIRED CURRENT READY AGE
28replicaset.apps/postgres-deployment-7d47dd5bd8 1 1 1 54s
29replicaset.apps/redis-deployment-58bdbddb55 1 1 1 46s
30replicaset.apps/result-app-deployment-6ff54bbb5 1 1 1 37s
31replicaset.apps/voting-app-deployment-5bd496ccd8 3 3 3 28s
32replicaset.apps/worker-app-deployment-785b6c695d 3 3 3 16sTerlihat semua services sudah berjalan dengan melihat status Running dan agar kita bisa mencobanya pada browser kita bisa gunakan perintah dibawah ini untuk service voting-app.
1➜ minikube service voting-service --url
2http://127.0.0.1:58820
3❗ Because you are using a Docker driver on darmoveStaleState removing state" podUID="b50bbc4f-004b-4d1f-86cf-db77a85b0f7d" containerName="rediJika kita akses menggunakan browser akan terlihat seperti gambar dibawah ini.

Dan untuk service result-app, kita juga perlu lihat dengan perintah dibawah ini.
1➜ minikube service result-service --url
2http://127.0.0.1:58860
3❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it.Jika kita lihat dan akses menggunakan browser untuk service result-app akan terlihat seperti gambar dibawah ini.
