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
- Bir Google Cloud projesi
- Google Chrome gibi bir tarayıcı
2. Kurulum ve şartlar
Kendi hızınızda ortam kurulumu
- 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.
- 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.
- 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
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
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.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
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.
- 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`
- 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
- JAVA_HOME öğesinin doğru sürüme ayarlandığından emin olun:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
- Spring Boot uygulamasını, Spring Boot eklentisiyle normal bir şekilde başlatabilirsiniz.
$ ./mvnw -DskipTests spring-boot:run
- Uygulama başladıktan sonra Cloud Shell araç çubuğunda Web Önizlemesi'ni tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.
Tarayıcınızda bir sekme açılır ve yeni başlattığınız sunucuya bağlanır.
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.
- Uygulama için dağıtılabilir JAR dosyasını oluşturun.
$ ./mvnw -DskipTests package
- 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
- 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
- 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
- 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
- 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.
- (İ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
- Yine Cloud Shell'in web önizlemesi özelliğinden yararlanın.
- 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.
- Öncelikle, ilgili API özelliklerinin etkinleştirildiğinden emin olun.
$ gcloud services enable compute.googleapis.com container.googleapis.com
- İ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.
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
- 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
- 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 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.
- 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.
- 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
- 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.
- Cloud Shell menüsünde Düzenleyiciyi aç 'ı tıklayarak kod düzenleyiciyi açın.
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!";
}
}
- 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.
- Çalışan container'ınızın görüntü etiketini değiştirmek için mevcut
hello-java
dağıtımını düzenlemeniz veus-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
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
- 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