Menghubungkan Cloud Spanner dengan Autopilot GKE

1. Pengantar

Cloud Spanner adalah layanan database relasional skalabel dan terkelola sepenuhnya secara horizontal yang terdistribusi secara global, yang menyediakan transaksi ACID dan semantik SQL tanpa mengorbankan performa dan ketersediaan tinggi.

GKE Autopilot adalah mode operasi di GKE yang memungkinkan Google mengelola konfigurasi cluster Anda, termasuk node, penskalaan, keamanan, dan setelan lainnya yang telah dikonfigurasi sebelumnya untuk mengikuti praktik terbaik. Misalnya, GKE Autopilot mengaktifkan Workload Identity untuk mengelola izin layanan.

Lab ini bertujuan memandu Anda melalui proses untuk menghubungkan beberapa layanan backend yang berjalan di Autopilot GKE ke database Cloud Spanner.

3d810aa9ec80a271.png

Di lab ini, Anda akan menyiapkan project terlebih dahulu dan meluncurkan Cloud Shell. Kemudian, Anda akan men-deploy infrastruktur menggunakan Terraform.

Setelah selesai, Anda akan berinteraksi dengan Cloud Build dan Cloud Deploy untuk melakukan migrasi skema awal untuk database Game, men-deploy layanan backend, lalu men-deploy workload.

Layanan dalam codelab ini sama dengan layanan dari codelab Mulai Menggunakan Cloud Spanner untuk Pengembangan Game. Menjalankan codelab tersebut tidak diperlukan untuk menjalankan layanan di GKE dan terhubung ke Spanner. Namun, jika Anda tertarik dengan detail lebih lanjut tentang layanan spesifik yang berfungsi di Spanner, lihat detailnya.

Dengan workload dan layanan backend yang berjalan, Anda dapat mulai membuat beban dan mengamati cara kerja layanan bersama-sama.

Terakhir, Anda akan membersihkan resource yang dibuat di lab ini.

Yang akan Anda build

Sebagai bagian dari lab ini, Anda akan:

  • Menyediakan infrastruktur menggunakan Terraform
  • Buat skema database menggunakan proses Migrasi Skema di Cloud Build
  • Deploy empat layanan backend Golang yang memanfaatkan Workload Identity untuk terhubung ke Cloud Spanner
  • Deploy empat layanan beban kerja yang digunakan untuk menyimulasikan beban untuk layanan backend.

Yang akan Anda pelajari

  • Cara menyediakan pipeline Autopilot GKE, Cloud Spanner, dan Cloud Deploy menggunakan Terraform
  • Cara Workload Identity memungkinkan layanan di GKE meniru identitas akun layanan untuk mengakses izin IAM guna menggunakan Cloud Spanner
  • Cara membuat beban seperti produksi di GKE dan Cloud Spanner menggunakan Locust.io

Yang Anda butuhkan

  • Project Google Cloud yang terhubung ke akun penagihan.
  • Browser web, seperti Chrome atau Firefox.

2. Penyiapan dan persyaratan

Membuat project

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.

Jika Anda sudah memiliki project, klik menu pull-down pilihan project di kiri atas konsol:

6c9406d9b014760.png

dan klik tombol 'PROJECT BARU' dalam dialog yang dihasilkan untuk membuat project baru:

949d83c8a4ee17d9.png

Jika belum memiliki project, Anda akan melihat dialog seperti ini untuk membuat project pertama:

870a3cbd6541ee86.png

Dialog pembuatan project berikutnya memungkinkan Anda memasukkan detail project baru:

6a92c57d3250a4b3.png

Ingat project ID yang merupakan 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, jika Anda belum melakukannya, Anda harus mengaktifkan penagihan di Developers Console untuk menggunakan resource Google Cloud dan mengaktifkan Cloud Spanner API.

15d0ef27a8fbab27.png

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 Cloud Spanner didokumentasikan di sini, dan GKE Autopilot didokumentasikan di sini.

Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai $300, yang menjadikan codelab ini sepenuhnya gratis.

Penyiapan Cloud Shell

Meskipun Google Cloud dan Spanner dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, kita akan menggunakan Google Cloud Shell, 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 Shell gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (hanya perlu beberapa saat untuk melakukan penyediaan dan terhubung ke lingkungan).

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

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:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

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>

Mendownload kode

Di Cloud Shell, Anda dapat mendownload kode untuk lab ini:

git clone https://github.com/cloudspannerecosystem/spanner-gaming-sample.git

Output perintah

Cloning into 'spanner-gaming-sample'...
*snip*

Codelab ini didasarkan pada rilis v0.1.3, jadi periksa tag tersebut:

cd spanner-gaming-sample
git fetch --all --tags

# Check out v0.1.3 release
git checkout tags/v0.1.3 -b v0.1.3-branch

Output perintah

Switched to a new branch 'v0.1.3-branch'

Sekarang, tetapkan direktori kerja saat ini sebagai variabel lingkungan DEMO_HOME. Hal ini akan mempermudah navigasi saat Anda mempelajari berbagai bagian codelab.

export DEMO_HOME=$(pwd)

Ringkasan

Pada langkah ini, Anda telah menyiapkan project baru, mengaktifkan Cloud Shell, dan mendownload kode untuk lab ini.

Berikutnya

Selanjutnya, Anda akan menyediakan infrastruktur menggunakan Terraform.

3. Menyediakan infrastruktur

Ringkasan

Setelah project Anda siap, saatnya menjalankan infrastruktur. Hal ini mencakup jaringan VPC, Cloud Spanner, GKE Autopilot, Artifact Registry untuk menyimpan image yang akan berjalan di GKE, pipeline Cloud Deploy untuk layanan dan workload backend, dan terakhir akun layanan serta hak istimewa IAM agar dapat menggunakan layanan tersebut.

