1. Sebelum memulai
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 dasarnya.
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.
- Mengakses Dasbor, antarmuka pengguna Kubernetes berbasis web.
Yang Anda butuhkan
- Project Google Cloud
- Browser, seperti Google Chrome
2. Penyiapan dan persyaratan
Penyiapan lingkungan mandiri
- 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.



- 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.
- 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
- Dari Cloud Console, klik Aktifkan Cloud Shell
.

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

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

Virtual machine ini dilengkapi dengan semua alat pengembangan yang diperlukan. VM 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 telah ditetapkan ke project ID Anda.
- 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`
- 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 utama.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
4. Menjalankan aplikasi secara lokal
- Pastikan JAVA_HOME disetel ke versi yang benar:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
- Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
- 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.

5. Mengemas aplikasi Java sebagai container Docker
Selanjutnya, Anda perlu menyiapkan aplikasi untuk dijalankan di Kubernetes. Langkah pertama adalah menentukan penampung dan isinya.
- Buat JAR yang dapat di-deploy untuk aplikasi.
$ ./mvnw -DskipTests package
- Aktifkan Artifact Registry API untuk menyimpan image container yang akan Anda buat.
$ gcloud services enable artifactregistry.googleapis.com
- 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
- 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 image Anda hello-java:v1, image tersebut akan menjadi:
us-central1-docker.pkg.dev/{PROJECT-ID}/codelabrepo/hello-java:v1
- Gunakan Jib untuk membuat image container dan mengirimkannya 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
- Anda akan dapat melihat image container yang tercantum di konsol dengan membuka halaman Artifact Registry Images di Konsol Cloud. Sekarang Anda memiliki image Docker yang tersedia di seluruh project, yang dapat diakses dan diatur oleh Kubernetes seperti yang akan Anda lihat dalam beberapa menit.
- (Opsional) Setelah selesai (perlu waktu beberapa saat untuk mendownload dan mengekstrak semuanya), uji image dengan perintah berikut, yang akan menjalankan container Docker sebagai daemon di port 8080 dari image container yang baru dibuat. Jika Anda mengalami masalah izin, jalankan
gcloud auth configure-dockerus-central1-docker.pkg.devterlebih dahulu:
$ docker run -ti --rm -p 8080:8080 \ us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
- Sekali lagi, manfaatkan fitur pratinjau web Cloud Shell.

- 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.
6. Buat cluster Anda
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.
- Pertama, pastikan fitur API terkait diaktifkan.
$ gcloud services enable compute.googleapis.com container.googleapis.com
- 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.
7. Men-deploy aplikasi Anda ke Kubernetes
- 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=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
- 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
- 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.
8. Mengizinkan 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.
- 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 mengekspos deployment secara langsung, bukan Pod. Tindakan 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 Compute Engine, kumpulan target, dan aturan firewall terkait agar layanan dapat diakses sepenuhnya dari luar Google Cloud.
- Untuk menemukan alamat IP layanan yang dapat diakses secara publik, cukup minta
kubectluntuk 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
- Sekarang Anda seharusnya dapat mengakses layanan dengan mengarahkan browser ke
http://<EXTERNAL_IP>:8080.
9. Menskalakan layanan Anda
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 mendeklarasikan jumlah instance yang harus berjalan setiap saat. Loop rekonsiliasi Kubernetes hanya memastikan bahwa kenyataan sesuai dengan yang Anda minta dan mengambil tindakan, jika diperlukan.
10. Meluncurkan upgrade ke layanan Anda
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.
- Buka editor kode dengan mengklik Open editor
di menu Cloud Shell. - Buka
src/main/java/com/example/springboot/HelloController.javadan 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!";
}
}
- Gunakan Jib untuk membangun dan mengirim versi baru image container. Membangun dan mengirim image yang diupdate akan jauh lebih cepat karena Anda memanfaatkan sepenuhnya penyimpanan dalam cache.
$ ./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 replication controller Anda dengan lancar ke versi baru aplikasi.
- Untuk mengubah label gambar pada container yang sedang berjalan, Anda harus mengedit deployment
hello-javayang ada dan mengubah gambar darius-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1
ke us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v2
- Anda dapat menggunakan perintah
kubectl set imageuntuk 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=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2 deployment "hello-java" image updated
- Periksa
http://EXTERNAL_IP:8080lagi untuk melihat bahwa fungsi tersebut menampilkan respons baru.
11. Roll back
Maaf. Apakah Anda melakukan kesalahan dengan aplikasi versi baru? Mungkin versi baru berisi error dan Anda perlu mengembalikannya dengan cepat. Dengan Kubernetes, Anda dapat melakukan roll back ke status sebelumnya dengan mudah. Rollback aplikasi dengan menjalankan perintah berikut:
$ kubectl rollout undo deployment/hello-java
Anda akan melihat respons lama saat Anda memeriksa http://EXTERNAL_IP:8080 lagi.
12. Selamat
Anda telah mempelajari cara mem-build 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