Men-deploy aplikasi web dalam container


Tutorial ini menunjukkan cara memaketkan aplikasi web di image container Docker, dan menjalankan image container tersebut di cluster Google Kubernetes Engine (GKE). Kemudian, Anda akan men-deploy aplikasi web itu sebagai set replika yang di-load balance yang dapat diskalakan sesuai kebutuhan pengguna Anda.

Tujuan

  • Memaketkan aplikasi web contoh ke dalam image Docker.
  • Mengupload image Docker ke Artifact Registry.
  • Membuat cluster GKE.
  • Men-deploy aplikasi contoh ke cluster.
  • Mengelola penskalaan otomatis untuk deployment.
  • Mengekspos aplikasi contoh ke internet.
  • Men-deploy aplikasi contoh versi baru.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the Compute Engine, Artifact Registry, and Google Kubernetes Engine APIs.

    Enable the APIs

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Enable the Compute Engine, Artifact Registry, and Google Kubernetes Engine APIs.

    Enable the APIs

Mengaktifkan Cloud Shell

Cloud Shell telah diinstal dengan alat command line gcloud, docker, dan kubectl yang digunakan dalam tutorial ini.

  1. Buka Konsol Google Cloud.
  2. Klik tombol Activate Cloud Shell Tombol Activate Shell di bagian atas jendela Konsol Google Cloud.

    Sesi Cloud Shell akan terbuka di dalam frame baru di bagian bawah Konsol Google Cloud dan menampilkan prompt command line.

    Sesi Cloud Shell

Membuat repositori

Dalam tutorial ini, Anda akan menyimpan image di Artifact Registry dan men-deploy-nya dari registry. Untuk panduan memulai ini, Anda akan membuat repositori bernama hello-repo.

  1. Tetapkan variabel lingkungan PROJECT_ID ke project ID Google Cloud (PROJECT_ID) Anda. Anda akan menggunakan variabel lingkungan ini saat membangun image container dan mengirimkannya ke repositori.

    export PROJECT_ID=PROJECT_ID
    
  2. Pastikan variabel lingkungan PROJECT_ID memiliki nilai yang benar:

    echo $PROJECT_ID
    
  3. Tetapkan project ID Anda untuk Google Cloud CLI:

    gcloud config set project $PROJECT_ID
    

    Output:

    Updated property [core/project].
    
  4. Buat repositori hello-repo dengan perintah berikut:

    gcloud artifacts repositories create hello-repo \
       --repository-format=docker \
       --location=REGION \
       --description="Docker repository"
    

    Ganti REGION dengan region repositori, seperti us-west1. Untuk melihat daftar lokasi yang tersedia, jalankan perintah:

     gcloud artifacts locations list
    

Membuat image container

Dalam tutorial ini, Anda akan men-deploy contoh aplikasi web yang disebut hello-app, sebuah server web yang ditulis di Go yang merespons semua permintaan dengan pesan Hello, World! di port 8080.

GKE menerima image Docker sebagai format deployment aplikasi. Sebelum men-deploy hello-app ke GKE, Anda harus memaketkan kode sumber hello-app sebagai image Docker.

Untuk membuat image Docker, Anda memerlukan kode sumber dan Dockerfile. Dockerfile berisi petunjuk cara membuat image.

  1. Download kode sumber hello-app dan Dockerfile dengan menjalankan perintah berikut:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/quickstarts/hello-app
    
  2. Buat image Docker dan beri tag untuk hello-app:

    docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .
    

    Perintah ini menginstruksikan Docker untuk membuat image menggunakan Dockerfile di direktori saat ini, menyimpannya ke lingkungan lokal, dan memberinya tag dengan nama, misalnya us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1. Image ini akan dikirim ke Artifact Registry di bagian berikutnya.

    • Variabel PROJECT_ID mengaitkan image container dengan repositori hello-repo di project Google Cloud Anda.
    • Awalan us-west1-docker.pkg.dev mengacu pada Artifact Registry, host regional untuk repositori Anda.
  3. Jalankan perintah docker images untuk memverifikasi bahwa build berhasil:

    docker images
    

    Output:

    REPOSITORY                                                 TAG     IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/my-project/hello-repo/hello-app    v1      25cfadb1bf28   10 seconds ago   54 MB
    
  4. Tambahkan binding kebijakan IAM ke akun layanan Anda:

    gcloud artifacts repositories add-iam-policy-binding hello-repo \
        --location=REGION \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role="roles/artifactregistry.reader"
    

    Ganti PROJECT_NUMBER dengan nomor project untuk project Anda.