Banyak sekali. Namun, untungnya, Terraform dapat menyederhanakan penyiapan ini. Terraform adalah alat "Infrastructure as Code" yang memungkinkan kita menentukan apa yang kita butuhkan untuk project ini dalam serangkaian file '.tf'. Hal ini menyederhanakan penyediaan infrastruktur.

Anda tidak harus memahami Terraform untuk menyelesaikan codelab ini. Namun, jika Anda ingin melihat apa yang dilakukan beberapa langkah berikutnya, Anda dapat melihat semua yang dibuat dalam file ini yang berada di direktori infrastructure:

  • vpc.tf
  • backend_gke.tf
  • spanner.tf
  • artifact_registry.tf
  • pipelines.tf
  • iam.tf

Mengonfigurasi Terraform

Di Cloud Shell, Anda akan berpindah ke direktori infrastructure dan melakukan inisialisasi Terraform:

cd $DEMO_HOME/infrastructure
terraform init

Output perintah

Initializing the backend...

Initializing provider plugins...
*snip*
Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Selanjutnya, konfigurasi Terraform dengan menyalin terraform.tfvars.sample dan mengubah nilai project. Variabel lainnya juga dapat diubah, tetapi project adalah satu-satunya variabel yang harus diubah agar dapat berfungsi dengan lingkungan Anda.

cp  terraform.tfvars.sample terraform.tfvars
# edit gcp_project using the project environment variable
sed -i "s/PROJECT/$GOOGLE_CLOUD_PROJECT/" terraform.tfvars

Menyediakan infrastruktur

Sekarang saatnya menyediakan infrastruktur.

terraform apply
# review the list of things to be created
# type 'yes' when asked

Output perintah

Plan: 46 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

google_project_service.project["container.googleapis.com"]: Creating...
*snip*
Apply complete! Resources: 46 added, 0 changed, 0 destroyed.

Memeriksa apa yang dibuat

Untuk memverifikasi apa yang telah dibuat, Anda harus memeriksa produk di Konsol Cloud.

Cloud Spanner

Pertama, periksa Cloud Spanner dengan membuka menu tiga garis dan mengklik Spanner. Anda mungkin harus mengklik 'Lihat produk lainnya' untuk menemukannya dalam daftar.

Tindakan ini akan mengarahkan Anda ke daftar instance Spanner. Klik instance dan Anda akan melihat database. Ini akan terlihat seperti berikut:

10b7fc0c4a86c59.png

Autopilot GKE

Selanjutnya, lihat GKE dengan membuka menu tiga garis dan mengklik Kubernetes Engine => Clusters. Di sini Anda akan melihat cluster sample-games-gke yang berjalan dalam mode Autopilot.

9cecb1a702e6b7ff.png

Artifact Registry

Sekarang Anda akan melihat tempat penyimpanan gambar. Jadi, klik menu tiga garis dan temukan Artifact Registry=>Repositories. Artifact Registry berada di bagian CI/CD pada menu.

Di sini, Anda akan melihat registry Docker bernama spanner-game-images. Kolom ini akan kosong untuk saat ini.

3f805eee312841b.png

Cloud Deploy

Cloud Deploy adalah tempat pipeline dibuat sehingga Cloud Build dapat menyediakan langkah-langkah untuk membangun image, lalu men-deploy-nya ke cluster GKE kita.

Buka menu tiga garis dan temukan Cloud Deploy, yang juga ada di bagian CI/CD pada menu.

Di sini, Anda akan melihat dua pipeline: satu untuk layanan backend, dan satu untuk workload. Keduanya men-deploy image ke cluster GKE yang sama, tetapi hal ini memungkinkan pemisahan deployment.

d2e4a659145ddf5e.png

IAM

Terakhir, lihat halaman IAM di Cloud Console untuk memverifikasi akun layanan yang dibuat. Buka menu tiga garis dan temukan IAM and Admin=>Service accounts. Ini akan terlihat seperti berikut:

bed3d1af94974916.png

Ada enam total akun layanan yang dibuat oleh Terraform:

  • Akun layanan komputer default. Tidak digunakan dalam codelab ini.
  • Akun cloudbuild-cicd digunakan untuk langkah-langkah Cloud Build dan Cloud Deploy.
  • Empat akun 'aplikasi' yang digunakan oleh layanan backend kami untuk berinteraksi dengan Cloud Spanner.

Selanjutnya, Anda perlu mengonfigurasi kubectl untuk berinteraksi dengan cluster GKE.

Mengonfigurasi kubectl

# Name of GKE cluster from terraform.tfvars file
export GKE_CLUSTER=sample-game-gke 

# get GKE credentials
gcloud container clusters get-credentials $GKE_CLUSTER --region us-central1

# Check that no errors occur
kubectl get serviceaccounts

Output perintah

#export GKE_CLUSTER=sample-game-gke

# gcloud container clusters get-credentials $GKE_CLUSTER --region us-central1
Fetching cluster endpoint and auth data.
kubeconfig entry generated for sample-game-gke.

# kubectl get serviceaccounts
NAME              SECRETS   AGE
default           0         37m
item-app          0         35m
matchmaking-app   0         35m
profile-app       0         35m
tradepost-app     0         35m

Ringkasan

Bagus! Anda dapat menyediakan instance Cloud Spanner, cluster Autopilot GKE, semuanya dalam VPC untuk jaringan pribadi.

Selain itu, dua pipeline Cloud Deploy dibuat untuk layanan backend dan beban kerja, serta repositori Artifact Registry untuk menyimpan image yang dibangun.

Terakhir, akun layanan dibuat dan dikonfigurasi untuk bekerja dengan Workload Identity sehingga layanan backend dapat menggunakan Cloud Spanner.

Anda juga telah mengonfigurasi kubectl untuk berinteraksi dengan cluster GKE di Cloud Shell setelah men-deploy layanan dan workload backend.

