1. Ringkasan
Lab ini menunjukkan fitur dan kemampuan yang dirancang untuk menyederhanakan alur kerja pengembangan bagi engineer software yang bertugas mengembangkan aplikasi NodeJS dalam lingkungan yang di-container. Pengembangan container yang umum mengharuskan pengguna memahami detail container dan proses build container. Selain itu, developer biasanya harus menghentikan alur kerja mereka, keluar dari IDE untuk menguji dan men-debug aplikasi mereka di lingkungan jarak jauh. Dengan alat dan teknologi yang disebutkan dalam tutorial ini, developer dapat bekerja secara efektif dengan aplikasi yang di-containerisasi tanpa keluar dari IDE mereka.
Yang akan Anda pelajari
Dalam lab ini, Anda akan mempelajari metode untuk mengembangkan dengan container di GCP, termasuk:
- Membuat aplikasi Nodejs awal
- Mengonfigurasi aplikasi Nodejs untuk pengembangan container
- Mengodekan Layanan Rest CRUD sederhana
- Men-deploy ke GKE
- Men-debug status error
- Memanfaatkan titik henti sementara / log
- Men-deploy perubahan kembali ke GKE
- Opsional: Mengintegrasikan CloudSQL untuk persistensi backend
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.



- Nama project adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
- Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai
PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat. - Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell Editor
Lab ini dirancang dan diuji untuk digunakan dengan Editor Google Cloud Shell. Untuk mengakses editor:
- mengakses project google Anda di https://console.cloud.google.com.
- Di pojok kanan atas, klik ikon editor cloud shell

- Panel baru akan terbuka di bagian bawah jendela
- Klik tombol Open Editor

