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

Kubernetes adalah project open source, yang dapat berjalan di berbagai lingkungan, mulai dari laptop hingga cluster multi-node dengan ketersediaan tinggi, dari cloud publik hingga deployment lokal, dan dari instance mesin virtual (VM) hingga server khusus.

Dalam codelab ini, Anda akan men-deploy aplikasi web Java Spring Boot 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 Anda, mengubahnya menjadi gambar container Docker, dan menjalankan gambar di GKE.

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

Jika Anda berminat menjalankan Kubernetes di mesin lokal, seperti laptop pengembangan, coba lihat Minikube, yang menawarkan penyiapan cluster Kubernetes satu node yang sederhana untuk tujuan pengembangan dan pengujian. Anda dapat menggunakan Minikube untuk mengikuti codelab ini jika diinginkan.

Codelab akan menggunakan kode contoh dari panduan tentang Membuat 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.
  • Meningkatkan skala layanan dan meluncurkan upgrade.
  • Dasbor Akses, antarmuka pengguna Kubernetes berbasis web.

Yang Anda butuhkan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)

Ingat project ID, 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.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

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 tetap berjalan.

Pengguna baru Google Cloud memenuhi syarat untuk mendapatkan uji coba gratis senilai$300.

Aktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell .

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

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

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. 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 hanya dengan browser atau Chromebook.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah 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`
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].

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

$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/complete
  1. Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
  1. Setelah aplikasi dimulai, klik Pratinjau Web di toolbar Cloud Shell dan pilih Pratinjau di port 8080.

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

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

  1. Buat JAR yang dapat di-deploy untuk aplikasi.
$ ./mvnw -DskipTests package
  1. Aktifkan Container Registry untuk menyimpan image container yang akan Anda buat.
$ gcloud services enable containerregistry.googleapis.com
  1. Gunakan Jib untuk membuat image container dan menerapkannya ke Container Registry.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Jika semuanya berfungsi dengan baik, Anda akan dapat melihat gambar container yang tercantum di konsol dengan membuka Container Registry > Gambar. Anda kini memiliki image Docker di seluruh project, yang dapat diakses dan diorkestrasi oleh Kubernetes seperti yang akan Anda lihat dalam beberapa menit.
  1. Setelah selesai (perlu waktu beberapa saat untuk mendownload dan mengekstrak semuanya), Anda dapat menguji image secara lokal dengan perintah berikut, yang akan menjalankan container Docker sebagai daemon pada port 8080 dari image container yang baru Anda buat:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Sekali lagi, manfaatkan fitur pratinjau web dari Cloud Shell.

  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.

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

  1. Pertama, pastikan fitur API terkait sudah diaktifkan.
$ gcloud services enable compute.googleapis.com container.googleapis.com
Operation "operations/..." finished successfully
  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 seharusnya memiliki cluster Kubernetes yang berfungsi penuh dan didukung oleh GKE.

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

  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=gcr.io/$GOOGLE_CLOUD_PROJECT/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, Anda harus menjalankan container di bawah kontrol Kubernetes, tetapi Anda masih harus membuatnya dapat diakses oleh dunia luar.

Secara default, Pod hanya dapat diakses berdasarkan IP internalnya 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 perintah kubectl expose yang dikombinasikan dengan flag --type=LoadBalancer. Tanda ini diperlukan untuk pembuatan IP yang dapat diakses secara eksternal.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

Tanda yang digunakan dalam perintah menentukan bahwa Anda akan menggunakan load balancer yang disediakan oleh infrastruktur yang mendasarinya. Perhatikan bahwa Anda mengekspos deployment secara langsung, bukan Pod. Hal ini akan menyebabkan layanan yang dihasilkan memuat traffic seimbang di semua Pod yang dikelola oleh deployment (dalam kasus ini, hanya satu Pod, tetapi Anda akan menambahkan lebih banyak replika nanti).

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

  1. Untuk menemukan alamat IP layanan yang dapat diakses secara 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. Perhatikan bahwa ada dua alamat IP yang tercantum untuk layanan Anda, keduanya menggunakan port 8080. Salah satunya adalah alamat IP internal yang hanya dapat dilihat di dalam Virtual Private Cloud Anda. Kedua, alamat IP dengan load balancing eksternal. Dalam contoh, alamat IP eksternalnya adalah aaa.bbb.ccc.ddd. Sekarang Anda dapat menjangkau layanan dengan mengarahkan browser ke http://<EXTERNAL_IP>:8080.

Salah satu fitur canggih yang ditawarkan oleh Kubernetes adalah mudahnya menskalakan aplikasi Anda. Anggaplah Anda tiba-tiba membutuhkan kapasitas lebih besar untuk aplikasi. Anda bisa 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. Alih-alih memulai atau menghentikan instance baru, Anda harus mendeklarasikan berapa banyak instance yang harus dijalankan setiap saat. Loop rekonsiliasi Kubernetes memastikan bahwa realitas tersebut sesuai dengan apa yang Anda minta dan mengambil tindakan, jika diperlukan.

Pada tahap 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 Luncurkan editor di menu Cloud Shell.
  2. Buka src/main/java/hello/HelloController.java dan perbarui nilai respons.
package hello;

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. Menggunakan Jib untuk mem-build dan mengirim versi baru image container.
$ ./mvnw -DskipTests package \
  com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

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

  1. Untuk mengubah label image untuk container yang sedang berjalan, Anda harus mengedit deployment hello-java yang ada dan mengubah image dari gcr.io/PROJECT_ID/hello-java:v1 menjadi gcr.io/PROJECT_ID/hello-java:v2.
  1. Anda dapat menggunakan perintah kubectl set image untuk meminta Kubernetes men-deploy versi baru aplikasi di seluruh cluster satu per satu dengan update berkelanjutan.
$ kubectl set image deployment/hello-java \
  hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

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

Maaf. Apakah Anda membuat kesalahan dengan versi baru aplikasi? Mungkin versi baru ini berisi error dan Anda harus segera mengembalikannya. Dengan Kubernetes, Anda dapat dengan mudah mengembalikannya ke status sebelumnya. Roll back aplikasi dengan menjalankan perintah berikut:

$ kubectl rollout undo deployment/hello-java

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

Pelajari lebih lanjut