Men-deploy aplikasi Java Spring Boot ke Kubernetes di Google Kubernetes Engine

1. Sebelum memulai

Kubernetes adalah project open source, yang dapat berjalan di berbagai lingkungan, dari laptop hingga cluster multinode dengan ketersediaan tinggi, dari cloud publik hingga deployment lokal, dan dari instance virtual machine (VM) hingga server khusus (bare metal).

Dalam codelab ini, Anda akan men-deploy aplikasi web Spring Boot Java sederhana ke Kubernetes di GKE, dengan tujuan agar Anda dapat menjalankan aplikasi web sebagai aplikasi replika di Kubernetes. Anda akan mengambil kode yang Anda kembangkan di mesin, mengubahnya menjadi image container Docker, dan menjalankan image di GKE.

Anda akan menggunakan GKE, layanan Kubernetes yang terkelola sepenuhnya di Google Cloud, agar Anda dapat lebih berfokus pada pengalaman menggunakan Kubernetes, bukan menyiapkan infrastruktur yang mendasarinya.

Jika tertarik untuk menjalankan Kubernetes di mesin lokal Anda, seperti laptop pengembangan, pelajari Minikube, yang menawarkan penyiapan sederhana cluster Kubernetes node tunggal untuk tujuan pengembangan dan pengujian. Anda dapat menggunakan Minikube untuk membuka codelab jika mau.

Codelab akan menggunakan kode contoh dari panduan tentang Membangun Aplikasi dengan Spring Boot.

Prasyarat

  • Pemahaman tentang bahasa dan alat pemrograman Java
  • Pengetahuan tentang editor teks Linux standar, seperti Vim, Emacs, dan nano

Yang akan Anda lakukan

  • Kemas aplikasi Java sederhana sebagai container Docker.
  • Buat cluster Kubernetes Anda di GKE.
  • Deploy aplikasi Java Anda ke Kubernetes di GKE.
  • Tingkatkan skala layanan Anda dan luncurkan upgrade.
  • Dasbor Akses, antarmuka pengguna Kubernetes berbasis web.

Yang Anda butuhkan

2. Penyiapan dan persyaratan

Penyiapan lingkungan mandiri

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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 mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, 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 tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell 853e55310c205094.pngS.

55efc1aaa7a4d3ad.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

9c92662c6a846a5c.pngS

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

9f0e51b578fecce5.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang diperlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

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

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Mendapatkan kode sumber

Setelah Cloud Shell diluncurkan, Anda dapat menggunakan command line untuk meng-clone kode sumber contoh di direktori beranda.

$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/complete

4. Menjalankan aplikasi secara lokal

  1. Pastikan JAVA_HOME disetel ke versi yang benar:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
  1. Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
  1. Setelah aplikasi dimulai, klik Web Preview 1a94d5bd10bfc072.pngS di toolbar Cloud Shell, lalu pilih Preview on port 8080.

6252b94905f3f7bd.pngS

Tab di browser akan terbuka dan terhubung ke server yang baru saja Anda mulai.

9b6c29059957bd0.jpeg

5. Mengemas aplikasi Java sebagai container Docker

Selanjutnya, Anda perlu menyiapkan aplikasi untuk berjalan di Kubernetes. Langkah pertama adalah menentukan penampung dan kontennya.

  1. Membuat JAR yang dapat di-deploy untuk aplikasi.
$ ./mvnw -DskipTests package
  1. Aktifkan Artifact Registry API untuk menyimpan image container yang akan Anda buat.
$ gcloud services enable artifactregistry.googleapis.com
  1. Buat repositori Docker baru jika belum ada. Anda harus membuat repositori sebelum dapat mengirim image apa pun ke dalamnya:
$ gcloud artifacts repositories create codelabrepo     --repository-format=docker --location=us-central1 
  1. Gambar Anda akan memiliki format:

{LOCATION}-docker.pkg.dev/{PROJECT-ID}/{REPOSITORY}/{IMAGE-NAME}

Misalnya, jika Anda telah membuat repositori di lokasi us-central1 bernama codelabrepo, dan Anda ingin memberi nama gambar hello-java:v1, gambar tersebut akan menjadi:

