Google Kubernetes Engine'de Kubernetes'e bir Spring Boot Java uygulaması dağıtma

1. Başlamadan önce

Kubernetes, dizüstü bilgisayarlardan yüksek kullanılabilirliğe sahip çok düğümlü kümelere, herkese açık bulutlardan şirket içi dağıtımlara ve sanal makine örneklerinden çıplak makineye kadar birçok farklı ortamda çalışabilen açık kaynaklı bir projedir.

Bu codelab'de, GKE'de Kubernetes'e basit bir Spring Boot Java web uygulaması dağıtacaksınız. Amacınız, web uygulamanızı Kubernetes'te kopyalanmış bir uygulama olarak çalıştırmaktır. Makinenizde geliştirdiğiniz kodu alıp Docker container görüntüsüne dönüştürecek ve görüntüyü GKE'de çalıştıracaksınız.

Google Cloud'da tümüyle yönetilen bir Kubernetes hizmeti olan GKE'yi kullanarak temel altyapıyı kurmak yerine Kubernetes deneyimine daha fazla odaklanabilirsiniz.

Kubernetes'i geliştirme dizüstü bilgisayar gibi yerel makinenizde çalıştırmak istiyorsanız geliştirme ve test amacıyla tek düğümlü Kubernetes kümesinin basit kurulumunu sunan Minikube'yi inceleyin. İsterseniz codelab'de ilerlemek için Minikube'yi kullanabilirsiniz.

Codelab, Spring Boot ile Uygulama Oluşturma konulu kılavuzdaki örnek kodu kullanır.

Ön koşullar

  • Java programlama dili ve araçları hakkında bilgi
  • Vim, Emacs ve nano gibi standart Linux metin düzenleyicileri hakkında bilgi

Yapacaklarınız

  • Basit bir Java uygulamasını Docker container'ı olarak paketleyin.
  • GKE'de Kubernetes kümenizi oluşturun.
  • Java uygulamanızı GKE'de Kubernetes'e dağıtın.
  • Hizmetinizin ölçeğini artırın ve bir yükseltmeyi kullanıma sunun.
  • Web tabanlı Kubernetes kullanıcı arayüzü olan Kontrol Paneli'ne erişin.

Gerekenler

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Kaynak kodu al

Cloud Shell başlatıldıktan sonra, ana dizindeki örnek kaynak kodunu klonlamak için komut satırını kullanabilirsiniz.

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

4. Uygulamayı yerel olarak çalıştırma

  1. JAVA_HOME öğesinin doğru sürüme ayarlandığından emin olun:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
  1. Spring Boot uygulamasını, Spring Boot eklentisiyle normal bir şekilde başlatabilirsiniz.
$ ./mvnw -DskipTests spring-boot:run
  1. Uygulama başladıktan sonra Cloud Shell araç çubuğunda Web Önizlemesi'ni 1a94d5bd10bfc072.png tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.

6252b94905f3f7bd.png

Tarayıcınızda bir sekme açılır ve yeni başlattığınız sunucuya bağlanır.

9b6c29059957bd0.jpeg

5. Java uygulamasını Docker container'ı olarak paketleme

Şimdi, uygulamanızı Kubernetes'te çalışacak şekilde hazırlamanız gerekiyor. İlk adım, kapsayıcıyı ve içeriğini tanımlamaktır.

  1. Uygulama için dağıtılabilir JAR dosyasını oluşturun.
$ ./mvnw -DskipTests package
  1. Oluşturacağınız container görüntüsünü depolamak için Artifact Registry API'yi etkinleştirin.
$ gcloud services enable artifactregistry.googleapis.com
  1. Docker deposu yoksa yeni bir Docker deposu oluşturun. Herhangi bir görüntüyü aktarmadan önce depo oluşturmanız gerekir:
$ gcloud artifacts repositories create codelabrepo     --repository-format=docker --location=us-central1 
  1. Resminiz şu biçimde olacaktır:

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

Örneğin, depoyu us-central1 konumunda codelabrepo adlı şekilde oluşturduysanız ve görüntünüzü hello-java:v1 olarak adlandırmak istiyorsanız görüntü şu şekilde olur:

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

  1. Container görüntüsünü oluşturmak ve Artifact Registry'ye aktarmak için Jib'i kullanın.