Menjalankan container secara lokal (opsional)

  1. Uji image container Anda menggunakan mesin Docker lokal:

    docker run --rm -p 8080:8080 REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
    
  2. Klik tombol Web Preview Tombol Web Preview, lalu pilih nomor port 8080. GKE akan membuka URL pratinjau pada layanan proxy-nya di jendela browser baru.

Mengirim image Docker ke Artifact Registry

Anda harus mengupload image container ke registry agar cluster GKE dapat mendownload dan menjalankan image container tersebut. Dalam tutorial ini, Anda akan menyimpan container di Artifact Registry.

  1. Konfigurasi alat command line Docker untuk melakukan autentikasi ke Artifact Registry:

    gcloud auth configure-docker REGION-docker.pkg.dev
    
  2. Kirim image Docker yang baru saja Anda buat ke repositori:

    docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
    

Membuat cluster GKE

Setelah image Docker disimpan di Artifact Registry, buat cluster GKE untuk menjalankan hello-app. Cluster GKE terdiri atas kumpulan instance VM Compute Engine yang menjalankan Kubernetes, sistem orkestrasi cluster open source yang mendukung GKE.

Cloud Shell

  1. Tetapkan region Compute Engine Anda:

     gcloud config set compute/region REGION
    

    Untuk cluster zona Standard, tetapkan zona Compute Engine yang terdekat dengan repositori Artifact Registry.

  2. Buat cluster bernama hello-cluster:

     gcloud container clusters create-auto hello-cluster
    

    Perlu waktu beberapa menit untuk membuat cluster GKE dan memeriksa kondisinya. Untuk menjalankan tutorial ini di cluster GKE Standard, gunakan perintah gcloud container clusters create.

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Create.

  3. Untuk GKE Autopilot, klik Configure.

  4. Di kolom Name, masukkan nama hello-cluster.

  5. Pilih region Compute Engine dari menu drop-down Region, misalnya us-west1.

  6. Klik Create.

  7. Tunggu hingga cluster selesai dibuat. Jika cluster sudah siap, tanda centang akan muncul di samping nama cluster tersebut.

Men-deploy aplikasi contoh ke GKE

Sekarang Anda siap men-deploy image Docker yang telah dibuat ke cluster GKE.

Kubernetes merepresentasikan aplikasi sebagai Pod, yakni unit skalabel yang menampung satu atau beberapa container. Pod adalah unit terkecil yang dapat di-deploy di Kubernetes. Biasanya, Anda men-deploy Pod sebagai serangkaian replika yang dapat diskalakan dan didistribusikan bersama-sama di seluruh cluster. Salah satu cara untuk men-deploy set replika adalah melalui Deployment Kubernetes.

Di bagian ini, Anda akan membuat Deployment Kubernetes untuk menjalankan hello-app di cluster Anda. Deployment ini memiliki replika (Pod). Satu Pod Deployment hanya berisi satu container: image Docker hello-app. Anda juga akan membuat resource HorizontalPodAutoscaler yang menskalakan jumlah Pod dari 3 menjadi angka antara 1 dan 5, berdasarkan beban CPU.

Cloud Shell

  1. Pastikan Anda terhubung ke cluster GKE.

    gcloud container clusters get-credentials hello-cluster --region REGION
    
  2. Buat Deployment Kubernetes untuk image Docker hello-app Anda.

    kubectl create deployment hello-app --image=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
    
  3. Tetapkan baseline replika Deployment ke 3.

    kubectl scale deployment hello-app --replicas=3
    
  4. Buat resource HorizontalPodAutoscaler untuk Deployment Anda.

    kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5
    
  5. Untuk melihat Pod yang dibuat, jalankan perintah berikut:

    kubectl get pods
    

    Output:

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-784d7569bc-hgmpx   1/1     Running   0          90s
    hello-app-784d7569bc-jfkz5   1/1     Running   0          90s
    hello-app-784d7569bc-mnrrl   1/1     Running   0          95s
    