us-central1-docker.pkg.dev/{PROJECT-ID}/codelabrepo/hello-java:v1

  1. Gunakan Jib untuk membuat image container dan mengirimnya ke Artifact Registry.
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format="value(core.project)"`

$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/codelabrepo/hello-java:v1
  1. Anda akan dapat melihat image container yang tercantum di konsol dengan membuka halaman Image Registry Artifacts di Konsol Cloud. Kini Anda memiliki image Docker di seluruh project yang tersedia, yang dapat diakses dan diorkestrasi oleh Kubernetes seperti yang akan Anda lihat dalam beberapa menit.
  2. (Opsional) Setelah selesai (perlu waktu beberapa saat untuk mendownload dan mengekstrak semuanya), uji image dengan perintah berikut, yang akan menjalankan container Docker sebagai daemon pada port 8080 dari image container yang baru dibuat. Jika Anda mengalami masalah izin, jalankan gcloud auth configure-docker us-central1-docker.pkg.dev terlebih dahulu:
$ docker run -ti --rm -p 8080:8080 \
  us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
  1. Sekali lagi, manfaatkan fitur pratinjau web Cloud Shell.

6252b94905f3f7bd.pngS

  1. Anda akan melihat halaman default di tab baru. Setelah memastikan bahwa aplikasi berjalan secara lokal di container Docker, Anda dapat menghentikan container yang sedang berjalan dengan menekan Control+C.

6. Membuat cluster

Anda siap untuk membuat cluster GKE. Cluster terdiri dari server Kubernetes API yang dikelola oleh Google dan sekumpulan node pekerja. Worker node adalah VM Compute Engine.

  1. Pertama, pastikan fitur API terkait sudah diaktifkan.
$ gcloud services enable compute.googleapis.com container.googleapis.com
  1. Buat cluster dengan dua node n1-standard-1 (perlu waktu beberapa menit untuk menyelesaikannya).
$ gcloud container clusters create hello-java-cluster \
  --num-nodes 2 \
  --machine-type n1-standard-1 \
  --zone us-central1-c

Pada akhirnya, Anda akan melihat cluster yang dibuat.

Creating cluster hello-java-cluster...done.
Created [https://container.googleapis.com/v1/projects/...].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-java-cluster  us-central1-c  ...

Sekarang Anda memiliki cluster Kubernetes yang berfungsi penuh dan didukung oleh GKE.

758c7fca14f70623.pngS

Sekarang saatnya men-deploy aplikasi dalam container ke cluster Kubernetes. Mulai sekarang, Anda akan menggunakan command line kubectl (sudah disiapkan di lingkungan Cloud Shell Anda). Bagian codelab lainnya mengharuskan versi klien dan server Kubernetes menjadi 1.2 atau yang lebih tinggi. kubectl version akan menunjukkan versi perintah saat ini.

7. Men-deploy aplikasi Anda ke Kubernetes

  1. Deployment Kubernetes dapat membuat, mengelola, dan menskalakan beberapa instance aplikasi menggunakan image container yang Anda buat. Deploy satu instance aplikasi Anda ke Kubernetes menggunakan perintah kubectl run.
$ kubectl create deployment hello-java --image=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
  1. Untuk melihat deployment yang Anda buat, cukup jalankan perintah berikut:
$ kubectl get deployments

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   1         1         1            1           37s
  1. Untuk melihat instance aplikasi yang dibuat oleh deployment, jalankan perintah berikut:
$ kubectl get pods

NAME                         READY     STATUS    RESTARTS   AGE
hello-java-714049816-ztzrb   1/1       Running   0          57s

Pada tahap ini, container Anda seharusnya berjalan di bawah kendali Kubernetes, tetapi Anda masih harus membuatnya dapat diakses oleh dunia luar.

8. Izinkan traffic eksternal

Secara default, Pod hanya dapat diakses oleh IP internalnya di dalam cluster. Agar container hello-java dapat diakses dari luar jaringan virtual Kubernetes, Anda harus mengekspos Pod sebagai layanan Kubernetes.

  1. Di Cloud Shell, Anda dapat mengekspos Pod ke internet publik dengan membuat layanan LoadBalancer Kubernetes.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

Perhatikan bahwa Anda secara langsung mengekspos deployment, bukan Pod. Hal ini akan menyebabkan layanan yang dihasilkan melakukan load balancing terhadap traffic di semua Pod yang dikelola oleh deployment (dalam hal ini, hanya satu Pod, tetapi Anda akan menambahkan lebih banyak replika nanti).

Master Kubernetes membuat load balancer dan aturan penerusan Compute Engine, kumpulan target, dan aturan firewall terkait agar layanan dapat diakses sepenuhnya dari luar Google Cloud.

  1. Untuk menemukan alamat IP layanan yang dapat diakses publik, cukup minta kubectl untuk mencantumkan semua layanan cluster.
$ kubectl get services

NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-java   10.3.253.62    aaa.bbb.ccc.ddd  8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m
  1. Kini Anda dapat menjangkau layanan dengan mengarahkan browser ke http://<EXTERNAL_IP>:8080.

9. Meningkatkan skala layanan Anda

Salah satu fitur canggih yang ditawarkan oleh Kubernetes adalah kemudahan untuk menskalakan aplikasi Anda. Misalkan Anda tiba-tiba memerlukan lebih banyak kapasitas untuk aplikasi. Anda cukup memberi tahu pengontrol replikasi untuk mengelola jumlah replika baru untuk instance aplikasi Anda.

$ kubectl scale deployment hello-java --replicas=3

deployment "hello-java" scaled

$ kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   3         3         3            3           22m

Perhatikan pendekatan deklaratif. Daripada memulai atau menghentikan instance baru, Anda harus mendeklarasikan berapa banyak instance yang harus berjalan setiap saat. Loop rekonsiliasi Kubernetes hanya memastikan bahwa realitas sesuai dengan yang Anda minta dan mengambil tindakan, jika diperlukan.

10. Meluncurkan upgrade ke layanan Anda

Pada titik tertentu, aplikasi yang Anda deploy ke produksi akan memerlukan perbaikan bug atau fitur tambahan. Kubernetes dapat membantu Anda men-deploy versi baru ke produksi tanpa memengaruhi pengguna.

  1. Buka editor kode dengan mengklik Open editor 2109d75686c889a.pngSdi menu Cloud Shell.
  2. Buka src/main/java/com/example/springboot/HelloController.java dan perbarui nilai respons.
package com.example.springboot;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Google Kubernetes Engine!";
    }
}
  1. Gunakan Jib untuk membangun dan mengirim image container versi baru. Membangun dan mengirim gambar yang diperbarui akan jauh lebih cepat karena Anda memanfaatkan penyimpanan cache sepenuhnya.
$ ./mvnw -DskipTests package com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2

Anda siap agar Kubernetes mengupdate pengontrol replikasi ke versi baru aplikasi dengan lancar.

  1. Agar dapat mengubah label image untuk container yang sedang berjalan, Anda perlu mengedit deployment hello-java yang ada dan mengubah image dari us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1

ke us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v2

  1. Anda dapat menggunakan perintah kubectl set image untuk meminta Kubernetes men-deploy versi baru aplikasi Anda di seluruh cluster satu instance dalam satu waktu dengan update berkelanjutan.
$ kubectl set image deployment/hello-java hello-java=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2

deployment "hello-java" image updated
  1. Periksa http://EXTERNAL_IP:8080 lagi untuk melihat apakah perintah tersebut menampilkan respons baru.

11. Kembalikan

Maaf. Apakah Anda membuat kesalahan dengan versi baru aplikasi? Mungkin versi baru berisi error dan Anda perlu melakukan roll back dengan cepat. Dengan Kubernetes, Anda dapat melakukan roll back ke status sebelumnya dengan mudah. Roll back aplikasi dengan menjalankan perintah berikut:

$ kubectl rollout undo deployment/hello-java

Anda akan melihat respons lama saat memeriksa http://EXTERNAL_IP:8080 lagi.

12. Selamat

Anda telah mempelajari cara membangun dan men-deploy aplikasi web berbasis Java baru ke Kubernetes di GKE.

Pembersihan

$ gcloud container clusters delete hello-java-cluster --zone us-central1-c

$ gcloud container images delete us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1 us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2

Pelajari lebih lanjut