Memigrasikan Situs Monolitik ke Microservice di Google Kubernetes Engine

1. Pengantar

Mengapa bermigrasi dari aplikasi monolitik ke arsitektur microservice? Memecah aplikasi menjadi beberapa microservice memiliki keuntungan berikut; sebagian besar berasal dari fakta bahwa microservice dikaitkan secara longgar.

  • Microservice dapat diuji dan di-deploy secara mandiri. Makin kecil unit deployment, makin mudah deployment.
  • Microservice dapat diterapkan dalam berbagai bahasa dan framework. Untuk setiap microservice, Anda bebas memilih teknologi terbaik untuk kasus penggunaan tertentu.
  • Microservice dapat dikelola oleh tim yang berbeda. Batas antar-microservice memudahkan dalam mendedikasikan tim untuk satu atau beberapa microservice.
  • Dengan beralih ke microservice, Anda melonggarkan dependensi antartim. Setiap tim hanya perlu memperhatikan API microservice yang diandalkan. Tim tidak perlu memikirkan cara implementasi microservice tersebut, siklus rilisnya, dan sebagainya.
  • Anda dapat lebih mudah mendesain untuk kegagalan. Dengan memiliki batasan yang jelas antarlayanan, akan lebih mudah untuk menentukan tindakan yang harus dilakukan jika layanan sedang tidak aktif.

Beberapa kelemahan jika dibandingkan dengan monolit adalah:

  • Karena aplikasi berbasis microservice adalah jaringan dari berbagai layanan yang sering berinteraksi dengan cara yang tidak jelas, kompleksitas keseluruhan sistem cenderung meningkat.
  • Tidak seperti internal monolit, microservice berkomunikasi melalui jaringan. Dalam situasi tertentu, hal ini dapat dianggap sebagai masalah keamanan. Istio mengatasi masalah ini dengan mengenkripsi traffic antar-microservice secara otomatis.
  • Mungkin sulit untuk mencapai tingkat performa yang sama dengan pendekatan monolitik karena latensi antarlayanan.
  • Perilaku sistem Anda tidak disebabkan oleh satu layanan, tetapi oleh banyak layanan dan interaksinya. Oleh karena itu, lebih sulit untuk memahami perilaku sistem Anda dalam produksi (kemampuan observasinya). Istio adalah solusi untuk masalah ini juga.

Di lab ini, kita akan menjalankan microservice di Google Kubernetes Engine (GKE). Kubernetes adalah platform untuk mengelola, menghosting, menskalakan, dan men-deploy container. Container merupakan cara portabel untuk mengemas dan menjalankan kode. Pola ini sangat cocok dengan pola microservice, di mana setiap microservice dapat berjalan di container-nya sendiri.

Untuk lab ini, kita akan men-deploy aplikasi monolitik yang sudah ada ke cluster Google Kubernetes Engine, lalu menguraikannya menjadi beberapa microservice.

Diagram Arsitektur Microservice Kami

Kita akan mulai dengan memecah monolit menjadi tiga microservice, satu per satu. Microservice mencakup Pesanan, Produk, dan Frontend. Kami membangun image Docker untuk setiap microservice menggunakan Cloud Build, yang kami picu dari dalam Cloud Shell. Kemudian, kita akan men-deploy dan mengekspos microservice di Google Kubernetes Engine (GKE) dengan LoadBalancer jenis layanan Kubernetes. Kita akan melakukan ini untuk setiap layanan sambil memfaktorkan ulang layanan dari monolit secara bersamaan. Selama proses ini, kami akan menjalankan monolit dan microservice hingga akhir, ketika kami dapat menghapus monolit.

636a2d58588b2b87.pngS

Yang akan Anda pelajari

  • Cara menguraikan Monolit menjadi Microservice
  • Cara membuat cluster Google Kubernetes Engine
  • Cara membuat image Docker
  • Cara men-deploy image Docker ke Kubernetes

Prasyarat

  • Akun Google Cloud Platform dengan akses administratif untuk membuat project atau project dengan peran Project Owner
  • Pemahaman dasar tentang Docker dan Kubernetes

