Kubernetes; dizüstü bilgisayarlardan yüksek kullanılabilirlik sağlayan çok düğümlü kümelere, herkese açık bulutlardan şirket içi dağıtımlara ve sanal makine (VM) örneklerinden bare metal'e kadar birçok farklı ortamda çalışabilen açık kaynaklı bir projedir.
Bu codelab'de, basit bir Spring Boot Java web uygulamasını GKE'deki Kubernetes'e dağıtacak ve web uygulamanızı Kubernetes'te çoğaltılmış bir uygulama olarak çalıştırmayı hedefleyeceksiniz. 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.
Temel altyapıyı ayarlamak yerine Kubernetes'i deneyimlemeye daha fazla odaklanmanızı sağlamak için Google Cloud'da tümüyle yönetilen bir Kubernetes hizmeti olan GKE'yi kullanacaksınız.
Kubernetes'i yerel makinenizde (ör. geliştirme dizüstü bilgisayarı) çalıştırmak istiyorsanız geliştirme ve test amaçlı tek düğümlü bir Kubernetes kümesinin basit kurulumunu sunan Minikube'u inceleyin. İsterseniz Minikube'u kullanarak codelab'i inceleyebilirsiniz.
Codelab'de, Spring Boot ile Uygulama Oluşturma hakkındaki kılavuzdaki örnek kod kullanılacaktı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 sahibi olmanız gerekir.
Yapacaklarınız
- Basit bir Java uygulamasını Docker container'ı olarak paketleyin.
- GKE'de Kubernetes kümenizi oluşturun.
- Java uygulamanızı GKE'deki Kubernetes'e dağıtın.
- Hizmetinizi ölçeklendirin ve yükseltme işlemini kullanıma sunun.
- Web tabanlı bir Kubernetes kullanıcı arayüzü olan kontrol paneline erişin.
Gerekenler
- Google Cloud projesi
- Google Chrome gibi bir tarayıcı
Kendi hızınızda ortam kurulumu
- Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. (Gmail veya G Suite hesabınız yoksa oluşturmanız gerekir.)
Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında 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 tamamlamak birkaç dolardan fazla tutmaz. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet artabilir.
Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme sürümünden yararlanabilir.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.
Daha önce Cloud Shell'i başlatmadıysanız ne olduğunu açıklayan bir ara ekran (sayfanın alt kısmında) gösterilir. Bu durumda Devam'ı tıklayın (bu ekranı bir daha görmezsiniz). Bu tek seferlik ekran aşağıdaki gibi görünür:
Cloud Shell'in sağlanması ve bağlanması yalnızca birkaç dakikanızı alır.
Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu codelab'deki çalışmalarınızın çoğu (hatta tamamı) yalnızca bir tarayıcı veya Chromebook'unuzla yapılabilir.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığı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 config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Değilse aşağıdaki komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
Cloud Shell başlatıldıktan sonra, ana dizindeki örnek kaynak kodu klonlamak için komut satırını kullanabilirsiniz.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
- Spring Boot uygulamasını Spring Boot eklentisiyle normal ş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 numaralı 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.
Ardından, uygulamanızı Kubernetes'te çalışmaya 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 container görüntüsünü depolamak için Container Registry'yi etkinleştirin.
$ gcloud services enable containerregistry.googleapis.com
- Container görüntüsü 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 yolunda giderse Container Registry > Images'a giderek container görüntüsünü konsolda listelenmiş olarak görebilirsiniz. Artık Kubernetes'in erişebileceği ve düzenleyebileceği proje genelinde bir Docker görüntünüz var. Bunu birkaç dakika içinde göreceksiniz.
- Bu işlem tamamlandıktan sonra (her şeyin indirilmesi ve çıkarılması biraz zaman alır) görüntüyü yerel olarak test edebilirsiniz. Bunun için aşağıdaki komutu kullanın. Bu komut, yeni oluşturduğunuz container görüntüsünden 8080 numaralı bağlantı noktasında bir Docker container'ı arka plan programı olarak çalıştırı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örmeniz gerekir. Uygulamanın yerel olarak bir Docker kapsayıcısında çalıştığını doğruladıktan sonra
Control+C
tuşuna basarak çalışan kapsayıcıyı durdurabilirsiniz.
GKE kümenizi oluşturmaya hazırsınız. Küme, Google tarafından yönetilen bir Kubernetes API sunucusundan ve bir dizi çalışan düğümden 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üğümlü 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
Sonunda, oluşturulan kümeyi 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, tam işlevli bir Kubernetes kümeniz olmalıdır.
Artık container mimarisine alınmış uygulamanızı Kubernetes kümesine dağıtmanın zamanı geldi. Bundan sonra kubectl
komut satırını (Cloud Shell ortamınızda zaten ayarlanmış) kullanacaksınız. Codelab'in geri kalanında Kubernetes istemci ve sunucu sürümünün 1.2 veya daha yeni olması gerekir. kubectl version
, komutun mevcut sürümünü gösterir.
- 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 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, kapsayıcınız Kubernetes'in kontrolü altında çalışıyor olmalıdır ancak yine de dış dünyaya erişilebilir hale getirmeniz gerekir.
Varsayılan olarak, kapsüle yalnızca küme içindeki dahili IP'si üzerinden erişilebilir. hello-java
kapsayıcısının Kubernetes sanal ağının dışından erişilebilir olması için kapsülü Kubernetes hizmeti olarak kullanıma sunmanız gerekir.
- Cloud Shell'de,
kubectl expose
komutunu--type=LoadBalancer
işaretiyle birlikte kullanarak Pod'u herkese açık internete sunabilirsiniz. Harici olarak erişilebilen bir IP oluşturmak için işaret gereklidir.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
Komutta kullanılan işaret, temel altyapı tarafından sağlanan yük dengeleyiciyi kullanacağınızı belirtir. Pod'u değil, dağıtımı doğrudan kullanıma sunduğunuzu unutmayın. Bu işlem, ortaya çıkan hizmetin trafiği dağıtım tarafından yönetilen tüm kapsüller arasında yük dengelemesine neden olur (bu durumda yalnızca bir kapsül vardır ancak daha sonra daha fazla kopya ekleyeceksiniz).
Kubernetes ana makinesi, hizmetin Google Cloud dışından tamamen erişilebilir olması için yük dengeleyiciyi ve ilgili Compute Engine yönlendirme kurallarını, hedef havuzlarını ve güvenlik duvarı kurallarını oluşturur.
- Hizmetin herkese açık olarak erişilebilen IP adresini bulmak için
kubectl
komutunu kullanarak tüm küme hizmetlerini listelemeniz 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 listelenen iki IP adresinin de 8080 numaralı bağlantı noktasına hizmet verdiğini unutmayın. Biri, yalnızca sanal özel bulutunuzda görünen dahili IP adresidir. Diğeri ise harici yük dengeli IP adresidir. Örnekte, harici IP adresi
aaa.bbb.ccc.ddd
'dır. Artık tarayıcınızı http://<EXTERNAL_IP>:8080 adresine yönlendirerek hizmete ulaşabilirsiniz.
Kubernetes'in sunduğu güçlü özelliklerden biri, uygulamanızı ölçeklendirmenin ne kadar kolay olduğudur. Örneğin, uygulamanız için aniden daha fazla kapasiteye ihtiyacınız olduğunu varsayalım. Bu durumda, uygulamanızın örnekleri için yeni bir kopya sayısı yönetmesini kopya denetleyicisine 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
Bildirimsel yaklaşıma dikkat edin. Yeni örnekleri başlatmak veya durdurmak yerine, her zaman kaç örneğin çalışması gerektiğini belirtirsiniz. Kubernetes uzlaştırma döngüleri, gerçekliğin istediğinizle eşleştiğinden emin olur ve gerekirse işlem yapar.
Üretime dağıttığınız uygulamada bir noktada hata düzeltmeleri veya ek özellikler gerekebilir. Kubernetes, kullanıcılarınızı etkilemeden yeni bir sürümü üretime dağıtmanıza yardımcı olabilir.
- Cloud Shell menüsünde Launch editor 'ı (Düzenleyiciyi başlat)
tıklayarak kod düzenleyiciyi açın.
src/main/java/hello/HelloController.java
simgesine 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!";
}
}
- Container görüntüsünün yeni bir sürümünü oluşturup 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'in, replikasyon denetleyicinizi uygulamanın yeni sürümüne sorunsuz bir şekilde güncellemesine 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 ve resmigcr.io/PROJECT_ID/hello-java:v1
yerinegcr.io/PROJECT_ID/hello-java:v2
olarak değiştirmeniz gerekir.
- Kubernetes'ten, uygulamanızın yeni sürümünü,
kubectl set image
komutunu kullanarak tüm kümede her seferinde bir örnek olacak şekilde dağıtmasını isteyebilirsiniz.
$ kubectl set image deployment/hello-java \ hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2 deployment "hello-java" image updated
- Yeni yanıtın döndürüldüğünü görmek için http://EXTERNAL_IP:8080 adresini tekrar kontrol edin.
Hata! Uygulamanın yeni sürümünde hata mı yaptınız? Belki de yeni sürümde bir hata vardır ve hızlıca geri almanız gerekir. Kubernetes ile önceki duruma kolayca geri dönebilirsiniz. Aşağıdaki komutu çalıştırarak uygulamayı geri alın:
$ kubectl rollout undo deployment/hello-java
GKE'de Kubernetes'e yeni bir Java tabanlı web uygulaması oluşturup dağıtmayı öğrendiniz.