Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
Kubernetes

Implementasi Microservices Architecture menggunakan Kubernetes

· 7 mnt baca ·Ihsan Arif

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.

voting microservice architecture

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:

  1. Voting-App: website yang digunakan untuk melakukan voting berbasis web
  2. Result-App: website yang menampilkan hasil voting secara realtime.
  3. Worker: aplikasi background proses yang melakukan sinkronisasi dari voting dengan hasil voting secara langsung.
  4. Redis: mekanisme penyimpanan sementara yang digunakan untuk mendukung voting-app.
  5. 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:

  1. 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.
  2. 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
  3. 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.

yml
 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: 80

Pada 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

bash
1➜ kubectl create -f code/demo/voting-app/voting-app-deployment.yaml 
2pod/voting-app-deployment created

Membuat result-app Deployments

Kita lanjut dengan membuat file dengan nama result-app-deployment.yaml dan isi file tersebut dengan kode dibawah ini.

yml
 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: 80

Untuk service result-app kita buat replikasinya 1 saja karena tidak perlu memiliki kebutuhan yang banyak.

lalu dilanjutkan create dengan perintah ini

bash
1➜ kubectl create -f code/demo/result-app/result-app-deployment.yaml 
2pod/result-app-deployment created

Membuat worker-app Deployment

Kita lanjut dengan membuat file dengan nama worker-app-deployment.yaml dan isi file tersebut dengan kode dibawah ini.

yml
 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_worker

Kita buat replikasinya sebesar 3 jika dilihat dari file YAML tersebut. Lalu dilanjutkan create dengan perintah ini

bash
1➜ kubectl create -f code/demo/worker-app/worker-app-deployment.yaml 
2pod/worker-app-deployment created

Membuat Redis Deployment

Redis deployment ini digunakan untuk penyimpanan sementara dengan membuat file dibawah ini

yml
 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: 6379

Redis 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

bash
1➜ kubectl create -f code/demo/redis/redis-deployment.yaml 
2pod/redis-deployment created

Membuat Postgres Deployment

Postgres Pods ini digunakan untuk penyimpanan permanen untuk hasil akhir dari voting app tersebut dengan membuat file dibawah ini

yml
 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: trust

Postgres 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

bash
1➜ kubectl create -f code/demo/postgres/postgres-deployment.yaml 
2pod/postgres-deployment created

Membuat 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.

yml
 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-app

ClusterIP untuk Postgres

Membuat ClusterIP untuk Postgres agar service kita bisa berkomunikasi dengan database. Berikut ini kode YAML service yang perlu kita buat.

yml
 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-app

LoadBalancer 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.

yml
 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-app

LoadBalancer 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.

yml
 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-app

Buat semua service tersebut dengan perintah dibawah ini.

bash
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 created

Jika ingin melihat semuanya bisa kita gunakan terminal dengan perintah dibawah ini.

bash
 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       16s

Terlihat 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.

bash
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="redi

Jika kita akses menggunakan browser akan terlihat seperti gambar dibawah ini.

voting-app browser

Dan untuk service result-app, kita juga perlu lihat dengan perintah dibawah ini.

bash
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.

result-app browser

IH
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.
Follow

💬 Komentar