Konsol

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workloads

  2. Klik Deploy.

  3. Di bagian Specify container, pilih Existing container image.

  4. Di kolom Image path, klik Select.

  5. Di panel Select container image, pilih image hello-app yang Anda kirim ke Artifact Registry, lalu klik Select.

  6. Di bagian Container, klik Done, lalu klik Continue.

  7. Di bagian Configuration, di bawah Labels, masukkan app untuk Key dan hello-app untuk Value.

  8. Di bagian Configuration YAML, klik View YAML. Tindakan ini akan membuka file konfigurasi YAML yang menampilkan dua resource Kubernetes API yang akan di-deploy ke cluster: satu Deployment, dan satu HorizontalPodAutoscaler untuk Deployment tersebut.

  9. Klik Close, lalu klik Deploy.

  10. Setelah Pod Deployment siap, halaman Deployment details akan terbuka.

  11. Di bagian Managed pods, perhatikan tiga Pod yang berjalan untuk Deployment hello-app.

Mengekspos aplikasi contoh ke internet

Meskipun Pod memiliki alamat IP yang ditetapkan secara individual, IP tersebut hanya dapat dijangkau dari dalam cluster. Selain itu, Pod GKE dirancang agar bersifat efemeral, yang mulai atau berhenti berdasarkan kebutuhan penskalaan. Dan saat Pod tidak bekerja akibat adanya error, GKE otomatis men-deploy ulang Pod tersebut, dengan menetapkan alamat IP Pod baru setiap kali error terjadi.

Hal ini berarti bahwa untuk Deployment apa pun, kumpulan alamat IP yang terkait dengan kumpulan Pod aktif bersifat dinamis. Kita memerlukan cara untuk 1) mengelompokkan Pod ke dalam satu nama host statis, dan 2) mengekspos sekelompok Pod di luar cluster ke internet.

Service Kubernetes mengatasi kedua masalah ini. Service mengelompokkan Pod ke dalam satu alamat IP statis, yang dapat dijangkau dari Pod mana pun di dalam cluster. GKE juga menetapkan nama host DNS ke IP statis tersebut. Contoh, hello-app.default.svc.cluster.local

Jenis Service default di GKE disebut ClusterIP, di mana Service mendapatkan alamat IP yang hanya dapat dijangkau dari dalam cluster. Untuk mengekspos Service Kubernetes di luar cluster, buat Service dengan jenis LoadBalancer. Jenis Service ini menghasilkan IP Load Balancer Eksternal untuk sekumpulan Pod yang dapat dijangkau melalui internet.

Di bagian ini, Anda akan mengekspos Deployment hello-app ke internet menggunakan Service jenis LoadBalancer.

Cloud Shell

  1. Gunakan perintah kubectl expose untuk membuat Service Kubernetes untuk deployment hello-app:

    kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080
    

    Di sini, flag --port menentukan nomor port yang dikonfigurasi di Load Balancer, sedangkan flag --target-port menentukan nomor port yang diproses oleh container hello-app.

  2. Jalankan perintah berikut guna mendapatkan detail Service untuk hello-app-service:

    kubectl get service
    

    Output:

    NAME                 CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
    hello-app-service    10.3.251.122    203.0.113.0     80:30877/TCP     10s
    
  3. Salin alamat EXTERNAL_IP ke papan klip (misalnya: 203.0.113.0).

Konsol

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workloads

  2. Klik hello-app.

  3. Dari halaman detail Deployment, klik Tindakan > Ekspos.

  4. Dalam dialog Expose, tetapkan Target port ke 8080. Ini adalah port yang diproses container hello-app.

  5. Dari menu drop-down Service type, pilih Load balancer.

  6. Klik Explore guna membuat Service Kubernetes untuk hello-app.

  7. Jika Load Balancer sudah siap, halaman Service details akan terbuka.

  8. Scroll ke bawah ke kolom External endpoints, lalu salin alamat IP.