2. Penyiapan Lingkungan

Penyiapan lingkungan mandiri

Jika belum memiliki Akun Google (Gmail atau Google Apps), Anda harus membuatnya. Login ke konsol Google Cloud Platform ( console.cloud.google.com) dan buat project baru:

53dad2cefdae71da.pngS

Screenshot dari 2016-02-10 12:45:26.png

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

Selanjutnya, Anda harus mengaktifkan penagihan di Developers Console untuk menggunakan resource Google Cloud dan mengaktifkan Container Engine API.

Menjalankan melalui codelab ini tidak akan menghabiskan biaya lebih dari beberapa dolar, tetapi bisa lebih jika Anda memutuskan untuk menggunakan lebih banyak resource atau jika Anda membiarkannya berjalan (lihat bagian "pembersihan" di akhir dokumen ini). Harga Google Kubernetes Engine didokumentasikan di sini.

Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai$300.

Google Cloud Shell

Meskipun Google Cloud dan Kubernetes dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.

Mesin virtual berbasis Debian ini memuat semua alat pengembangan yang akan Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Ini berarti bahwa semua yang Anda perlukan untuk codelab ini adalah browser (ya, ini berfungsi di Chromebook).

  1. Untuk mengaktifkan Cloud Shell dari Cloud Console, cukup klik Aktifkan Cloud ShellfEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (hanya perlu beberapa saat untuk melakukan penyediaan dan terhubung ke lingkungan).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke PROJECT_ID.

gcloud auth list

Output perintah

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika, untuk beberapa alasan, project belum disetel, cukup jalankan perintah berikut:

gcloud config set project <PROJECT_ID>

Mencari PROJECT_ID Anda? Periksa ID yang Anda gunakan di langkah-langkah penyiapan atau cari di dasbor Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell juga menetapkan beberapa variabel lingkungan secara default, yang mungkin berguna saat Anda menjalankan perintah di masa mendatang.

echo $GOOGLE_CLOUD_PROJECT

Output perintah

<PROJECT_ID>
  1. Terakhir, tetapkan zona dan konfigurasi project default.
gcloud config set compute/zone us-central1-f

Anda dapat memilih berbagai zona yang berbeda. Untuk informasi selengkapnya, lihat Region & Zona.

3. Meng-clone Repositori Sumber

Kami menggunakan aplikasi monolitik yang sudah ada untuk situs e-commerce fiktif, dengan halaman sambutan sederhana, halaman produk, dan halaman histori pesanan. Kita hanya perlu meng-clone sumber dari repo git, agar dapat berfokus untuk memecahnya menjadi microservice dan men-deploy ke Google Kubernetes Engine (GKE).

Jalankan perintah berikut untuk meng-clone repo git ke instance Cloud Shell Anda dan beralih ke direktori yang sesuai. Kita juga akan menginstal dependensi NodeJS sehingga kita dapat menguji monolit sebelum melakukan deployment. Mungkin perlu waktu beberapa menit untuk menjalankan skrip ini.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Ini akan meng-clone repo GitHub kita, mengubah ke direktori, dan menginstal dependensi yang diperlukan untuk menjalankan aplikasi kita secara lokal. Mungkin perlu waktu beberapa menit untuk menjalankan skrip ini.

4. Membuat Cluster GKE

Setelah Anda memiliki lingkungan developer yang aktif, kita memerlukan cluster Kubernetes untuk men-deploy monolit dan akhirnya microservice kita. Sebelum dapat membuat cluster, kita perlu memastikan API yang tepat diaktifkan. Jalankan perintah berikut untuk mengaktifkan container API agar kita dapat menggunakan Google Kubernetes Engine:

gcloud services enable container.googleapis.com

Sekarang kita siap untuk membuat cluster. Jalankan perintah di bawah ini untuk membuat cluster GKE bernama fancy-cluster dengan 3 node.

gcloud container clusters create fancy-cluster --num-nodes 3

Mungkin perlu waktu beberapa menit untuk membuat cluster. Setelah perintah selesai, jalankan perintah berikut dan lihat tiga instance VM worker di cluster:

gcloud compute instances list

Output:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Anda juga dapat melihat cluster Kubernetes dan informasi terkait di konsol Google Cloud. Klik tombol menu di kiri atas, scroll ke bawah ke Kubernetes Engine, lalu klik Clusters. Anda akan melihat cluster yang bernama fancy-cluster.

795c794b03c5d2b0.pngS

6b394dfb8a6031f2.pngS

Selamat! Anda baru saja berhasil membuat cluster Kubernetes pertama Anda.

5. Men-deploy Monolit yang Sudah Ada

Karena fokus lab ini adalah memandu memecah monolit menjadi beberapa microservice, kita perlu mengaktifkan dan menjalankan aplikasi monolit. Jalankan skrip berikut untuk men-deploy aplikasi monolit ke cluster GKE untuk tujuan lab ini:

cd ~/monolith-to-microservices
./deploy-monolith.sh

Mengakses Monolit

Untuk menemukan alamat IP eksternal aplikasi monolit, jalankan perintah berikut.

kubectl get service monolith

Anda akan melihat output yang mirip dengan berikut ini:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

CATATAN: Load balancer eksternal dan IP perlu disediakan untuk hal ini, sehingga proses ini memerlukan waktu. Jika output Anda mencantumkan IP eksternal sebagai

<pending> beri waktu beberapa menit dan coba lagi.