- Editor akan terbuka dengan penjelajah di sebelah kanan dan editor di area tengah
- Panel terminal juga harus tersedia di bagian bawah layar
- Jika terminal TIDAK terbuka, gunakan kombinasi tombol `ctrl+`` untuk membuka jendela terminal baru
Menyiapkan gcloud
Di Cloud Shell, tetapkan project ID dan region tempat Anda ingin men-deploy aplikasi. Simpan sebagai variabel PROJECT_ID dan REGION.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
Menyiapkan cluster dan database GKE
- Download skrip penyiapan dan jadikan dapat dieksekusi.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/setup.sh
chmod +x setup.sh
Menyediakan infrastruktur yang digunakan dalam lab ini
Di lab ini, Anda akan men-deploy kode ke GKE dan mengakses data yang disimpan dalam database Spanner. Skrip penyiapan di bawah akan menyiapkan infrastruktur ini untuk Anda.
- Buka file
setup.shdan edit nilai sandi yang saat ini ditetapkan ke CHANGEME - Jalankan skrip penyiapan untuk menyiapkan cluster GKE dan database CloudSQL yang akan Anda gunakan dalam lab ini
./setup.sh
- Di Cloud Shell, buat direktori baru dengan nama
mynodejsapp
mkdir mynodejsapp
- Buka direktori ini dan buka sebagai ruang kerja. Tindakan ini akan memuat ulang editor dengan membuat konfigurasi ruang kerja di folder yang baru dibuat.
cd mynodejsapp && cloudshell workspace .
- Instal Node dan NPM menggunakan NVM.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
# This loads nvm bash_completion
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
nvm install stable
nvm alias default stable
3. Membuat aplikasi awal baru
- Menginisialisasi aplikasi
Membuat file package.json dengan menjalankan perintah berikut
npm init
Choose the entry point: (index.js) src/index.js and default values for the rest of the parameters. This will create the file with following contents
{
"name": "mynodejsapp",
"version": "1.0.0",
"description": "",
"main": "src/index.js",,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
- Menambahkan Titik Entri
Edit file ini untuk menyertakan perintah start di skrip "start": "node src/index.js",. Setelah perubahan, skrip akan terlihat seperti cuplikan kode di bawah:
"scripts": {
"start": "node src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
- Menambahkan Dependensi Express
Kode yang akan kita tambahkan juga menggunakan express, jadi mari kita tambahkan dependensi tersebut ke file package.json ini. Jadi, setelah semua perubahan, file package.json akan terlihat seperti yang ditunjukkan di bawah.
{
"name": "mynodejsapp",
"version": "1.0.0",
"description": "",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Your Name",
"license": "ISC",
"dependencies": {
"express": "^4.16.4"
}
}
- Buat file index.js
Buat direktori sumber bernama src
Buat src/index.js dengan kode berikut
const express = require('express');
const app = express();
const PORT = 8080;
app.get('/', (req, res) => {
var message="Greetings from Node";
res.send({ message: message });
});
app.listen(PORT, () => {
console.log(`Server running at: http://localhost:${PORT}/`);
});
Perhatikan bahwa PORT ditetapkan ke nilai 8080
Membuat Manifes
Skaffold menyediakan alat terintegrasi untuk menyederhanakan pengembangan container. Pada langkah ini, Anda akan menginisialisasi skaffold yang akan otomatis membuat file YAML Kubernetes dasar. Jalankan perintah di bawah untuk memulai proses.
Jalankan perintah berikut di terminal
skaffold init --generate-manifests
Saat diminta:
- Masukkan 8080 untuk port
- Masukkan y untuk menyimpan konfigurasi
Dua file ditambahkan ke ruang kerja, yaitu skaffold.yaml dan deployment.yaml
Perbarui nama aplikasi
Nilai default yang disertakan dalam konfigurasi saat ini tidak cocok dengan nama aplikasi Anda. Perbarui file untuk mereferensikan nama aplikasi Anda, bukan nilai default.
- Mengubah entri dalam konfigurasi Skaffold
- Buka
skaffold.yaml - Pilih nama gambar yang saat ini ditetapkan sebagai
package-json-image - Klik kanan, lalu pilih Ubah Semua Kemunculan
- Ketik nama baru sebagai
mynodejsapp
- Mengubah entri dalam konfigurasi Kubernetes
- Buka file
deployment.yaml - Pilih nama gambar yang saat ini ditetapkan sebagai
package-json-image - Klik kanan, lalu pilih Ubah Semua Kemunculan
- Ketik nama baru sebagai
mynodejsapp
Perhatikan bahwa di file skaffold.yaml, bagian build menggunakan buildpacks untuk membuat aplikasi dalam penampung. Kode ini tidak memiliki Dockerfile dan developer tidak memerlukan pengetahuan tentang Docker untuk membuat container aplikasi ini.
Selain itu, sinkronisasi cepat diaktifkan secara otomatis antara editor dan container yang sedang berjalan oleh konfigurasi skaffold ini. Tidak diperlukan konfigurasi tambahan untuk mengaktifkan sinkronisasi cepat.
4. Menjelaskan proses pengembangan
Di bagian ini, Anda akan mempelajari beberapa langkah menggunakan plugin Cloud Code untuk mempelajari proses dasar dan memvalidasi konfigurasi serta penyiapan aplikasi starter Anda.
Cloud Code terintegrasi dengan Skaffold untuk menyederhanakan proses pengembangan Anda. Saat Anda men-deploy ke GKE dalam langkah-langkah berikut, Cloud Code dan Skaffold akan otomatis membangun image container Anda, mengirimkannya ke Container Registry, lalu men-deploy aplikasi Anda ke GKE. Hal ini terjadi di balik layar dengan mengabstraksi detail dari alur developer. Cloud Code juga meningkatkan proses pengembangan Anda dengan menyediakan kemampuan debug dan sinkronisasi cepat tradisional untuk pengembangan berbasis container.
Men-deploy ke Kubernetes
- Di panel di bagian bawah Cloud Shell Editor, pilih Cloud Code 

- Di panel yang muncul di bagian atas, pilih Jalankan di Kubernetes. Jika diminta, pilih Ya untuk menggunakan konteks Kubernetes saat ini.

- Saat pertama kali Anda menjalankan perintah, perintah akan muncul di bagian atas layar yang menanyakan apakah Anda menginginkan konteks kubernetes saat ini. Pilih "Ya" untuk menyetujui dan menggunakan konteks saat ini.

- Selanjutnya, perintah akan ditampilkan untuk menanyakan registry container mana yang akan digunakan. Tekan enter untuk menerima nilai default yang diberikan

- Pilih tab Output di panel bawah untuk melihat progres dan notifikasi

- Pilih "Kubernetes: Run/Debug - Detailed" di drop-down channel di sebelah kanan untuk melihat detail tambahan dan streaming log secara live dari penampung