Berikutnya

Sebelum Anda dapat menggunakan layanan, skema database harus ditentukan. Anda akan menyiapkannya nanti.

4. Membuat skema database

Ringkasan

Sebelum dapat menjalankan layanan backend, Anda harus memastikan skema database sudah ada.

Jika Anda melihat file di direktori $DEMO_HOME/schema/migrations dari repositori demo, Anda akan melihat serangkaian file .sql yang menentukan skema kita. Hal ini meniru siklus pengembangan yang melacak perubahan skema di repositori itu sendiri, dan dapat dikaitkan dengan fitur tertentu dari aplikasi.

Untuk lingkungan contoh ini, wrench adalah alat yang akan menerapkan migrasi skema menggunakan Cloud Build.

Cloud Build

File $DEMO_HOME/schema/cloudbuild.yaml menjelaskan langkah-langkah yang akan dilakukan:

serviceAccount: projects/${PROJECT_ID}/serviceAccounts/cloudbuild-cicd@${PROJECT_ID}.iam.gserviceaccount.com
steps:
- name: gcr.io/cloud-builders/curl
 id: fetch-wrench
 args: ['-Lo', '/workspace/wrench.tar.gz', 'https://github.com/cloudspannerecosystem/wrench/releases/download/v1.4.1/wrench-1.4.1-linux-amd64.tar.gz' ]

- name: gcr.io/cloud-builders/gcloud
 id: migrate-spanner-schema
 entrypoint: sh
 args:
 - '-xe'
 - '-c'
 - |
   tar -xzvf wrench.tar.gz

   chmod +x /workspace/wrench

   # Assumes only a single spanner instance and database. Fine for this demo in a dedicated project
   export SPANNER_PROJECT_ID=${PROJECT_ID}
   export SPANNER_INSTANCE_ID=$(gcloud spanner instances list | tail -n1 | awk '{print $1}')
   export SPANNER_DATABASE_ID=$(gcloud spanner databases list --instance=$$SPANNER_INSTANCE_ID | tail -n1 | awk '{print $1}')

   if [ -d ./migrations ]; then
     /workspace/wrench migrate up --directory .
   else
     echo "[Error] Missing migrations directory"
   fi
timeout: 600s

Pada dasarnya ada dua langkah:

  • Download wrench ke ruang kerja Cloud Build
  • menjalankan migrasi wrench

Variabel lingkungan project, instance, dan database Spanner diperlukan agar wrench dapat terhubung ke endpoint tulis.

Cloud Build dapat melakukan perubahan ini karena berjalan sebagai akun layanan cloudbuild-cicd@${PROJECT_ID}.iam.gserviceaccount.com:

serviceAccount: projects/${PROJECT_ID}/serviceAccounts/cloudbuild-cicd@${PROJECT_ID}.iam.gserviceaccount.com

Akun layanan ini memiliki peran spanner.databaseUser yang ditambahkan oleh Terraform, yang memungkinkan akun layanan tersebut memperbarui DDL.

Migrasi skema

Ada lima langkah migrasi yang dilakukan berdasarkan file di direktori $DEMO_HOME/schema/migrations. Berikut adalah contoh file 000001.sql yang membuat tabel dan indeks players:

CREATE TABLE players (
   playerUUID STRING(36) NOT NULL,
   player_name STRING(64) NOT NULL,
   email STRING(MAX) NOT NULL,
   password_hash BYTES(60) NOT NULL,
   created TIMESTAMP,
   updated TIMESTAMP,
   stats JSON,
   account_balance NUMERIC NOT NULL DEFAULT (0.00),
   is_logged_in BOOL,
   last_login TIMESTAMP,
   valid_email BOOL,
   current_game STRING(36)
) PRIMARY KEY (playerUUID);

CREATE UNIQUE INDEX PlayerAuthentication ON players(email) STORING(password_hash);
CREATE UNIQUE INDEX PlayerName ON players(player_name);
CREATE INDEX PlayerGame ON players(current_game);

Mengirimkan migrasi skema

Untuk mengirimkan build guna melakukan migrasi skema, beralihlah ke direktori schema dan jalankan perintah gcloud berikut:

cd $DEMO_HOME/schema
gcloud builds submit --config=cloudbuild.yaml

Output perintah