Setelah menentukan alamat IP eksternal untuk monolit Anda, salin alamat IP tersebut. Arahkan browser Anda ke URL ini (seperti http://203.0.113.0) untuk memeriksa apakah monolit Anda dapat diakses.

9ed25c3f0cbe62fa.pngS

Anda akan melihat halaman sambutan untuk situs monolitik seperti gambar di atas. Halaman selamat datang adalah halaman statis yang nantinya akan disalurkan oleh microservice Frontend. Sekarang monolit Anda sudah berjalan sepenuhnya di Kubernetes.

6. Memigrasikan Pesanan ke Microservice

Setelah menjalankan situs monolit di GKE, kita dapat mulai memecah setiap layanan menjadi microservice. Biasanya, upaya perencanaan harus dilakukan pada layanan mana yang akan dibagi menjadi potongan-potongan yang lebih kecil, biasanya seputar bagian tertentu dari aplikasi seperti domain bisnis. Untuk tujuan demonstrasi, kami telah membuat contoh sederhana dan menguraikan setiap layanan di seputar domain bisnis, Pesanan, Produk, dan Frontend. Kode telah dimigrasikan dan kita akan berfokus pada pembangunan dan deployment layanan di Google Kubernetes Engine (GKE).

Buat Microservice Pesanan Baru

Layanan pertama yang akan kita pisahkan adalah layanan Pesanan. Kami akan menggunakan codebase terpisah yang disediakan dan membuat container Docker terpisah untuk layanan ini.

Membuat Container Docker dengan Google Cloud Build

Karena kami telah memigrasikan codebase untuk Anda, langkah pertama kami adalah membuat container Docker dari layanan Pesanan menggunakan Google Cloud Build.

Biasanya Anda harus mengambil pendekatan dua langkah yang berarti membangun container docker dan mengirimkannya ke registry untuk menyimpan image yang dapat diambil GKE. Namun kita dapat membuat hidup lebih mudah. Kita dapat menggunakan Google Cloud Build untuk membangun container Docker dan menempatkan image di Google Cloud Container Registry dengan satu perintah. Dengan begitu, kita dapat mengeluarkan satu perintah untuk membangun dan memindahkan image ke container registry. Untuk melihat proses manual pembuatan file Docker dan mendorongnya, Anda dapat membuka di sini.

Google Cloud Build akan mengompresi file dari direktori dan memindahkannya ke bucket Google Cloud Storage. Selanjutnya, proses build akan mengambil semua file dari bucket dan menggunakan Dockerfile untuk menjalankan proses build Docker. Karena kita menentukan flag --tag dengan host sebagai gcr.io untuk image Docker, image Docker yang dihasilkan akan dikirim ke Google Cloud Container Registry.

Jalankan perintah berikut untuk membangun container Docker dan mengirimkannya ke Google Container Registry:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

Proses ini akan memakan waktu beberapa menit, tetapi setelah selesai, akan ada output di terminal yang mirip dengan berikut ini:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/orders:1.0.0  SUCCESS

Untuk melihat histori build atau menonton prosesnya secara real time, Anda dapat membuka konsol Google Cloud. Klik tombol menu di kiri atas dan scroll ke bawah ke Tools → Cloud Build, lalu klik History. Di sini Anda dapat melihat daftar semua build sebelumnya, seharusnya hanya ada 1 build yang baru saja Anda buat.

4c753ede203255f6.pngS

Jika mengklik ID build, Anda dapat melihat semua detail build tersebut, termasuk output log.

Dari halaman detail build, Anda dapat melihat image container yang dibuat dengan mengklik nama image di bagian informasi build.

6e88ed1643dfe629.pngS

Men-deploy Container ke GKE

Setelah kita memasukkan situs ke dalam container dan mengirimkan container ke Google Container Registry, sekarang saatnya men-deploy ke Kubernetes.

Kubernetes merepresentasikan aplikasi sebagai Pod, yang merupakan unit yang mewakili sebuah container (atau grup container yang terkait erat). Pod adalah unit terkecil yang dapat di-deploy di Kubernetes. Dalam tutorial ini, setiap Pod hanya berisi container microservice.

Untuk men-deploy dan mengelola aplikasi di cluster GKE, Anda harus berkomunikasi dengan sistem pengelolaan cluster Kubernetes. Biasanya, Anda dapat melakukannya dengan menggunakan alat command line kubectl dari dalam Cloud Shell.

Pertama-tama, kita akan membuat resource Deployment. Deployment mengelola beberapa salinan aplikasi Anda, yang disebut replika, dan menjadwalkannya untuk dijalankan pada setiap node di cluster Anda. Dalam hal ini, Deployment hanya akan menjalankan satu Pod aplikasi Anda. Deployment memastikan hal ini dengan membuat ReplicaSet. ReplicaSet bertanggung jawab untuk memastikan jumlah replika yang ditentukan selalu berjalan.

Perintah kubectl create deployment di bawah ini menyebabkan Kubernetes membuat orders bernama Deployment di cluster Anda dengan 1 replika.

Jalankan perintah berikut untuk men-deploy aplikasi Anda:

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

Memverifikasi Deployment

Agar Deployment berhasil dibuat, jalankan perintah berikut. Mungkin perlu waktu beberapa saat sampai status pod berjalan:

kubectl get all

Output:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

Output ini menunjukkan beberapa hal. Kita dapat melihat Deployment yang sedang berjalan, ReplicaSet dengan jumlah pod yang diinginkan 1, dan Pod yang sedang berjalan. Sepertinya semuanya berhasil dibuat.

Mengekspos Container GKE

Kita telah men-deploy aplikasi di GKE, tetapi tidak memiliki cara untuk mengaksesnya di luar cluster. Secara default, container yang Anda jalankan di GKE tidak dapat diakses dari Internet, karena container tersebut tidak memiliki alamat IP eksternal. Anda harus secara eksplisit mengekspos aplikasi ke traffic dari Internet melalui resource Service. Service menyediakan dukungan jaringan dan IP untuk Pod aplikasi Anda. GKE membuat IP eksternal dan Load Balancer ( tunduk kepada penagihan) untuk aplikasi Anda.

Saat men-deploy layanan Orders, kami mengeksposnya pada port 8081 secara internal melalui deployment Kubernetes. Untuk mengekspos layanan ini secara eksternal, kita perlu membuat layanan Kubernetes jenis LoadBalancer untuk mengarahkan traffic dari port 80 secara eksternal ke port internal 8081 untuk layanan Orders. Jalankan perintah berikut untuk mengekspos situs Anda ke Internet:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

Mengakses Layanan

GKE menetapkan alamat IP eksternal ke resource Service—bukan ke Deployment. Jika ingin mengetahui IP eksternal yang disediakan GKE untuk aplikasi Anda, Anda dapat memeriksa Service dengan perintah kubectl get service:

kubectl get service orders

Output:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

Setelah menentukan alamat IP eksternal untuk aplikasi Anda, salin alamat IP tersebut. Simpan untuk langkah berikutnya saat kita mengubah monolit agar mengarah ke layanan Orders yang baru.

Mengonfigurasi ulang Monolit

Karena kita menghapus layanan Orders dari monolit, kita harus memodifikasi monolit agar mengarah ke microservice Pesanan eksternal yang baru.

Saat memecah monolit, kami menghapus potongan kode dari satu codebase ke beberapa codebase dan men-deploy-nya secara terpisah. Karena microservice berjalan di server yang berbeda, kami tidak dapat lagi mereferensikan URL layanan sebagai jalur absolut. Oleh karena itu, kami perlu merutekan ke alamat server baru pesanan microservice kami. Perlu diperhatikan bahwa tindakan ini akan memerlukan periode nonaktif pada service monolit untuk memperbarui URL setiap service yang dirusak. Hal ini harus diperhitungkan saat berencana memindahkan microservice dan monolit ke lingkungan production selama proses migrasi microservice.

Kita perlu memperbarui file konfigurasi di monolit agar mengarah ke alamat IP microservice Pesanan yang baru. Gunakan editor nano untuk mengganti URL lokal dengan alamat IP microservice Pesanan baru kita. Jalankan perintah berikut untuk mengedit

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Saat editor terbuka, file Anda akan terlihat seperti ini:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

Ganti REACT_APP_ORDERS_URL ke format baru sambil mengganti dengan alamat IP microservice Pesanan Anda agar cocok di bawah:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Tekan CTRL+O, tekan ENTER, lalu CTRL+X untuk menyimpan file di editor nano.

Anda dapat menguji microservice baru dengan membuka URL yang baru saja ditetapkan dalam file ini. Halaman web akan menampilkan respons JSON dari microservice Pesanan kami.

Selanjutnya, kita perlu membangun ulang frontend monolit dan mengulangi proses build untuk membangun container monolit dan men-deploy ulang ke cluster GKE. Jalankan perintah berikut untuk menyelesaikan langkah-langkah ini:

Membuat Ulang File Konfigurasi Monolit

npm run build:monolith

Membuat Container Docker dengan Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Men-deploy Container ke GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Anda dapat memverifikasi bahwa aplikasi Anda sekarang mencapai microservice Orders baru dengan membuka aplikasi monolit di browser dan membuka halaman Orders. Semua ID pesanan harus diakhiri dengan akhiran -MICROSERVICE seperti yang ditunjukkan di bawah ini:

1cdd60bb0d4d1148.pngS

7. Memigrasikan Produk ke Microservice

Buat Microservice Produk Baru

Kami dapat terus mengelompokkan layanan kami dengan memigrasikan layanan Produk berikutnya. Kita akan mengikuti proses yang sama seperti langkah sebelumnya. Jalankan perintah berikut untuk membangun container Docker, men-deploy container, dan mengeksposnya melalui layanan Kubernetes.

Membuat Container Docker dengan Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

Men-deploy Container ke GKE

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

Mengekspos Container GKE

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

Temukan IP publik layanan Produk kami dengan cara yang sama seperti yang kami lakukan untuk layanan Pesanan dengan perintah berikut:

kubectl get service products

Output:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

Simpan alamat IP untuk langkah berikutnya saat mengonfigurasi ulang monolit agar mengarah ke microservice Produk baru.

Mengonfigurasi ulang Monolit

Gunakan editor nano untuk mengganti URL lokal dengan alamat IP microservice Produk baru kami:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Saat editor terbuka, file Anda akan terlihat seperti ini:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Ganti REACT_APP_PRODUCTS_URL ke format baru sambil mengganti dengan alamat IP Microservice produk Anda sehingga cocok di bawah ini:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

Tekan CTRL+O, tekan ENTER, lalu CTRL+X untuk menyimpan file di editor nano.

Anda dapat menguji microservice baru dengan membuka URL yang baru saja ditetapkan dalam file ini. Halaman web akan menampilkan respons JSON dari microservice Produk kami.

Selanjutnya, kita perlu membangun ulang frontend monolit dan mengulangi proses build untuk membangun container monolit dan men-deploy ulang ke cluster GKE. Jalankan perintah berikut untuk menyelesaikan langkah-langkah ini:

Membuat Ulang File Konfigurasi Monolit

npm run build:monolith

Membuat Container Docker dengan Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

Men-deploy Container ke GKE

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

Anda dapat memverifikasi bahwa aplikasi Anda sekarang memasuki microservice Produk baru dengan membuka aplikasi monolit di browser lalu membuka halaman Produk. Semua nama produk harus diawali dengan MS- seperti yang ditunjukkan di bawah ini:

5389b29f4b8c7c69.pngS

8. Memigrasikan Frontend ke Microservice

Langkah terakhir dalam proses migrasi adalah memindahkan kode Frontend ke microservice dan menonaktifkan monolit. Setelah langkah ini selesai, kita akan berhasil memigrasikan monolit ke arsitektur microservice.

Buat Microservice Frontend Baru

Mari ikuti prosedur yang sama seperti dua langkah terakhir untuk membuat microservice frontend baru.

Sebelumnya, saat membangun ulang monolit, kita memperbarui konfigurasi agar mengarah ke monolit, tetapi sekarang kita perlu menggunakan konfigurasi yang sama untuk microservice Frontend. Jalankan perintah berikut untuk menyalin file konfigurasi URL microservice ke codebase microservice Frontend:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

Setelah selesai, kita akan mengikuti proses yang sama seperti langkah sebelumnya. Jalankan perintah berikut untuk membangun container Docker, men-deploy container, dan mengeksposnya melalui layanan Kubernetes.

Membuat Container Docker dengan Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

Men-deploy Container ke GKE

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

Mengekspos Container GKE

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

Hapus Monolit

Setelah semua layanan berjalan sebagai microservice, kita dapat menghapus aplikasi monolit. Perhatikan bahwa dalam migrasi yang sebenarnya, hal ini juga akan memerlukan perubahan DNS, dll. agar nama domain yang sudah ada mengarah ke microservice frontend baru untuk aplikasi kita. Jalankan perintah berikut untuk menghapus monolit:

kubectl delete deployment monolith
kubectl delete service monolith

Uji Pekerjaan Anda

Untuk memverifikasi bahwa semuanya berfungsi, alamat IP lama dari service monolit tidak akan berfungsi, dan alamat IP baru dari layanan frontend harus menghosting aplikasi baru. Untuk melihat daftar semua layanan dan alamat IP, gunakan perintah berikut:

kubectl get services

Output Anda akan terlihat seperti berikut:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

Setelah menentukan alamat IP eksternal untuk microservice Frontend, salin alamat IP tersebut. Arahkan browser Anda ke URL ini (seperti http://203.0.113.0) untuk memeriksa apakah frontend Anda dapat diakses. Situs Anda harus sama seperti sebelum kami memecah monolit menjadi microservice.

9. Pembersihan

Setelah siap, cara termudah untuk membersihkan semua aktivitas yang dilakukan adalah dengan menghapus Project. Menghapus project akan menghapus semua resource yang dibuat dalam Codelab ini untuk memastikan tidak ada tagihan berulang yang tidak terduga. Jalankan perintah berikut dalam Cloud Shell, dengan PROJECT_ID adalah Project ID lengkap, bukan hanya Nama Project.

gcloud projects delete [PROJECT_ID]

Konfirmasi penghapusan dengan memasukkan "Y" saat diminta.

10. Selamat!

Anda berhasil memecah aplikasi monolitik menjadi beberapa microservice dan men-deploy-nya di Google Kubernetes Engine.

Langkah Berikutnya

Lihat codelab berikut untuk mempelajari Kubernetes lebih lanjut:

Referensi Tambahan