- Kembali ke tampilan sederhana dengan memilih "Kubernetes: Run/Debug" dari menu dropdown
- Setelah build dan pengujian selesai, tab Output akan menampilkan:
Resource deployment/mynodejsapp status completed successfully, dan URL akan dicantumkan: "Forwarded URL from service demo-app: http://localhost:8080" - Di terminal Cloud Code, arahkan kursor ke URL dalam output (http://localhost:8080), lalu di tips alat yang muncul, pilih Open Web Preview.
Responsnya adalah:
{"message":"Greetings from Node"}
Hot Reload
- Buka
src/index.jsEdit kode pesan salam menjadi'Hello from Node'
Segera perhatikan bahwa di jendela Output, tampilan Kubernetes: Run/Debug, watcher menyinkronkan file yang diperbarui dengan container di Kubernetes
Update initiated File sync started for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a File sync succeeded for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a Update succeeded
- Jika beralih ke tampilan
Kubernetes: Run/Debug - Detailed, Anda akan melihat bahwa tampilan tersebut mengenali perubahan file dan memulai ulang node
files modified: [src/index.js] Copying files:map[src/index.js:[/workspace/src/index.js]]togcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a Syncing 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a Watching for changes... [mynodejsapp] [mynodejsapp]> mynodejsapp@1.0.0 start /workspace [mynodejsapp]> node src/index.js [mynodejsapp] [mynodejsapp]Server running at: http://localhost:8080/
- Muat ulang browser Anda untuk melihat hasil yang diperbarui.
Proses debug
- Buka tampilan Debug dan hentikan thread saat ini
. - Klik
Cloud Codedi menu bawah, lalu pilihDebug on Kubernetesuntuk menjalankan aplikasi dalam modedebug.
- Di tampilan
Kubernetes Run/Debug - DetailedjendelaOutput, perhatikan bahwa skaffold akan men-deploy aplikasi ini dalam mode debug. - Proses build dan deployment aplikasi akan memerlukan waktu beberapa menit. Anda akan melihat debugger terlampir kali ini.
Port forwarding pod/mynodejsapp-6bbcf847cd-vqr6v in namespace default, remote port 9229 -> http://127.0.0.1:9229 [mynodejsapp]Debugger attached.
- Status bar bawah mengubah warnanya dari biru menjadi oranye yang menunjukkan bahwa status bar tersebut berada dalam mode Debug.
- Di tampilan
Kubernetes Run/Debug, perhatikan bahwa container yang Dapat di-debug telah dimulai
**************URLs***************** Forwarded URL from service mynodejsapp-service: http://localhost:8080 Debuggable container started pod/mynodejsapp-deployment-6bc7598798-xl9kj:mynodejsapp (default) Update succeeded ***********************************
Memanfaatkan Titik Henti Sementara
- Buka
src/index.js - Cari pernyataan yang bertuliskan
var message="Greetings from Node"; - Tambahkan titik henti sementara ke baris tersebut dengan mengklik spasi kosong di sebelah kiri nomor baris. Indikator merah akan ditampilkan untuk menunjukkan bahwa titik henti sementara telah ditetapkan
- Muat ulang browser Anda dan perhatikan bahwa debugger menghentikan proses pada titik henti sementara dan memungkinkan Anda menyelidiki variabel dan status aplikasi yang berjalan dari jarak jauh di GKE
- Klik ke bagian variabel hingga Anda menemukan variabel
"message". - Jalankan baris dengan menekan Step over

- Perhatikan perubahan nilai variabel
"message"saat ini menjadi"Greetings from Node" - Klik dua kali nama variabel "target" dan di jendela pop-up, ubah nilainya menjadi sesuatu yang berbeda seperti
"Hello from Node" - Klik tombol Lanjutkan di panel kontrol debug
- Tinjau respons di browser Anda yang kini menampilkan nilai yang diperbarui yang baru saja Anda masukkan.
- Hentikan mode "Debug" dengan menekan tombol berhenti
dan hapus titik henti sementara dengan mengklik titik henti sementara lagi.
5. Mengembangkan Layanan Rest CRUD sederhana
Pada tahap ini, aplikasi Anda telah sepenuhnya dikonfigurasi untuk pengembangan dalam container dan Anda telah mempelajari alur kerja pengembangan dasar dengan Cloud Code. Di bagian berikut, Anda akan mempraktikkan apa yang telah Anda pelajari dengan menambahkan endpoint layanan REST yang terhubung ke database terkelola di Google Cloud.
Mengonfigurasi Dependensi
Kode aplikasi menggunakan database untuk mempertahankan data layanan REST. Pastikan dependensi tersedia dengan menambahkan kode berikut di file package.json
- Tambahkan dua dependensi lagi,
pgdansequelize, ke filepackage.jsonuntuk membangun aplikasi CRUD Postgres. Bagian dependensi setelah perubahan akan terlihat seperti ini.
"dependencies": {
"express": "^4.16.4",
"pg": "^8.7.3",
"sequelize": "^6.17.0"
}
Mengodekan layanan REST
- Tambahkan kode aplikasi CRUD ke aplikasi ini
wget -O app.zip https://github.com/GoogleCloudPlatform/container-developer-workshop/raw/main/labs/nodejs/app.zip
unzip app.zip
Kode ini memiliki
- Folder models dengan model entity untuk
item - folder controllers dengan kode yang melakukan operasi CRUD
- Folder routes yang merutekan pola URL tertentu ke panggilan yang berbeda
- Folder config dengan detail konektivitas database
- Perhatikan bahwa konfigurasi database dalam file
db.config.jsmerujuk pada variabel lingkungan yang perlu diberikan untuk terhubung ke database. Anda juga perlu mengurai permintaan masuk untuk encoding URL. - Tambahkan cuplikan kode berikut di
src/index.jsagar dapat terhubung ke kode CRUD dari file javascript utama Anda tepat sebelum bagian terakhir yang dimulai denganapp.listen(PORT, () => {
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(
bodyParser.urlencoded({
extended: true,
})
)
const db = require("../app/models");
db.sequelize.sync();
require("../app/routes/item.routes")(app);
- Edit deployment di file
deployment.yamluntuk menambahkan variabel lingkungan guna memberikan informasi konektivitas Database.
Perbarui entri spec di akhir file agar sesuai dengan definisi berikut
spec:
containers:
- name: mynodejsapp
image: mynodejsapp
env:
- name: DB_HOST
value: ${DB_INSTANCE_IP}
- name: DB_PORT
value: "5432"
- name: DB_USER
valueFrom:
secretKeyRef:
name: gke-cloud-sql-secrets
key: username
- name: DB_PASS
valueFrom:
secretKeyRef:
name: gke-cloud-sql-secrets
key: password
- name: DB_NAME
valueFrom:
secretKeyRef:
name: gke-cloud-sql-secrets
key: database
- Ganti nilai DB_HOST dengan alamat Database Anda
export DB_INSTANCE_IP=$(gcloud sql instances describe mytest-instance \
--format=json | jq \
--raw-output ".ipAddresses[].ipAddress")
envsubst < deployment.yaml > deployment.new && mv deployment.new deployment.yaml
Men-deploy dan Memvalidasi Aplikasi
- Di panel di bagian bawah Cloud Shell Editor, pilih
Cloud Code, lalu pilihDebug on Kubernetesdi bagian atas layar. - Setelah build dan pengujian selesai, tab Output akan menampilkan:
Resource deployment/mynodejsapp status completed successfully, dan URL akan dicantumkan: "Forwarded URL from service mynodejsapp: http://localhost:8080" - Tambahkan beberapa item.
Dari Terminal cloudshell, jalankan perintah di bawah
URL=localhost:8080
curl -X POST $URL/items -d '{"itemName":"Body Spray", "itemPrice":3.2}' -H "Content-Type: application/json"
curl -X POST $URL/items -d '{"itemName":"Nail Cutter", "itemPrice":2.5}' -H "Content-Type: application/json"
- Uji GET dengan menjalankan $URL/items di browser. Anda juga dapat menjalankan curl dari command line
curl -X GET $URL/items
- Uji Penghapusan: Sekarang coba hapus item dengan menjalankan. Ubah nilai item-id jika diperlukan.
curl -X DELETE $URL/items/1
This throws an error message
{"message":"Could not delete Item with id=[object Object]"}
Identifikasi dan perbaiki masalahnya
- Mulai ulang aplikasi dalam mode Debug dan temukan masalahnya. Berikut ini beberapa tips:
- Kita tahu ada yang salah dengan DELETE karena tidak memberikan hasil yang diinginkan. Jadi, Anda akan menetapkan titik henti sementara dalam metode
itemcontroller.js->exports.delete. - Jalankan eksekusi langkah demi langkah dan amati variabel di setiap langkah untuk mengamati nilai variabel lokal di jendela kiri.
- Untuk mengamati nilai tertentu seperti
request.params, tambahkan variabel ini ke jendela Watch.
- Perhatikan bahwa nilai yang ditetapkan ke
idadalahundefined. Ubah kode untuk memperbaiki masalah.
Cuplikan kode yang diperbaiki akan terlihat seperti ini.
// Delete a Item with the specified id in the request
exports.delete = (req, res) => {
const id = req.params.id;
- Setelah aplikasi dimulai ulang, uji lagi dengan mencoba menghapus.
- Hentikan sesi proses debug dengan mengklik kotak merah di toolbar debug

6. Pembersihan
Selamat! Dalam lab ini, Anda telah membuat aplikasi Nodejs baru dari awal dan mengonfigurasinya agar berfungsi dalam mode deployment aktif dengan container. Kemudian, Anda men-deploy dan men-debug aplikasi ke cluster GKE jarak jauh dengan mengikuti alur developer yang sama seperti yang ditemukan dalam stack aplikasi tradisional.
Untuk membersihkan setelah menyelesaikan lab:
- Hapus file yang digunakan dalam lab
cd ~ && rm -rf mynodejsapp && rm -f setup.sh
- Hapus project untuk menghapus semua infrastruktur dan resource terkait