Google Kubernetes Engine'deki Kubernetes'e Spring Boot Java uygulaması dağıtın
Bu codelab hakkında
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
- Bir Google Cloud projesi
- Google Chrome gibi bir tarayıcı
2. Kurulum ve gereksinimler
Bağımsız tempolu ortam kurulumu
- 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.
- 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
- 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.
- 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
- Spring Boot eklentisini kullanarak Spring Boot uygulamasını normal şekilde başlatabilirsiniz.
$ ./mvnw -DskipTests spring-boot:run
- 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'ı 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.
- Uygulama için dağıtılabilir JAR'ı oluşturun.
$ ./mvnw -DskipTests package
- 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
- 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
- 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.
- 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
- Yine Cloud Shell'in web önizleme özelliğinden yararlanın.
- 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.
- Öncelikle ilgili API özelliklerinin etkinleştirildiğinden emin olun.
$ gcloud services enable compute.googleapis.com container.googleapis.com Operation "operations/..." finished successfully
- İ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'e dağıtma
- 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
- 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
- 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.
- Cloud Shell'de Kapsülü,
--type=LoadBalancer
işaretiyle birliktekubectl 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.
- 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
- 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.
- Cloud Shell menüsünde Düzenleyiciyi başlat
'ı tıklayarak kod düzenleyiciyi açın.
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!";
}
}
- 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.
- Çalışan kapsayıcınızın resim etiketini değiştirmek için mevcut
hello-java
dağıtımını düzenlemeniz vegcr.io/PROJECT_ID/hello-java:v1
olan resmigcr.io/PROJECT_ID/hello-java:v2
olarak değiştirmeniz gerekir.
- 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
- 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.