Google Kubernetes Engine'deki Kubernetes'e Spring Boot Java uygulaması dağıtın

Google Kubernetes Engine'deki Kubernetes'e Spring Boot Java uygulaması dağıtın

Bu codelab hakkında

subjectSon güncelleme Nis 22, 2020
account_circleBir Google çalışanı tarafından yazılmıştır

1. Başlamadan önce

Kubernetes, dizüstü bilgisayarlardan yüksek kullanılabilirlikli çoklu düğüm kümelerine, herkese açık bulutlardan şirket içi dağıtımlara ve sanal makine (VM) örneklerinden çıplak metale kadar birçok farklı ortamda çalışabilen bir açık kaynak projesidir.

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

Google Cloud'da tümüyle yönetilen bir Kubernetes hizmeti olan GKE'yi kullanırsınız. Bu sayede, altyapıyı kurmak yerine Kubernetes'i deneyimlemeye daha fazla odaklanabilirsiniz.

Geliştirme makineniz gibi yerel makinenizde Kubernetes'i çalıştırmakla ilgileniyorsanız geliştirme ve test için tek düğümlü Kubernetes kümesinin basit kurulumunu sunan Minikube'ye göz atın. İsterseniz codelab'e geçmek için Minikube'i kullanabilirsiniz.

Codelab, Spring Boot ile Uygulama Oluşturma ile ilgili rehberdeki örnek kodu kullanacaktır.

Ön koşullar

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

Ne yaparsı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 yükseltme yapın.
  • Web tabanlı bir Kubernetes kullanıcı arayüzü olan Kontrol Paneli'ne erişin.

Gerekenler

2. Kurulum ve gereksinimler

Bağımsız tempolu ortam kurulumu

  1. Cloud Console'da oturum açın ve yeni bir proje oluşturun ya da mevcut bir projeyi yeniden kullanın. (Henüz bir Gmail veya G Suite hesabınız yoksa hesap oluşturmanız gerekir.)

Proje kimliğini tüm Google Cloud projeleri genelinde benzersiz bir ad olarak hatırlayın (yukarıdaki ad zaten alınmıştı ve maalesef sizin için çalışmaz). Bu, daha sonra bu codelab'de PROJECT_ID olarak adlandırılacaktır.

  1. Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i gözden geçirmeniz için size birkaç dolar tutarından daha fazla ödeme yapmanız gerekmez, ancak daha fazla kaynak kullanmaya karar verirseniz veya çalışır durumda bırakırsanız daha fazla harcama yapabilirsiniz.

Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'dan Cloud Shell'i Etkinleştir'i tıklayın.

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmında) gösterilir. Bu durumda Devam'ı tıklayın (bu seçeneği bir daha görmezsiniz). Tek seferlik ekran şu şekilde görünür:

Cloud Shell'in temel hazırlığı ve bağlantısı yalnızca birkaç dakika içinde tamamlanacak.

