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 virtual machine (VM) hingga server khusus (bare metal).

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 yang direplikasi di Kubernetes. Anda akan mengambil kode yang dikembangkan di komputer, mengubahnya menjadi image container Docker, dan menjalankan image tersebut di GKE.

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

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

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

Prasyarat

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

Yang akan Anda lakukan

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

Yang Anda butuhkan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console lalu 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 Konsol Cloud untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam 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.

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

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Activate 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 Web Preview di toolbar Cloud Shell, lalu pilih Preview on port 8080.

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

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

  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 mengirimkannya 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 berjalan lancar, Anda akan dapat melihat image container yang tercantum di konsol dengan membuka Container Registry > Images. Sekarang Anda memiliki image Docker di seluruh project yang tersedia, yang dapat diakses dan diatur 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 di port 8080 dari image container yang baru dibuat:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Sekali lagi, manfaatkan fitur pratinjau web Cloud Shell.

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

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

  1. Pertama, pastikan fitur API terkait diaktifkan.
$ gcloud services enable compute.googleapis.com container.googleapis.com
Operation "operations/..." finished successfully
  1. Buat cluster dengan dua node n1-standard-1 (proses ini akan memerlukan waktu beberapa menit).
$ 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 akan memiliki cluster Kubernetes yang berfungsi penuh dan didukung oleh GKE.

Sekarang saatnya men-deploy aplikasi dalam container ke cluster Kubernetes. Mulai sekarang, Anda akan menggunakan command line kubectl (yang sudah disiapkan di lingkungan Cloud Shell Anda). Bagian codelab lainnya memerlukan versi klien dan server 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 Anda 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 akan menjalankan container di bawah kontrol Kubernetes, tetapi Anda masih harus membuatnya dapat diakses oleh dunia luar.

Secara default, Pod hanya dapat diakses oleh IP internalnya di dalam cluster. Agar penampung 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. Flag ini diperlukan untuk pembuatan IP yang dapat diakses secara eksternal.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

Flag yang digunakan dalam perintah menentukan bahwa Anda akan menggunakan load balancer yang disediakan oleh infrastruktur pokok. Perhatikan bahwa Anda mengekspos deployment secara langsung, bukan Pod. Hal ini akan menyebabkan layanan yang dihasilkan menyeimbangkan beban 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, kumpulan target, dan aturan firewall Compute Engine terkait untuk membuat layanan dapat diakses sepenuhnya 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 melayani port 8080. Salah satunya adalah alamat IP internal yang hanya dapat dilihat di dalam Virtual Private Cloud Anda. Yang lainnya adalah alamat IP eksternal yang di-load balance. Dalam contoh ini, alamat IP eksternal adalah aaa.bbb.ccc.ddd. Sekarang Anda dapat mengakses layanan dengan mengarahkan browser ke http://<EXTERNAL_IP>:8080.

Salah satu fitur canggih yang ditawarkan oleh Kubernetes adalah kemudahan menskalakan aplikasi Anda. Misalkan Anda tiba-tiba memerlukan lebih banyak kapasitas untuk aplikasi Anda. Anda cukup memberi tahu replication controller untuk mengelola sejumlah 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 menyatakan berapa banyak instance yang harus berjalan setiap saat. Loop rekonsiliasi Kubernetes hanya memastikan bahwa kenyataan sesuai dengan yang Anda minta dan mengambil tindakan, jika diperlukan.

Pada suatu saat, 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 Launch 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. Gunakan Jib untuk membangun 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 agar Kubernetes mengupdate replication controller dengan lancar ke aplikasi versi baru.

  1. Untuk mengubah label gambar pada container yang sedang berjalan, Anda harus mengedit deployment hello-java yang ada dan mengubah gambar 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 Anda di seluruh cluster satu instance dalam satu waktu dengan update bertahap.
$ kubectl set image deployment/hello-java \
  hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

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

Maaf. Apakah Anda melakukan kesalahan dengan aplikasi versi baru? Mungkin versi baru berisi error dan Anda perlu melakukan roll back dengan cepat. Dengan Kubernetes, Anda dapat dengan mudah melakukan roll back 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 baru ke Kubernetes di GKE.

Pelajari lebih lanjut