Setelah Pod hello-app terekspos ke internet melalui Service Kubernetes, Anda dapat membuka tab browser baru dan menuju ke alamat IP Service yang telah Anda salin ke papan klip. Pesan Hello, World! akan muncul, beserta kolom Hostname. Hostname sesuai dengan salah satu dari ketiga Pod hello-app yang menyalurkan permintaan HTTP Anda ke browser.

Men-deploy aplikasi contoh versi baru

Di bagian ini, Anda akan mengupgrade hello-app ke versi baru dengan membuat dan men-deploy image Docker baru ke cluster GKE.

Fitur update berkelanjutan GKE memungkinkan Anda mengupdate Deployment tanpa periode nonaktif. Selama update berkelanjutan, cluster GKE Anda secara bertahap mengganti Pod hello-app yang ada dengan Pod yang berisi image Docker untuk versi baru. Selama update, layanan load balancer hanya merutekan traffic ke Pod yang tersedia.

  1. Kembali ke Cloud Shell, tempat Anda telah meng-clone kode sumber hello-app dan Dockerfile. Update fungsi hello() dalam file main.go untuk melaporkan versi baru 2.0.0.

  2. Buat dan beri tag image Docker hello-app yang baru.

    docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .
    
  3. Kirim image ke Artifact Registry.

    docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
    

Sekarang Anda siap mengupdate Deployment Kubernetes hello-app untuk menggunakan image Docker baru.

Cloud Shell

  1. Terapkan update berkelanjutan ke Deployment hello-app yang ada dengan update image menggunakan perintah kubectl set image:

    kubectl set image deployment/hello-app hello-app=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
    
  2. Lihat Pod aktif yang menjalankan image v1 berhenti, dan Pod baru yang menjalankan image v2 dimulai.

    watch kubectl get pods
    

    Output:

    NAME                        READY   STATUS    RESTARTS   AGE
    hello-app-89dc45f48-5bzqp   1/1     Running   0          2m42s
    hello-app-89dc45f48-scm66   1/1     Running   0          2m40s
    
  3. Di tab terpisah, buka kembali IP Eksternal hello-app-service. Sekarang Anda akan melihat Version ditetapkan ke 2.0.0.

Konsol

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workloads

  2. Klik hello-app.

  3. Di halaman Deployment details, klik Actions > Rolling update.

  4. Pada dialog Rolling update, tetapkan kolom Image of hello-app ke REGION-docker.pkg.dev/PROJECT_ID/hello-repo/hello-app:v2.

  5. Klik Update.

  6. Di halaman Deployment details, periksa bagian Active Revisions. Sekarang Anda akan melihat dua Revisi, 1 dan 2. Revisi 1 terkait dengan Deployment awal yang Anda buat sebelumnya. Revisi 2 adalah update berkelanjutan yang baru saja Anda mulai.

  7. Setelah beberapa saat, muat ulang halaman. Di bawah Managed pods, semua replika hello-app kini terkait dengan Revisi 2.

  8. Di tab terpisah, buka lagi alamat IP Service yang tadi Anda salin. Version harus 2.0.0..

Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus resource satu per satu.

  1. Menghapus Layanan: Tindakan ini akan membatalkan alokasi Cloud Load Balancer yang dibuat untuk Layanan Anda:

    kubectl delete service hello-app-service
    
  2. Menghapus cluster: Tindakan ini akan menghapus resource yang membentuk cluster, seperti instance komputasi, disk, dan resource jaringan:

    gcloud container clusters delete hello-cluster --region REGION
    
  3. Menghapus image container: Tindakan ini akan menghapus image Docker yang Anda kirim ke Artifact Registry.

    gcloud artifacts docker images delete \
        REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 \
        --delete-tags --quiet
    gcloud artifacts docker images delete \
        REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 \
        --delete-tags --quiet
    

Langkah selanjutnya

Cobalah sendiri

Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa GKE dalam skenario dunia nyata. Pelanggan baru mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.

Coba GKE gratis