1. Ringkasan
Lab ini menunjukkan fitur dan kemampuan yang dirancang untuk menyederhanakan alur kerja pengembangan bagi software engineer yang bertugas mengembangkan aplikasi NodeJS di lingkungan dalam container. Pengembangan container standar mengharuskan pengguna memahami detail container dan proses build container. Selain itu, developer biasanya harus menghentikan alurnya, keluar dari IDE mereka untuk menguji dan men-debug aplikasi di lingkungan jarak jauh. Dengan alat dan teknologi yang disebutkan dalam tutorial ini, developer dapat bekerja secara efektif dengan aplikasi dalam container tanpa perlu meninggalkan IDE mereka.
Yang akan Anda pelajari
Di lab ini, Anda akan mempelajari metode pengembangan dengan container di Google Cloud, termasuk:
- Membuat aplikasi Nodejs awal
- Mengonfigurasi aplikasi Nodejs untuk pengembangan container
- Mengkodekan Layanan Istirahat CRUD sederhana
- Men-deploy ke GKE
- Men-debug status error
- Menggunakan titik henti sementara / log
- Melakukan deployment perubahan 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.
- Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
- Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak
peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai
PROJECT_ID
). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloudshell Editor
Lab ini dirancang dan diuji agar dapat digunakan dengan Google Cloud Shell Editor. Untuk mengakses editor,
- akses project Google Anda di https://console.cloud.google.com.
- Di sudut kanan atas, klik ikon Cloud Shell Editor
- 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)')
Menyediakan infrastruktur yang digunakan dalam lab ini
Di lab ini, Anda akan men-deploy kode ke GKE dan mengakses data yang tersimpan di database CloudSQL. Skrip penyiapan di bawah menyiapkan infrastruktur ini untuk Anda.
- Download skrip penyiapan dan setel agar dapat dijalankan.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/setup_with_cw.sh
chmod +x setup_with_cw.sh
- Buka file
setup_with_cw.sh
dan edit nilai sandi yang saat ini disetel ke CHANGEME - Jalankan skrip penyiapan untuk menyiapkan cluster GKE dan database CloudSQL yang akan Anda gunakan di lab ini
./setup_with_cw.sh &
Cluster Cloud Workstations
- Buka Cloud Workstations di Konsol Cloud. Tunggu hingga cluster berada dalam status
READY
.
Membuat Konfigurasi Workstations
- Jika sesi Cloud Shell Anda terputus, klik "Hubungkan kembali" lalu jalankan perintah "gcloud cli" untuk menetapkan project ID. Ganti contoh project id di bawah dengan project ID qwiklabs Anda sebelum menjalankan perintah.
gcloud config set project qwiklabs-gcp-project-id
- Download dan jalankan skrip di bawah di terminal untuk membuat konfigurasi Cloud Workstations.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
- Verifikasi hasilnya di bagian Konfigurasi. Perlu waktu 2 menit untuk bertransisi ke status SIAP.
- Buka Cloud Workstations di Konsol dan buat instance baru.
- Ubah nama menjadi
my-workstation
dan pilih konfigurasi yang ada:codeoss-js
.
- Verifikasi hasilnya di bagian Workstations.
Luncurkan Workstation
- Memulai dan meluncurkan workstation. Butuh beberapa menit untuk memulai Workstation.
- Izinkan cookie pihak ketiga dengan mengklik ikon di kolom URL.
- Klik "Situs tidak berfungsi?".
- Klik "Izinkan cookie".
- Setelah workstation diluncurkan, Anda akan melihat Code OSS IDE muncul. Klik "Tandai Selesai" di halaman Memulai di salah satu workstation IDE
3. Membuat aplikasi awal Nodejs baru
Di bagian ini, Anda akan membuat aplikasi Nodejs baru.
- Buka Terminal baru.
- Di Cloud Shell, buat direktori baru dengan nama
mynodejsapp
mkdir mynodejsapp
Klik tombol Izinkan jika Anda melihat pesan ini, sehingga Anda dapat menyalin dan menempel ke komputer.
- Ubah ke direktori ini dan buka sebagai ruang kerja. Tindakan ini akan memuat ulang editor dengan membuat konfigurasi Workspace dalam folder yang baru dibuat.
cd mynodejsapp && code-oss-cloud-workstations -r --folder-uri="$PWD"
- Buka terminal baru lagi. Instal Node dan NPM menggunakan NVM.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/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
4. Membuat aplikasi awal baru
- Melakukan inisialisasi aplikasi
Buat file package.json
dengan menjalankan perintah berikut
npm init
Choose the `entry point: (index.js) src/index.js` and leave default values for the rest of the parameters. This will create the `package.json` 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
Buka dan edit file package.json
di IDE untuk menyertakan perintah mulai dalam 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 ini.
{
"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": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.3"
}
}
- Membuat file index.js
Buat direktori sumber bernama src dengan memilih New Folder pada tampilan explorer.
Membuat file 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 melakukan inisialisasi Skaffold yang secara otomatis akan membuat file YAML kubernetes dasar. Jalankan perintah di bawah ini untuk memulai prosesnya.
Jalankan perintah berikut di terminal
skaffold init --generate-manifests
Saat diminta:
- Masukkan 8080 untuk port
- Masukkan y untuk menyimpan konfigurasi
Dua file ditambahkan ke {i>workspace viz<i}, skaffold.yaml
dan deployment.yaml
Perbarui nama aplikasi
Nilai default yang disertakan dalam konfigurasi saat ini tidak cocok dengan nama aplikasi Anda. Update 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 dan pilih Change All Occurrences
- 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 dan pilih Change All Occurrences
- Ketik nama baru sebagai
mynodejsapp
Perhatikan bahwa di file skaffold.yaml
, bagian build
menggunakan buildpacks
untuk menyimpan aplikasi dalam container. Kode ini tidak memiliki Dockerfile dan developer tidak memerlukan pengetahuan Docker untuk memasukkan aplikasi ini ke dalam container.
Selain itu, hot sync otomatis diaktifkan antara editor dan container yang sedang berjalan oleh konfigurasi skaffold ini. Tidak diperlukan konfigurasi tambahan untuk mengaktifkan hot sync.
5. Menjalani proses pengembangan
Di bagian ini, Anda akan memandu beberapa langkah menggunakan plugin Cloud Code untuk mempelajari proses dasar serta memvalidasi konfigurasi dan penyiapan aplikasi awal.
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 yang mengabstraksi detail dari alur developer. Cloud Code juga meningkatkan proses pengembangan Anda dengan menyediakan kemampuan hotsync dan debug tradisional untuk pengembangan berbasis container.
Login ke Google Cloud
- Klik ikon Cloud Code dan pilih "Sign in to Google Cloud":
- Klik "Lanjutkan login".
- Periksa output di Terminal dan buka link:
- Login dengan kredensial siswa Qwiklabs Anda.
- Pilih "Izinkan":
- Salin kode verifikasi dan kembali ke tab Workstation.
- Tempelkan kode verifikasi dan tekan Enter.
Tambahkan Cluster Kubernetes
- Menambahkan Cluster
- Pilih Google Kubernetes Engine:
- Pilih project.
- Pilih "mycluster" yang dibuat di penyiapan awal.
- Cluster ini sekarang muncul di daftar cluster Kubernetes di bagian Cloud Code. Jelajahi dan jelajahi cluster dari sini.
Tetapkan ID project saat ini menggunakan gcloud cli
- Salin project ID untuk lab ini dari halaman qwiklabs.
- Dari terminal, jalankan perintah gcloud cli untuk menetapkan project ID. Ganti contoh project id sebelum menjalankan perintah. GANTI ID project sebelum menjalankan perintah di bawah.
gcloud config set project qwiklabs-gcp-project-id
Men-deploy ke Kubernetes
- Pada panel di bagian bawah Cloud Shell Editor, pilih Cloud Code ✔
- Di panel yang muncul di bagian atas pada SESI PENGEMBANGAN, pilih Jalankan di Kubernetes. Jika diminta, pilih Ya untuk menggunakan konteks Kubernetes saat ini.
- Saat pertama kali Anda menjalankan perintah, sebuah {i>prompt<i} akan muncul di bagian atas layar yang menanyakan apakah Anda menginginkan konteks kubernetes saat ini, pilih "Yes" untuk menerima dan menggunakan konteks saat ini.
- Selanjutnya, akan muncul perintah yang menanyakan container registry yang akan digunakan. Tekan enter untuk menerima nilai default yang diberikan
- Pilih tab Output di panel bawah dan Kubernetes: Run/Debug di menu dropdown untuk melihat progres dan notifikasi
- Pilih "Kubernetes: Run/Debug - Terperinci" di menu drop-down saluran di sebelah kanan untuk melihat detail tambahan dan log yang melakukan streaming langsung dari penampung
- Kembali ke tampilan yang disederhanakan dengan memilih "Kubernetes: Run/Debug" dari menu dropdown
- Saat build dan pengujian selesai, tab Output akan menampilkan:
Resource deployment/mynodejsapp status completed successfully
, dan URL akan tercantum: "Forwarded URL from service demo-app: http://localhost:8080" - Di terminal Cloud Code, arahkan kursor ke URL di output (http://localhost:8080), lalu di ujung alat yang muncul, pilih Ikuti Link.
Responsnya adalah:
{"message":"Greetings from Node"}
Hot Reload
- Buka
src/index.js
Edit kode pesan salam untuk'Hello from Node'
Perhatikan segera bahwa di jendela Output
, tampilan Kubernetes: Run/Debug
, watcher menyinkronkan file yang diupdate 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 kode ini 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/
- Refresh browser Anda untuk melihat hasil yang diperbarui.
Proses Debug
- Buka tampilan Debug dan hentikan thread saat ini .
- Klik
Cloud Code
di menu bawah dan pilihDebug on Kubernetes
untuk menjalankan aplikasi dalam modedebug
.
- Dalam tampilan
Kubernetes Run/Debug - Detailed
di jendelaOutput
, perhatikan bahwa skaffold akan men-deploy aplikasi ini dalam mode debug. - Aplikasi akan membutuhkan waktu beberapa menit untuk dibangun dan di-deploy. Anda akan melihat debugger terpasang 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 berubah warnanya dari biru menjadi oranye yang menunjukkan bahwa status bar berada dalam mode Debug.
- Dalam tampilan
Kubernetes Run/Debug
, perhatikan bahwa penampung yang dapat di-debug dimulai
**************URLs***************** Forwarded URL from service mynodejsapp-service: http://localhost:8080 Debuggable container started pod/mynodejsapp-deployment-6bc7598798-xl9kj:mynodejsapp (default) Update succeeded ***********************************
Memanfaatkan Breakpoint
- Buka
src/index.js
- Cari pernyataan yang bertuliskan
var message="Hello from Node";
- Tambahkan titik henti sementara ke baris tersebut dengan mengklik ruang kosong di sebelah kiri nomor baris. Indikator merah akan muncul untuk mencatat titik henti sementara yang telah disetel
- Muat ulang browser Anda dan perhatikan bahwa debugger menghentikan proses pada titik henti sementara sehingga Anda dapat menyelidiki variabel dan status aplikasi yang berjalan dari jarak jauh di GKE
- Klik bagian variabel hingga Anda menemukan variabel
"message"
. - Jalankan baris dengan menekan Step over
- Amati nilai saat ini dari perubahan variabel
"message"
menjadi"Hello from Node"
- Klik dua kali nama variabel "target" Di jendela pop-up, ubah nilai ke nilai lain seperti
"Hi from Node"
- Klik tombol Lanjutkan pada panel kontrol debug
- Tinjau respons di browser Anda yang kini menampilkan nilai terbaru yang baru saja Anda masukkan.
- Menghentikan "Debug" mode dengan menekan tombol berhenti dan menghapus titik henti sementara dengan mengklik titik henti sementara lagi.
6. Mengembangkan Layanan Istirahat CRUD yang sederhana
Pada tahap ini, aplikasi Anda telah dikonfigurasi sepenuhnya untuk pengembangan dalam container dan Anda telah mempelajari alur kerja pengembangan dasar dengan Cloud Code. Di bagian berikut, Anda akan mempraktikkan hal-hal 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 lainnya. Pastikan dependensi tersedia dengan menambahkan berikut ini dalam file package.json
- Tambahkan dua dependensi lagi
pg
dansequelize
ke filepackage.json
untuk membangun Postgres aplikasi CRUD. Bagian dependensi postingan akan terlihat seperti ini.
"dependencies": {
"express": "^4.17.3",
"pg": "^8.8.0",
"sequelize": "^6.25.7"
}
Membuat kode 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.js
mengacu pada variabel lingkungan yang harus disediakan agar dapat terhubung ke database. Anda juga perlu mengurai permintaan yang masuk untuk encoding URL. - Tambahkan cuplikan kode berikut di
src/index.js
agar 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 dalam file
deployment.yaml
untuk menambahkan variabel lingkungan guna memberikan informasi konektivitas Database.
Update entri spesifikasi 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 Validasi Aplikasi
- Di panel bagian bawah Cloud Shell Editor, pilih
Cloud Code
lalu pilihDebug on Kubernetes
di bagian atas layar. - Saat build dan pengujian selesai, tab Output menampilkan:
Resource deployment/mynodejsapp status completed successfully
, dan URL akan tercantum: "Forwarded URL from service mynodejsapp: http://localhost:8080" - Tambahkan beberapa item.
Dari Terminal cloudshell, jalankan perintah di bawah ini
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
- Test Delete: Sekarang coba hapus item dengan menjalankan perintah di bawah. 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]"}
Mengidentifikasi dan memperbaiki masalah
- Aplikasi berjalan dalam mode Debug. Jadi, gunakan titik henti sementara untuk menemukan masalah. Berikut ini beberapa tips:
- Kami tahu ada yang salah dengan DELETE karena tidak menampilkan 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 Tonton.
- Perhatikan bahwa nilai yang ditetapkan ke
id
adalahundefined
. Ubah kode untuk memperbaiki masalah.
Cuplikan kode tetap 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 menghapusnya.
- Hentikan sesi proses debug dengan mengklik kotak merah di toolbar debug
7. Pembersihan
Selamat! Di lab ini, Anda telah membuat aplikasi Nodejs baru dari awal dan mengonfigurasinya agar berfungsi dalam mode deployment hot dengan container. Kemudian, Anda telah men-deploy dan men-debug aplikasi ke cluster GKE jarak jauh dengan mengikuti alur developer yang sama dengan yang ada di stack aplikasi tradisional.
Untuk melakukan pembersihan setelah menyelesaikan lab:
- Menghapus file yang digunakan dalam lab
cd ~ && rm -rf mynodejsapp && rm -f setup.sh
- Menghapus project untuk menghapus semua infrastruktur dan resource terkait