$ 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. Cloud Console'da Artifacts Registry Images sayfasına giderek container görüntüsünü konsolda listelenmiş olarak görebilirsiniz. Artık proje genelinde kullanabileceğiniz bir Docker görüntüsüne sahipsiniz. Kubernetes birkaç dakika içinde bu görüntüye erişip düzenleyebilir.
  2. (İsteğe bağlı) İşlem tamamlandıktan sonra (her şeyi indirip ayıklaması biraz zaman alabilir) aşağıdaki komutla görüntüyü test edin. Bu komut, yeni oluşturduğunuz container görüntünüzden 8080 bağlantı noktasında arka plan programı olarak bir Docker container'ı çalıştırır. İzin sorunlarıyla karşılaşırsanız önce gcloud auth configure-docker us-central1-docker.pkg.dev komutunu çalıştırın:
$ docker run -ti --rm -p 8080:8080 \
  us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
  1. Yine Cloud Shell'in web önizlemesi özelliğinden yararlanın.

6252b94905f3f7bd.png

  1. Varsayılan sayfayı yeni bir sekmede görürsünüz. Uygulamanın bir Docker container'ında yerel olarak çalıştığını doğruladıktan sonra, Control+C tuşuna basarak çalışan container'ı durdurabilirsiniz.

6. Kümenizi oluşturma

GKE kümenizi oluşturmaya hazırsınız. Kümeler, Google tarafından yönetilen bir Kubernetes API sunucusu ve bir dizi çalışma düğümünden oluşur. Çalışma düğümleri Compute Engine sanal makineleridir.

  1. Öncelikle, ilgili API özelliklerinin etkinleştirildiğinden emin olun.
$ gcloud services enable compute.googleapis.com container.googleapis.com
  1. İki n1-standard-1 düğümü olan bir küme oluşturun. Bu işlemin tamamlanması birkaç dakika sürebilir.
$ gcloud container clusters create hello-java-cluster \
  --num-nodes 2 \
  --machine-type n1-standard-1 \
  --zone us-central1-c

Son adımda, kümenin oluşturulduğunu göreceksiniz.

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

Artık GKE tarafından desteklenen, tam işlevli bir Kubernetes kümenizin olması gerekir.

758c7fca14f70623.png

Container mimarisine alınmış uygulamanızı Kubernetes kümesine dağıtmanın zamanı geldi. Artık kubectl komut satırını (zaten Cloud Shell ortamınızda oluşturulmuş) kullanacaksınız. Codelab'in geri kalanı için Kubernetes istemci ve sunucu sürümünün 1.2 veya üzeri olması gerekir. kubectl version, komutun mevcut sürümünü gösterir.

7. Uygulamanızı Kubernetes'e dağıtma

  1. Kubernetes dağıtımı, oluşturduğunuz container görüntüsünü kullanarak uygulamanızın birden fazla örneğini oluşturabilir, yönetebilir ve ölçeklendirebilir. kubectl run komutunu kullanarak uygulamanızın bir örneğini Kubernetes'e dağıtın.
$ kubectl create deployment hello-java --image=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
  1. Oluşturduğunuz dağıtımı görüntülemek için aşağıdaki komutu çalıştırmanız yeterlidir:
$ kubectl get deployments

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   1         1         1            1           37s
  1. Dağıtım tarafından oluşturulan uygulama örneklerini görüntülemek için aşağıdaki komutu çalıştırın:
$ kubectl get pods

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

Bu noktada, container'ınızı Kubernetes kontrolü altında çalıştırmakla birlikte dış dünyanın erişimine de açmanız gerekir.

8. Harici trafiğe izin ver

Varsayılan olarak Kapsül'e yalnızca küme içindeki dahili IP'si ile erişilebilir. hello-java container'ını Kubernetes sanal ağının dışından erişilebilir hale getirmek için Kapsül'ü Kubernetes hizmeti olarak kullanıma sunmanız gerekir.

  1. Cloud Shell'de Kubernetes LoadBalancer hizmeti oluşturarak Kapsül'ü herkese açık internette kullanıma sunabilirsiniz.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