Bu sanal makine, ihtiyacınız olan tüm geliştirme araçları yüklüdür. 5 GB kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulama işlemini önemli ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın büyük bir kısmının tamamı bir tarayıcı veya Chromebook ile yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulanmış olduğunu ve projenin proje kimliğinize ayarlanmış olduğunu görmeniz gerekir.

  1. Kimliğinizin doğrulanmasını sağlamak 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`
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Ayarlanmamışsa şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Kaynak kodunu al

Cloud Shell açı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ır

  1. Spring Boot eklentisini kullanarak Spring Boot uygulamasını normal şekilde başlatabilirsiniz.
$ ./mvnw -DskipTests spring-boot:run
  1. Uygulama başladıktan sonra Cloud Shell araç çubuğundan Web Preview (Web Önizlemesi) seçeneğini tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.

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

5. Java uygulamasını Docker container&#39;ı olarak paketleme

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

  1. Uygulama için dağıtılabilir JAR'ı oluşturun.
$ ./mvnw -DskipTests package
  1. Oluşturacağınız kapsayıcı görüntüsünü depolamak için Container Registry'yi etkinleştirin.
$ gcloud services enable containerregistry.googleapis.com
  1. Container görüntüsünü oluşturmak ve Container Registry'ye aktarmak için Jib'i kullanın.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Her şey yolundaysa Kapsayıcı Kayıt Defteri > Görüntüler'e giderek konsolda listelenen kapsayıcı görüntüsünü görebileceksiniz. Artık proje genelinde bir Docker görüntünüz var. Birkaç dakika içinde Kubernetes'in erişip bunları düzenleyebilirsiniz.
  1. Bu işlem tamamlandıktan sonra (her şeyi indirip ayıklamak biraz zaman alır). Aşağıdaki komutu kullanarak görüntüyü yerel olarak test edebilirsiniz. Bu komut, yeni oluşturulan kapsayıcı görüntünüzden 8080 bağlantı noktası üzerinde bir Docker container'ı arka plan olarak çalıştıracaktır:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Yine Cloud Shell'in web önizleme özelliğinden yararlanın.

  1. Varsayılan sayfayı yeni bir sekmede görürsünüz. Uygulamanın bir Docker kapsayıcısında yerel olarak çalıştığını doğruladıktan sonra, Control+C düğmesine basarak çalışan kapsayıcıyı durdurabilirsiniz.

6. Kümenizi oluşturma

GKE kümenizi oluşturmaya hazırsınız. Küme, 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
Operation "operations/..." finished successfully
  1. İki n1-standard-1 düğümü olan bir küme oluşturun (tamamlanması birkaç dakika sürer).
$ gcloud container clusters create hello-java-cluster \
  --num-nodes 2 \
  --machine-type n1-standard-1 \
  --zone us-central1-c

Sonunda kümenin oluşturulduğunu görürsünüz.

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 ve tamamen işlevsel bir Kubernetes kümesine sahip olmanız gerekir.

Container mimarisine alınmış uygulamanızı Kubernetes kümesine dağıtmanın tam zamanı. Bundan sonra kubectl komut satırını kullanacaksınız (zaten Cloud Shell ortamınızda ayarlanmış). Codelab'in geri kalanı, Kubernetes istemcisi ve sunucu sürümünün 1.2 veya üzeri olmasını gerektirir. kubectl version, komutun geçerli sürümünü gösterir.

7. Uygulamanızı Kubernetes&#39;e dağıtma

  1. Kubernetes dağıtımı, oluşturduğunuz kapsayıcı 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=gcr.io/$GOOGLE_CLOUD_PROJECT/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ın oluşturduğu uygulama örneklerini görmek 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 kapsayıcınızın Kubernetes denetimi altında çalışması gerekir ancak yine de harici dünyaya erişilebilir hale getirmeniz gerekir.

8. Harici trafiğe izin ver

Varsayılan olarak Kapsüle yalnızca küme içindeki dahili IP'den erişilebilir. hello-java kapsayıcısının, Kubernetes sanal ağının dışından erişilebilir olmasını sağlamak için Kapsülü Kubernetes hizmeti olarak kullanıma sunmanız gerekir.

  1. Cloud Shell'de Kapsülü, --type=LoadBalancer işaretiyle birlikte kubectl expose komutuyla herkese açık internete sunabilirsiniz. Harici olarak erişilebilen bir IP'nin oluşturulması için bayrak gereklidir.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

Komutta kullanılan flag, temel altyapı tarafından sağlanan yük dengeleyiciyi kullanacağınızı belirtir. Kapsülü değil, doğrudan dağıtımı kullanıma sunduğunuzu unutmayın. Bu, elde edilen hizmetin, dağıtım tarafından yönetilen tüm Kapsüllerde bakiye trafiği yüklemesine neden olur (bu durumda yalnızca bir Kapsül vardır, ancak daha sonra daha fazla kopya ekleyebilirsiniz).

Kubernetes Master, hizmetin Google Cloud dışından tamamen erişilebilir olmasını sağlamak için yük dengeleyiciyi ve ilgili Compute Engine yönlendirme 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 hizmetinin tüm küme hizmetlerini listelemesini istemeniz yeterlidir.
$ 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. Hizmetiniz için her ikisi de 8080 bağlantı noktasını sunan iki IP adresi listelendiğini unutmayın. Biri, yalnızca Sanal Özel Bulut'unuzun içinde görünen dahili IP adresidir. Diğeri, harici yük dengeli IP adresidir. Örnekte, harici IP adresi aaa.bbb.ccc.ddd şeklindedir. Artık tarayıcınızı http://<EXTERNAL_IP>:8080 adresine yönlendirerek hizmete ulaşabilmeniz gerekir.

9. Hizmetinizi ölçeklendirme

Kubernetes'in sunduğu güçlü özelliklerden biri, uygulamanızı ölçeklendirmenin ne kadar kolay olduğudur. Uygulamanız için aniden daha fazla kapasiteye ihtiyacınız olduğunu varsayalım. Çoğaltma denetleyicisine uygulama örnekleriniz için yeni replika sayısı yönetmesini söylemeniz yeterlidir.

$ 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

Bildirimci yaklaşıma dikkat edin. Yeni örnekler başlatmak veya durdurmak yerine, her zaman kaç örneğin çalıştırılması gerektiğini bildirirsiniz. Kubernetes mutabakat döngüleri, gerçekliğin isteğinizle eşleştiğinden ve gerekirse işlem yaptığından emin olmanızı sağlar.

10. Hizmetinizin sürümünü yükseltme

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

  1. Cloud Shell menüsünde Düzenleyiciyi başlat'ı tıklayarak kod düzenleyiciyi açın.
  2. src/main/java/hello/HelloController.java öğesine gidin ve yanıtın değerini güncelleyin.
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. Kapsayıcı görüntüsünün yeni bir sürümünü oluşturmak ve aktarmak için Jib'i kullanın.
$ ./mvnw -DskipTests package \
  com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

Kubernetes'i kullanarak çoğaltma denetleyicinizi uygulamanın yeni sürümüne sorunsuz bir şekilde güncellemeye hazırsınız.

  1. Çalışan kapsayıcınızın resim etiketini değiştirmek için mevcut hello-java dağıtımını düzenlemeniz ve gcr.io/PROJECT_ID/hello-java:v1 olan resmi gcr.io/PROJECT_ID/hello-java:v2 olarak değiştirmeniz gerekir.
  1. Kubernetes'ten uygulamanızın güncellemelerinin kümenin tamamına teker teker dağıtılmasını istemek için kubectl set image komutunu kullanabilirsiniz.
$ kubectl set image deployment/hello-java \
  hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

deployment "hello-java" image updated
  1. Yeni yanıtı döndürdüğünden emin olmak için http://EXTERNAL_IP:8080 tekrar kontrol edin.

11. Geri çek

Hata! Uygulamanın yeni bir sürümünde hata mı yaptınız? Yeni sürüm bir hata içeriyor olabilir. Bu sürümü hemen geri almanız gerekir. Kubernetes ile kolayca önceki durumunuza geri dönebilirsiniz. Aşağıdaki komutu çalıştırarak uygulamayı geri alın:

$ kubectl rollout undo deployment/hello-java

12. Tebrikler

GKE'de Kubernetes'e yeni bir Java tabanlı web uygulaması derleyip dağıtmayı öğrendiniz.

Daha fazla bilgi