Creating temporary tarball archive of 8 file(s) totalling 11.2 KiB before compression.
Uploading tarball of [.] to [gs://(project)_cloudbuild/source/(snip).tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/(project)/locations/global/builds/7defe982-(snip)].
Logs are available at [ https://console.cloud.google.com/cloud-build/builds/7defe982-(snip)?project=(snip) ].

gcloud builds submit only displays logs from Cloud Storage. To view logs from Cloud Logging, run:
gcloud beta builds submit

ID: 7defe982-(snip)
CREATE_TIME: (created time)
DURATION: 3M11S
SOURCE: gs://(project)_cloudbuild/source/(snip).tgz
IMAGES: -
STATUS: SUCCESS

Pada output di atas, Anda akan melihat link ke proses build cloud Created. Jika Anda mengkliknya, Anda akan diarahkan ke build di Konsol Cloud sehingga Anda dapat memantau progres build dan melihat apa yang sedang dilakukan.

11b1cf107876d797.png

Ringkasan

Pada langkah ini, Anda menggunakan Cloud Build untuk mengirimkan migrasi skema awal yang menerapkan 5 operasi DDL yang berbeda. Operasi ini menunjukkan kapan fitur yang memerlukan perubahan skema database ditambahkan.

Dalam skenario pengembangan normal, Anda ingin membuat perubahan skema yang kompatibel dengan aplikasi saat ini untuk menghindari gangguan.

Untuk perubahan yang tidak kompatibel dengan versi sebelumnya, Anda harus men-deploy perubahan pada aplikasi dan skema secara bertahap untuk memastikan tidak ada gangguan.

Berikutnya

Setelah skema diterapkan, langkah selanjutnya adalah men-deploy layanan backend.

5. Men-deploy layanan backend

Ringkasan

Layanan backend untuk codelab ini adalah REST API golang yang merepresentasikan empat layanan berbeda:

  • Profil: memberi pemain kemampuan untuk mendaftar dan melakukan autentikasi ke "game" contoh kami.
  • Pencocokan: berinteraksi dengan data pemain untuk membantu fungsi pencocokan, melacak informasi tentang game yang dibuat, dan memperbarui statistik pemain saat game ditutup.
  • Item: memungkinkan pemain mendapatkan item dan uang dalam game selama bermain game.
  • Tempat perdagangan: memungkinkan pemain membeli dan menjual item di tempat perdagangan

d36e958411d44b5d.png

Anda dapat mempelajari layanan ini lebih lanjut di codelab Memulai Pengembangan Game dengan Cloud Spanner. Untuk tujuan kami, kami ingin layanan ini berjalan di cluster GKE Autopilot kami.

Layanan ini harus dapat mengubah data Spanner. Untuk melakukannya, setiap layanan memiliki akun layanan yang dibuat yang memberikan peran 'databaseUser' kepada layanan tersebut.

Workload Identity memungkinkan akun layanan Kubernetes meniru identitas akun layanan Google Cloud layanan dengan langkah-langkah berikut di Terraform kami:

  • Buat resource akun layanan Google Cloud (GSA) layanan
  • Tetapkan peran databaseUser ke akun layanan tersebut
  • Tetapkan peran workloadIdentityUser ke akun layanan tersebut
  • Buat akun layanan Kubernetes (KSA) yang mereferensikan GSA

Diagram kasar akan terlihat seperti ini:

a8662d31d66b5910.png

Terraform telah membuat akun layanan dan akun layanan Kubernetes untuk Anda. Anda dapat memeriksa akun layanan Kubernetes menggunakan kubectl:

# kubectl get serviceaccounts
NAME              SECRETS   AGE
default           0         37m
item-app          0         35m
matchmaking-app   0         35m
profile-app       0         35m
tradepost-app     0         35m

Cara kerja build adalah sebagai berikut:

serviceAccount: projects/${PROJECT_ID}/serviceAccounts/cloudbuild-cicd@${PROJECT_ID}.iam.gserviceaccount.com
steps:

#
# Building of images
#
 - name: gcr.io/cloud-builders/docker
   id: profile
   args: ["build", ".", "-t", "${_PROFILE_IMAGE}"]
   dir: profile
   waitFor: ['-']
 - name: gcr.io/cloud-builders/docker
   id: matchmaking
   args: ["build", ".", "-t", "${_MATCHMAKING_IMAGE}"]
   dir: matchmaking
   waitFor: ['-']
 - name: gcr.io/cloud-builders/docker
   id: item
   args: ["build", ".", "-t", "${_ITEM_IMAGE}"]
   dir: item
   waitFor: ['-']
 - name: gcr.io/cloud-builders/docker
   id: tradepost
   args: ["build", ".", "-t", "${_TRADEPOST_IMAGE}"]
   dir: tradepost
   waitFor: ['-']

#
# Deployment
#
 - name: gcr.io/google.com/cloudsdktool/cloud-sdk
   id: cloud-deploy-release
   entrypoint: gcloud
   args:
     [
       "deploy", "releases", "create", "${_REL_NAME}",
       "--delivery-pipeline", "sample-game-services",
       "--skaffold-file", "skaffold.yaml",
       "--skaffold-version", "1.39",
       "--images", "profile=${_PROFILE_IMAGE},matchmaking=${_MATCHMAKING_IMAGE},item=${_ITEM_IMAGE},tradepost=${_TRADEPOST_IMAGE}",
       "--region", "us-central1"
     ]

artifacts:
 images:
   - ${_REGISTRY}/profile
   - ${_REGISTRY}/matchmaking
   - ${_REGISTRY}/item
   - ${_REGISTRY}/tradepost

substitutions:
 _PROFILE_IMAGE: ${_REGISTRY}/profile:${BUILD_ID}
 _MATCHMAKING_IMAGE: ${_REGISTRY}/matchmaking:${BUILD_ID}
 _ITEM_IMAGE: ${_REGISTRY}/item:${BUILD_ID}
 _TRADEPOST_IMAGE: ${_REGISTRY}/tradepost:${BUILD_ID}
 _REGISTRY: us-docker.pkg.dev/${PROJECT_ID}/spanner-game-images
 _REL_NAME: rel-${BUILD_ID:0:8}
options:
 dynamic_substitutions: true
 machineType: E2_HIGHCPU_8
 logging: CLOUD_LOGGING_ONLY
  • Perintah Cloud Build membaca file ini dan mengikuti langkah-langkah yang tercantum. Pertama, image layanan akan dibangun. Kemudian, perintah gcloud deploy create akan dijalankan. Tindakan ini membaca file $DEMO_HOME/backend_services/skaffold.yaml, yang menentukan lokasi setiap file deployment:
apiVersion: skaffold/v2beta29
kind: Config
deploy:
 kubectl:
   manifests:
     - spanner_config.yaml
     - profile/deployment.yaml
     - matchmaking/deployment.yaml
     - item/deployment.yaml
     - tradepost/deployment.yaml
  • Cloud Deploy akan mengikuti definisi file deployment.yaml setiap layanan. File deployment layanan berisi informasi untuk membuat layanan, yang dalam hal ini adalah clusterIP yang berjalan di port 80.

Jenis " ClusterIP" mencegah pod layanan backend memiliki IP eksternal sehingga hanya entitas yang dapat terhubung ke jaringan GKE internal yang dapat mengakses layanan backend. Layanan ini tidak boleh dapat diakses langsung oleh pemain karena layanan ini mengakses dan mengubah data Spanner.

apiVersion: v1
kind: Service
metadata:
 name: profile
spec:
 type: ClusterIP
 selector:
   app: profile
 ports:
 - port: 80
   targetPort: 80

Selain membuat layanan Kubernetes, Cloud Deploy juga membuat deployment Kubernetes. Mari kita periksa bagian deployment layanan profile:

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: profile
spec:
 replicas: 2 # EDIT: Number of instances of deployment
 selector:
   matchLabels:
     app: profile
 template:
   metadata:
     labels:
       app: profile
   spec:
     serviceAccountName: profile-app
     containers:
     - name: profile-service
       image: profile
       ports:
         - containerPort: 80
       envFrom:
         - configMapRef:
             name: spanner-config
       env:
         - name: SERVICE_HOST
           value: "0.0.0.0"
         - name: SERVICE_PORT
           value: "80"
       resources:
         requests:
           cpu: "1"
           memory: "1Gi"
           ephemeral-storage: "100Mi"
         limits:
           cpu: "1"
           memory: "1Gi"
           ephemeral-storage: "100Mi"

Bagian atas memberikan beberapa metadata tentang layanan. Bagian terpenting dari hal ini adalah menentukan jumlah replika yang akan dibuat oleh deployment ini.

replicas: 2 # EDIT: Number of instances of deployment

Selanjutnya, kita melihat akun layanan mana yang harus menjalankan aplikasi, dan gambar mana yang harus digunakan. Ini cocok dengan akun layanan Kubernetes yang dibuat dari Terraform dan image yang dibuat selama langkah Cloud Build.

spec:
  serviceAccountName: profile-app
  containers:
    - name: profile-service
      image: profile

Setelah itu, kita menentukan beberapa informasi tentang jaringan dan variabel lingkungan.

spanner_config adalah ConfigMap Kubernetes yang menentukan informasi project, instance, dan database yang diperlukan agar aplikasi terhubung ke Spanner.

apiVersion: v1
kind: ConfigMap
metadata:
  name: spanner-config
data:
  SPANNER_PROJECT_ID: ${project_id}
  SPANNER_INSTANCE_ID: ${instance_id}
  SPANNER_DATABASE_ID: ${database_id}
ports:
  - containerPort: 80
envFrom:
  - configMapRef:
    name: spanner-config
env:
  - name: SERVICE_HOST
    value: "0.0.0.0"
  - name: SERVICE_PORT
    value: "80"

SERVICE_HOST dan SERVICE_PORT adalah variabel lingkungan tambahan yang diperlukan oleh layanan untuk mengetahui tempat pengikatan.

Bagian terakhir memberi tahu GKE berapa banyak resource yang diizinkan untuk setiap replika dalam deployment ini. Hal ini juga digunakan oleh GKE Autopilot untuk menskalakan cluster sesuai kebutuhan.

resources:
  requests:
    cpu: "1"
    memory: "1Gi"
    ephemeral-storage: "100Mi"
  limits:
    cpu: "1"
    memory: "1Gi"
    ephemeral-storage: "100Mi"

Dengan informasi ini, saatnya men-deploy layanan backend.

Men-deploy layanan backend

Seperti yang disebutkan, deployment layanan backend menggunakan Cloud Build. Sama seperti migrasi skema, Anda dapat mengirimkan permintaan build menggunakan command line gcloud:

cd $DEMO_HOME/backend_services
gcloud builds submit --config=cloudbuild.yaml

Output perintah

Creating temporary tarball archive of 66 file(s) totalling 864.6 KiB before compression.
Uploading tarball of [.] to [gs://(project)_cloudbuild/source/(snip).tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/(project)/locations/global/builds/30207dd1-(snip)].
Logs are available at [ https://console.cloud.google.com/cloud-build/builds/30207dd1-(snip)?project=(snip) ].

gcloud builds submit only displays logs from Cloud Storage. To view logs from Cloud Logging, run:
gcloud beta builds submit

ID: 30207dd1-(snip)
CREATE_TIME: (created time)
DURATION: 3M17S
SOURCE: gs://(project)_cloudbuild/source/(snip).tgz
IMAGES: us-docker.pkg.dev/(project)/spanner-game-images/profile:30207dd1-(snip) (+3 more)
STATUS: SUCCESS

Tidak seperti output langkah schema migration, output build ini menunjukkan bahwa ada beberapa gambar yang dibuat. Image tersebut akan disimpan di repositori Artifact Registry Anda.

Output langkah gcloud build akan memiliki link ke Konsol Cloud. Lihatlah.

Setelah Anda mendapatkan notifikasi keberhasilan dari Cloud Build, buka Cloud Deploy, lalu buka pipeline sample-game-services untuk memantau progres deployment.

df5c6124b9693986.png

Setelah layanan di-deploy, Anda dapat memeriksa kubectl untuk melihat status pod:

kubectl get pods

Output perintah

NAME                           READY   STATUS    RESTARTS   AGE
item-6b9d5f678c-4tbk2          1/1     Running   0          83m
matchmaking-5bcf799b76-lg8zf   1/1     Running   0          80m
profile-565bbf4c65-kphdl       1/1     Running   0          83m
profile-565bbf4c65-xw74j       1/1     Running   0          83m
tradepost-68b87ccd44-gw55r     1/1     Running   0          79m

Kemudian, periksa layanan untuk melihat cara kerja ClusterIP:

kubectl get services

Output perintah

NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
item          ClusterIP   10.172.XXX.XXX   <none>        80/TCP    84m
kubernetes    ClusterIP   10.172.XXX.XXX   <none>        443/TCP   137m
matchmaking   ClusterIP   10.172.XXX.XXX   <none>        80/TCP    84m
profile       ClusterIP   10.172.XXX.XXX   <none>        80/TCP    84m
tradepost     ClusterIP   10.172.XXX.XXX   <none>        80/TCP    84m

Anda juga dapat membuka UI GKE di Cloud Console untuk melihat Workloads, Services, dan ConfigMaps.

Beban kerja

da98979ae49e5a30.png

Layanan

406ca2fe7ad4818b.png

ConfigMaps

a0ebd34ee735ee11.png

3b9ef91c77a4e7f0.png

Ringkasan

Pada langkah ini, Anda telah men-deploy empat layanan backend ke GKE Autopilot. Anda dapat menjalankan langkah Cloud Build dan memeriksa progres di Cloud Deploy dan di Kubernetes di Konsol Cloud.

Anda juga mempelajari cara layanan ini menggunakan Workload Identity untuk meniru identitas akun layanan yang memiliki izin yang tepat untuk membaca dan menulis data ke database Spanner.

Langkah Berikutnya

Di bagian berikutnya, Anda akan men-deploy workload.

6. Men-deploy workload

Ringkasan

Setelah layanan backend berjalan di cluster, Anda akan men-deploy workload.

dd900485e2eeb611.png

Beban kerja dapat diakses secara eksternal, dan ada satu beban kerja untuk setiap layanan backend untuk tujuan codelab ini.

Beban kerja ini adalah skrip pembuatan beban berbasis Locust yang meniru pola akses nyata yang diharapkan oleh layanan contoh ini.

Ada file untuk proses Cloud Build:

  • $DEMO_HOME/workloads/cloudbuild.yaml (dibuat oleh Terraform)
  • $DEMO_HOME/workloads/skaffold.yaml
  • file deployment.yaml untuk setiap beban kerja

File workload deployment.yaml terlihat sedikit berbeda dari file deployment layanan backend.

Berikut contoh dari matchmaking-workload:

apiVersion: v1
kind: Service
metadata:
 name: matchmaking-workload
spec:
 type: LoadBalancer
 selector:
   app: matchmaking-workload
 ports:
 - port: 8089
   targetPort: 8089
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: matchmaking-workload
spec:
 replicas: 1 # EDIT: Number of instances of deployment
 selector:
   matchLabels:
     app: matchmaking-workload
 template:
   metadata:
     labels:
       app: matchmaking-workload
   spec:
     serviceAccountName: default
     containers:
     - name: matchmaking-workload
       image: matchmaking-workload
       ports:
         - containerPort: 8089
       resources:
         requests:
           cpu: "500m"
           memory: "512Mi"
           ephemeral-storage: "100Mi"
         limits:
           cpu: "500m"
           memory: "512Mi"
           ephemeral-storage: "100Mi"

Bagian atas file menentukan layanan. Dalam hal ini, LoadBalancer dibuat, dan workload berjalan di port 8089.

LoadBalancer akan menyediakan IP eksternal yang dapat digunakan untuk terhubung ke beban kerja.

apiVersion: v1
kind: Service
metadata:
 name: matchmaking-workload
spec:
 type: LoadBalancer
 selector:
   app: matchmaking-workload
 ports:
 - port: 8089
   targetPort: 8089

Bagian atas bagian deployment adalah metadata tentang beban kerja. Dalam hal ini, hanya satu replika yang di-deploy:

replicas: 1 

Namun, spesifikasi penampungnya berbeda. Salah satunya, kita menggunakan akun layanan Kubernetes default. Akun ini tidak memiliki hak istimewa khusus, karena beban kerja tidak perlu terhubung ke resource Google Cloud apa pun kecuali layanan backend yang berjalan di cluster GKE.

Perbedaan lainnya adalah tidak ada variabel lingkungan yang diperlukan untuk workload ini. Hasilnya adalah spesifikasi deployment yang lebih singkat.

spec:
  serviceAccountName: default
  containers:
    - name: matchmaking-workload
      image: matchmaking-workload
  ports:
    - containerPort: 8089

Setelan resource mirip dengan layanan backend. Ingatlah bahwa dengan cara inilah GKE Autopilot mengetahui jumlah resource yang diperlukan untuk memenuhi permintaan semua pod yang berjalan di cluster.

Lanjutkan dan deploy workload.

Men-deploy workload

Seperti sebelumnya, Anda dapat mengirimkan permintaan build menggunakan command line gcloud:

cd $DEMO_HOME/workloads
gcloud builds submit --config=cloudbuild.yaml

Output perintah

Creating temporary tarball archive of 18 file(s) totalling 26.2 KiB before compression.
Some files were not included in the source upload.

Check the gcloud log [/tmp/tmp.4Z9EqdPo6d/logs/(snip).log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Uploading tarball of [.] to [gs://(project)_cloudbuild/source/(snip).tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/(project)/locations/global/builds/(snip)].
Logs are available at [ https://console.cloud.google.com/cloud-build/builds/0daf20f6-(snip)?project=(snip) ].

gcloud builds submit only displays logs from Cloud Storage. To view logs from Cloud Logging, run:
gcloud beta builds submit

ID: 0daf20f6-(snip)
CREATE_TIME: (created_time)
DURATION: 1M41S
SOURCE: gs://(project)_cloudbuild/source/(snip).tgz
IMAGES: us-docker.pkg.dev/(project)/spanner-game-images/profile-workload:0daf20f6-(snip) (+4 more)
STATUS: SUCCESS

Pastikan untuk memeriksa log Cloud Build dan pipeline Cloud Deploy di Konsol Cloud untuk memeriksa statusnya. Untuk workload, pipeline Cloud Deploy adalah sample-game-workloads:

Setelah deployment selesai, periksa statusnya dengan kubectl di Cloud Shell:

kubectl get pods

Output perintah

NAME                                    READY   STATUS    RESTARTS   AGE
game-workload-7ff44cb657-pxxq2          1/1     Running   0          12m
item-6b9d5f678c-cr29w                   1/1     Running   0          9m6s
item-generator-7bb4f57cf8-5r85b         1/1     Running   0          12m
matchmaking-5bcf799b76-lg8zf            1/1     Running   0          117m
matchmaking-workload-76df69dbdf-jds9z   1/1     Running   0          12m
profile-565bbf4c65-kphdl                1/1     Running   0          121m
profile-565bbf4c65-xw74j                1/1     Running   0          121m
profile-workload-76d6db675b-kzwng       1/1     Running   0          12m
tradepost-68b87ccd44-gw55r              1/1     Running   0          116m
tradepost-workload-56c55445b5-b5822     1/1     Running   0          12m

Kemudian, periksa layanan workload untuk melihat LoadBalancer beraksi:

kubectl get services 

Output perintah

NAME                   TYPE          CLUSTER-IP  EXTERNAL-IP     PORT(S)        AGE
game-workload          LoadBalancer  *snip*      35.XX.XX.XX   8089:32483/TCP   12m
item                   ClusterIP     *snip*      <none>         80/TCP          121m
item-generator         LoadBalancer  *snip*      34.XX.XX.XX   8089:32581/TCP   12m
kubernetes             ClusterIP     *snip*      <none>          443/TCP        174m
matchmaking            ClusterIP     *snip*      <none>          80/TCP         121m
matchmaking-workload   LoadBalancer  *snip*      34.XX.XX.XX   8089:31735/TCP   12m
profile                ClusterIP     *snip*      <none>          80/TCP         121m
profile-workload       LoadBalancer  *snip*      34.XX.XX.XX   8089:32532/TCP   12m
tradepost              ClusterIP     *snip*      <none>          80/TCP         121m
tradepost-workload     LoadBalancer  *snip*      34.XX.XX.XX   8089:30002/TCP   12m

Ringkasan

Sekarang Anda telah men-deploy workload ke cluster GKE. Beban kerja ini tidak memerlukan izin IAM tambahan dan dapat diakses secara eksternal di port 8089 menggunakan layanan LoadBalancer.

Langkah Berikutnya

Setelah layanan dan beban kerja backend berjalan, saatnya "bermain" game.

7. Mulai bermain game

Ringkasan

Layanan backend untuk "game" contoh Anda kini berjalan, dan Anda juga memiliki cara untuk membuat "pemain" yang berinteraksi dengan layanan tersebut menggunakan beban kerja.

Setiap workload menggunakan Locust untuk menyimulasikan beban aktual terhadap API layanan kami. Pada langkah ini, Anda akan menjalankan beberapa workload untuk menghasilkan beban pada cluster GKE dan Spanner, serta menyimpan data di Spanner.

Berikut deskripsi setiap beban kerja:

  • Workload item-generator adalah workload cepat untuk membuat daftar game_items yang dapat diperoleh pemain selama "bermain" game.
  • profile-workload menyimulasikan pemain yang mendaftar dan login.
  • matchmaking-workload menyimulasikan pemain yang mengantre untuk ditetapkan ke game.
  • game-workload mensimulasikan pemain yang mendapatkan item game dan uang selama bermain game.
  • tradepost-workload mensimulasikan kemampuan pemain untuk menjual dan membeli item di pos perdagangan.

Codelab ini akan secara khusus menyoroti cara menjalankan item-generator dan profile-workload.

Menjalankan item-generator

item-generator menggunakan endpoint layanan backend item untuk menambahkan game_items ke Spanner. Item ini diperlukan agar game-workload dan tradepost-workload berfungsi dengan benar.

Langkah pertama adalah mendapatkan IP eksternal layanan item-generator. Di Cloud Shell, jalankan perintah berikut:

# The external IP is the 4th column of the output
kubectl get services | grep item-generator | awk '{print $4}'

Output perintah

{ITEMGENERATOR_EXTERNAL_IP}

Sekarang, buka tab browser baru dan arahkan ke http://{ITEMGENERATOR_EXTERNAL_IP}:8089. Anda akan melihat halaman seperti ini:

817307157d66c661.png

Anda akan membiarkan users dan spawn pada nilai default 1. Untuk host, masukkan http://item. Klik opsi lanjutan, lalu masukkan 10s untuk waktu berjalan.

Berikut tampilan konfigurasi yang benar:

f3143165c6285c21.png

Klik 'Start swarming'!

Statistik akan mulai ditampilkan untuk permintaan yang dikeluarkan di endpoint POST /items. Setelah 10 detik, pemuatan akan berhenti.

Klik Charts dan Anda akan melihat beberapa grafik tentang performa permintaan ini.

abad0a9f3c165345.png

Sekarang, Anda ingin memeriksa apakah data dimasukkan ke dalam database Spanner.

Untuk melakukannya, klik menu tiga garis dan buka 'Spanner'. Dari halaman ini, buka sample-instance dan sample-database. Kemudian, klik ‘Query'.

Kita ingin memilih jumlah game_items:

SELECT COUNT(*) FROM game_items;

Di bagian bawah, Anda akan mendapatkan hasil.

137ce291a2ff2706.png

Kita tidak perlu banyak game_items yang di-seed. Namun, kini mereka tersedia untuk didapatkan pemain.

Jalankan profile-workload

Setelah game_items Anda di-seed, langkah selanjutnya adalah membuat pemain mendaftar agar dapat bermain game.

profile-workload akan menggunakan Locust untuk menyimulasikan pemain yang membuat akun, login, mengambil informasi profil, dan logout. Semua pengujian ini menguji endpoint layanan backend profile dalam beban kerja yang mirip produksi pada umumnya.

Untuk menjalankannya, dapatkan IP eksternal profile-workload:

# The external IP is the 4th column of the output
kubectl get services | grep profile-workload | awk '{print $4}'

Output perintah

{PROFILEWORKLOAD_EXTERNAL_IP}

Sekarang, buka tab browser baru dan arahkan ke http://{PROFILEWORKLOAD_EXTERNAL_IP}:8089. Anda akan melihat halaman Locust yang mirip dengan halaman sebelumnya.

Dalam hal ini, Anda akan menggunakan http://profile untuk host. Selain itu, Anda tidak akan menentukan runtime di opsi lanjutan. Selain itu, tentukan users menjadi 4, yang akan menyimulasikan 4 permintaan pengguna sekaligus.

Pengujian profile-workload akan terlihat seperti ini:

f6e0f06efb0ad6e.png

Klik 'Start swarming'!

Seperti sebelumnya, statistik untuk berbagai endpoint REST profile akan mulai muncul. Buka diagram untuk melihat performa semua hal.

4c2146e1cb3de23e.png

Ringkasan

Pada langkah ini, Anda membuat beberapa game_items, lalu membuat kueri tabel game_items menggunakan UI Kueri Spanner di Konsol Cloud.

Anda juga mengizinkan pemain untuk mendaftar ke game Anda dan melihat bagaimana Locust dapat membuat beban kerja seperti produksi terhadap layanan backend Anda.

Langkah Berikutnya

Setelah menjalankan workload, Anda harus memeriksa perilaku cluster GKE dan instance Spanner.

8. Meninjau penggunaan GKE dan Spanner

Setelah layanan profil berjalan, saatnya melihat perilaku cluster Autopilot GKE dan Cloud Spanner Anda.

Memeriksa cluster GKE

Buka cluster Kubernetes. Perhatikan bahwa setelah Anda men-deploy workload dan layanan, cluster kini memiliki beberapa detail yang ditambahkan tentang total vCPU dan memori. Informasi ini tidak tersedia saat tidak ada workload di cluster.

61d2d766c1f10079.png

Sekarang, klik cluster sample-game-gke dan beralih ke tab observability:

fa9acc7e26ea04a.png

Namespace default kubernetes seharusnya melampaui namespace kube-system untuk pemanfaatan CPU karena workload dan layanan backend kami berjalan di default. Jika belum, pastikan profile workload masih berjalan dan tunggu beberapa menit hingga diagram diperbarui.

Untuk melihat workload mana yang menggunakan sebagian besar resource, buka dasbor Workloads.

Daripada membuka setiap workload satu per satu, langsung buka tab Observability dasbor. Anda akan melihat bahwa CPU profile dan profile-workload telah meningkat.

f194b618969cfa9e.png

Sekarang, periksa Cloud Spanner.

Periksa instance Cloud Spanner

Untuk memeriksa performa Cloud Spanner, buka Spanner, lalu klik instance sample-instance dan database sample-game.

Dari sana, Anda akan melihat tab Insight Sistem di menu kiri:

216212182a57dfd1.png

Ada banyak diagram di sini untuk membantu Anda memahami performa umum instance Spanner, termasuk CPU utilization, transaction latency and locking, dan query throughput.

Selain System Insights, Anda bisa mendapatkan informasi yang lebih mendetail tentang workload kueri dengan melihat link lain di bagian Observability:

  • Insight kueri membantu mengidentifikasi kueri topN yang menggunakan resource di Spanner.
  • Insight Transaksi dan Penguncian membantu mengidentifikasi transaksi dengan latensi tinggi.
  • Key Visualizer membantu memvisualisasikan pola akses dan dapat membantu melacak hotspot dalam data.

Ringkasan

Pada langkah ini, Anda telah mempelajari cara memeriksa beberapa metrik performa dasar untuk GKE Autopilot dan Spanner.

Misalnya, saat workload profil Anda berjalan, buat kueri tabel players untuk mendapatkan informasi lebih lanjut tentang data yang disimpan di sana.

Langkah Berikutnya

Selanjutnya, saatnya membersihkan!

9. Pembersihan

Sebelum membersihkan, Anda dapat menjelajahi workload lain yang tidak dibahas. Khususnya matchmaking-workload, game-workload, dan tradepost-workload.

Setelah selesai "bermain" game, Anda dapat membersihkan area uji coba. Untungnya, proses ini cukup mudah.

Pertama, jika profile-workload Anda masih berjalan di browser, buka dan hentikan:

13ae755a11f3228.png

Lakukan hal yang sama untuk setiap workload yang mungkin telah Anda uji.

Kemudian di Cloud Shell, buka folder infrastruktur. Anda akan destroy infrastruktur menggunakan terraform:

cd $DEMO_HOME/infrastructure
terraform destroy
# type 'yes' when asked

Output perintah

Plan: 0 to add, 0 to change, 46 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

*snip*

Destroy complete! Resources: 46 destroyed.

Di Konsol Cloud, buka Spanner, Kubernetes Cluster, Artifact Registry, Cloud Deploy, dan IAM untuk memvalidasi bahwa semua resource telah dihapus.

10. Selamat!

Selamat, Anda telah berhasil men-deploy aplikasi golang contoh di GKE Autopilot dan menghubungkannya ke Cloud Spanner menggunakan Workload Identity.

Sebagai bonus, infrastruktur ini dapat disiapkan dan dihapus dengan mudah secara berulang menggunakan Terraform.

Anda dapat membaca lebih lanjut layanan Google Cloud yang Anda gunakan dalam codelab ini:

Apa langkah selanjutnya?

Setelah memiliki pemahaman dasar tentang cara kerja Autopilot GKE dan Cloud Spanner bersama-sama, mengapa tidak mengambil langkah berikutnya dan mulai membangun aplikasi Anda sendiri untuk bekerja dengan layanan ini?