Dağıtımı Kapsül'ü değil, doğrudan kullanıma sunduğunuzu unutmayın. Bu durum, sonuçta elde edilen hizmetin, dağıtım tarafından yönetilen tüm kapsüller arasında trafik yükünü dengelemesine neden olur (Bu durumda yalnızca bir kapsülü fakat daha sonra başka replikaları da ekleyeceksiniz).

Kubernetes Master, hizmeti Google Cloud dışından tamamen erişilebilir hale getirmek için yük dengeleyiciyi ve ilgili Compute Engine iletim kurallarını, hedef havuzları ve güvenlik duvarı kurallarını oluşturur.

  1. Hizmetin herkes tarafından erişilebilen IP adresini bulmak için kubectl sağlayıcısından tüm küme hizmetlerinin listelenmesini isteyin.
$ 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. Artık tarayıcınızı http://<EXTERNAL_IP>:8080 adresine yönlendirerek hizmete erişebilirsiniz.

9. Hizmetinizi ölçeklendirme

Kubernetes'in sunduğu güçlü özelliklerden biri de uygulamanızı ölçeklendirmenin kolay olmasıdır. Uygulamanız için aniden daha fazla kapasiteye ihtiyaç duyduğunuzu varsayalım. Çoğaltma denetleyicisine, uygulama örnekleriniz için yeni sayıda replika yönetmesini söyleyebilirsiniz.

$ 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

Beyan temelli yaklaşıma dikkat edin. Yeni örnekleri başlatmak veya durdurmak yerine her zaman kaç örneğin çalışması gerektiğini tanımlarsınız. Kubernetes mutabakat döngüleri, yalnızca gerçeğin istediğinizle eşleştiğinden emin olur ve gerekirse işlem yapar.

10. Hizmetinizde yükseltmeyi kullanıma sunma

Bir noktada, üretime dağıttığınız uygulama için hata düzeltmeleri veya ek özellikler gerekecektir. Kubernetes, kullanıcılarınızı etkilemeden yeni bir sürümü üretime dağıtmanıza yardımcı olabilir.

  1. Cloud Shell menüsünde Düzenleyiciyi aç 2109d75686c889a.png tıklayarak kod düzenleyiciyi açın.
  2. src/main/java/com/example/springboot/HelloController.java adresine gidip yanıtın değerini güncelleyin.
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. Container görüntüsünün yeni bir sürümünü derlemek ve aktarmak için Jib'i kullanın. Önbelleğe almanın tüm avantajlarından yararlandığınız için güncellenen görüntünün oluşturulması ve aktarılması çok daha hızlı olacaktır.
$ ./mvnw -DskipTests package com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2

Kubernetes'in replika denetleyicinizi uygulamanın yeni sürümüne sorunsuzca güncellemesine hazırsınız.

  1. Çalışan container'ınızın görüntü etiketini değiştirmek için mevcut hello-java dağıtımını düzenlemeniz ve us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1 olan görüntüyü değiştirmeniz gerekir.

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

  1. kubectl set image komutunu kullanarak Kubernetes'ten uygulamanızın yeni sürümünü periyodik güncellemelerle tek seferde tüm kümeye dağıtmasını isteyebilirsiniz.
$ 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. Yeni yanıtı döndürüp döndürmediğini görmek için http://EXTERNAL_IP:8080 uygulamasını tekrar kontrol edin.

11. Sürümü geri döndür

Hata! Uygulamanın yeni bir sürümünde hata mı yaptınız? Belki de yeni sürüm bir hata içeriyordur ve hemen eski sürüme geri dönmeniz gerekir. Kubernetes sayesinde hizmeti kolayca önceki duruma döndürebilirsiniz. Aşağıdaki komutu çalıştırarak uygulamayı eski haline döndürün:

$ kubectl rollout undo deployment/hello-java

http://EXTERNAL_IP:8080 öğesini tekrar kontrol ettiğinizde eski yanıtı göreceksiniz.

12. Tebrikler

Yeni bir Java tabanlı web uygulaması derlemeyi ve GKE'de Kubernetes'e dağıtmayı öğrendiniz.

Temizleme

$ 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

Daha fazla bilgi