Google Kubernetes Engine'de Monolitik Web Sitesini Mikro Hizmetlere Taşıma

1. Giriş

Neden monolitik uygulamadan mikro hizmet mimarisine geçiş yapmalısınız? Bir uygulamayı mikro hizmetlere ayırmanın sunduğu avantajlar şunlardır: Bunların çoğu, mikro hizmetlerin serbest bağlantılı olmasından kaynaklanır.

  • Mikro hizmetler bağımsız olarak test edilebilir ve dağıtılabilir. Dağıtım birimi ne kadar küçükse dağıtım o kadar kolay olur.
  • Farklı dillerde ve çerçevelerde uygulanabilir. Her bir mikro hizmetin kendine özgü kullanım alanı için en iyi teknolojiyi seçebilirsiniz.
  • Farklı ekipler tarafından yönetilebilir. Mikro hizmetler arasındaki sınır, bir veya birkaç mikro hizmete özel ekip atanmasını kolaylaştırır.
  • Mikro hizmetlere geçiş yaparak ekiplerin birbirine olan bağımlılığını azaltabilirsiniz. Her ekip yalnızca bağımlı olduğu mikro hizmetlerin API'leriyle ilgilenir. Böylece bu mikro hizmetlerin uygulanma şekli, sürüm döngüleri vb. ile uğraşmasına gerek kalmaz.
  • Arıza durumu için daha kolay planlama yapmanıza olanak tanır. Hizmetler arasında net sınırlar çizildiğinde bir hizmetin çökmesi durumunda ne yapacağınızı belirlemek kolaylaşır.

Monolitlere kıyasla bazı dezavantajlar ise şunlardır:

  • Mikro hizmet tabanlı uygulamalar, çoğu zaman kolaylıkla ayırt edilemeyecek şekilde birbiriyle etkileşime geçen farklı hizmetler arasında bir ağ oluşturduğu için sistemin genel karmaşıklığı da artar.
  • Monolitin dahili işleyişinin aksine mikro hizmetler bir ağ üzerinden iletişim kurar. Bazı durumlarda bu bir güvenlik endişesi oluşturabilir. Istio, mikro hizmetler arasındaki trafiği otomatik olarak şifreleyerek bu sorunu çözer.
  • Hizmetler arasındaki gecikmeler nedeniyle monolitik yaklaşımla aynı performans düzeyine ulaşmak zor olabilir.
  • Sisteminizin davranışı tek bir hizmetten değil, pek çok hizmetten ve bunların arasındaki etkileşimlerden kaynaklanır. Bu nedenle sisteminizin üretimde nasıl davrandığını anlamak (yani sisteminizin gözlemlenebilirliği) daha zordur. Istio bu soruna da çözüm getirir.

Bu laboratuvarda Google Kubernetes Engine'de (GKE) mikro hizmetler çalıştıracağız. Kubernetes, container'ları yönetme, barındırma, ölçeklendirme ve dağıtma amaçlı bir platformdur. Container'lar ise kodu taşınabilir bir şekilde paketleme ve çalıştırma yoludur. Her mikro hizmetin kendi container'ını çalıştırabildiği mikro hizmet kalıbına uygundur.

Bu laboratuvarda, Google Kubernetes Engine kümesine mevcut bir monolitik uygulamayı dağıtacak ve daha sonra mikro hizmetlere ayıracağız.

Mikro Hizmetlerin Mimari Şeması

Monolitimizi tek seferde bir tane olacak şekilde üç mikro hizmete ayırarak başlayacağız. Mikro hizmetler şunlardır: Siparişler, Ürünler ve Ön Uç. Cloud Build'i kullanarak her mikro hizmet için bir Docker görüntüsü oluştururuz. Bu işlemi Cloud Shell içinden tetikleriz. Ardından mikro hizmetlerimizi LoadBalancer türünde bir Kubernetes hizmetiyle Google Kubernetes Engine'de (GKE) dağıtıp kullanıma sunacağız. Hizmetleri yeniden düzenleyerek monolitimizden çıkarırken bu işlemi her hizmet için gerçekleştireceğiz. Süreç boyunca hem monolitimiz hem de mikro hizmetlerimiz, monolitimizi silebileceğimiz en sonuna kadar çalışır durumda kalacak.

636a2d58588b2b87.png

Neler öğreneceksiniz?

  • Monoliti mikro hizmetlere ayırma
  • Google Kubernetes Engine kümesi oluşturma
  • Docker görüntüsü oluşturma
  • Docker görüntülerini Kubernetes'e dağıtma

Ön koşullar

  • Proje oluşturmak için yönetim erişimine sahip bir Google Cloud Platform hesabı veya Proje Sahibi rolüne sahip olduğunuz bir proje
  • Docker ve Kubernetes'e dair genel bilgi

2. Ortam Kurulumu

Kendi hızınızda ortam kurulumu

Google Hesabınız (Gmail veya Google Apps) yoksa bir hesap oluşturmanız gerekir. Google Cloud Platform konsolunda oturum açın ( console.cloud.google.com) ve yeni bir proje oluşturun:

53dad2cefdae71da.png

Ekran görüntüsü: 2016-02-10 12:45:26.png

Tüm Google Cloud projelerinde benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad zaten alınmış ve size uygun olmayacaktır!). Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT_ID olarak adlandırılacaktır.

Ardından, Google Cloud kaynaklarını kullanmak ve Container Engine API'yi etkinleştirmek için Developers Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i çalıştırmanın maliyeti birkaç dolardan fazla değildir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bu kaynakları çalışır durumda bırakırsanız daha yüksek ücret ödemeniz gerekebilir (bu belgenin sonundaki "temizlik" bölümüne bakın). Google Kubernetes Engine fiyatlandırması hakkında bilgiyi burada bulabilirsiniz.

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

Google Cloud Shell

Google Cloud ve Kubernetes, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Bu Debian tabanlı sanal makine, ihtiyacınız olan tüm geliştirme araçlarıyla 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. Yani bu codelab'de ihtiyacınız olan tek şey bir tarayıcıdır (Evet, Chromebook'ta çalışır).

  1. Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q simgesini tıklamanız yeterlidir (sağlanması ve ortama bağlanması yalnızca birkaç dakika sürer).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin PROJECT_ID olarak ayarlanmış olduğunu göreceksiniz.

gcloud auth list

Komut çıkışı

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Herhangi bir nedenle proje ayarlanmamışsa şu komutu vermeniz yeterlidir:

gcloud config set project <PROJECT_ID>

PROJECT_ID cihazınızı mı arıyorsunuz? Kurulum adımlarında kullandığınız kimliği kontrol edin veya Cloud Console kontrol panelinden arayın:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell bazı ortam değişkenlerini de varsayılan olarak ayarlar. Bu değişkenler, gelecekte komut çalıştırdığınızda işinize yarayabilir.

echo $GOOGLE_CLOUD_PROJECT

Komut çıkışı

<PROJECT_ID>
  1. Son olarak, varsayılan alt bölgeyi ve proje yapılandırmasını ayarlayın.
gcloud config set compute/zone us-central1-f

Çeşitli farklı alt bölgeler seçebilirsiniz. Daha fazla bilgi için Bölgeler ve Bölgeler.

3. Kaynak Deposunu Klonlama

Basit bir karşılama sayfası, ürünler sayfası ve sipariş geçmişi sayfası olan hayali bir e-ticaret web sitesinin mevcut monolitik uygulamasını kullanıyoruz. Kaynağı Git depomuzdan klonladıktan sonra yalnızca mikro hizmetlere ayırmaya ve Google Kubernetes Engine'e (GKE) dağıtmaya odaklanabileceğiz.

Git deposunu Cloud Shell örneğinize klonlamak için aşağıdaki komutları çalıştırın ve uygun dizin değişikliğini yapın. Dağıtım öncesinde monolitimizi test edebilmek için NodeJS bağımlılarını yükleyeceğiz. Bu komut dosyasının çalışması birkaç dakika sürebilir.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Bu işlem GitHub depomuzu klonlayacak, dizin değiştirecek ve uygulamamızı yerel olarak çalıştırmak için gereken bağımlılıkları yükleyecektir. Bu komut dosyasının çalışması birkaç dakika sürebilir.

4. GKE Kümesi oluşturma

Geliştirme ortamınız çalışır durumda olduğuna göre şimdi, monolitimizi ve son olarak mikro hizmetlerimizi dağıtacağımız bir Kubernetes kümesine ihtiyacımız var. Küme oluşturabilmek için önce uygun API'lerin etkinleştirildiğinden emin olmamız gerekir. Google Kubernetes Engine'i kullanabilmemiz için container'lar API'sini etkinleştirmek üzere aşağıdaki komutu çalıştırın:

gcloud services enable container.googleapis.com

Artık kümemizi oluşturmaya hazırız. fancy-cluster adlı ve 3 düğüme sahip bir GKE kümesi oluşturmak için aşağıdaki komutu çalıştırın.

gcloud container clusters create fancy-cluster --num-nodes 3

Kümenin oluşturulması birkaç dakika sürebilir. Bu komut tamamlandıktan sonra aşağıdaki komutu çalıştırarak kümedeki üç çalışan sanal makine örneğini görüntüleyin:

gcloud compute instances list

Çıkış:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Kubernetes kümenizi ve ilgili bilgileri Google Cloud Console'da da görüntüleyebilirsiniz. Sol üstteki menü düğmesini tıklayın, Kubernetes Engine'e ilerleyin ve Kümeler'i tıklayın. fancy-cluster adlı kümenizi göreceksiniz.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

Tebrikler! İlk Kubernetes kümenizi oluşturdunuz.

5. Mevcut Monoliti Dağıtma

Bu laboratuvarın odak noktası monoliti mikro hizmetlere ayırma konusunda bilgi edinmektir. Bu nedenle, bir monolitik uygulamayı çalışır duruma getirmemiz gerekir. Bu laboratuvarın amaçları doğrultusunda GKE kümemize monolit uygulama dağıtmak için aşağıdaki komut dosyasını çalıştırın:

cd ~/monolith-to-microservices
./deploy-monolith.sh

Monolite Erişme

Monolit uygulamamızın harici IP adresini bulmak için aşağıdaki komutu çalıştırın.

kubectl get service monolith

Şuna benzer bir çıkış alırsınız:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

NOT: Bu işlem için harici bir yük dengeleyicinin ve IP'nin temel hazırlığının yapılması gerekir. Bu nedenle, bu işlem biraz zaman alabilir. Çıkışınızda harici IP şu şekilde listeleniyorsa:

<pending> birkaç dakika bekleyip tekrar deneyin.

Monolitinizin harici IP adresini belirledikten sonra kopyalayın. Monolitinizin erişilebilir durumda olup olmadığını kontrol etmek için tarayıcınızı bu URL'ye (örneğin http://203.0.113.0) yönlendirin.

9ed25c3f0cbe62fa.png

Tıpkı yukarıdaki resimde olduğu gibi bir monolitik web sitesi karşılama sayfası göreceksiniz. Karşılama sayfası, daha sonra Ön Uç mikro hizmeti tarafından sunulacak olan statik bir sayfadır. Artık monolitiniz tümüyle Kubernetes üzerinde çalışıyor.

6. Siparişleri Mikro Hizmete Taşıma

Artık GKE'de çalışan mevcut monolitik web sitemiz olduğuna göre hizmetleri mikro hizmetlere ayırmaya başlayabiliriz. Genellikle, hangi hizmetlerin daha küçük parçalara ayrılacağı konusunda planlama yapılması gerekir. Bu planlama çoğu zaman uygulamanın iş alanı gibi belirli kısımları etrafında yapılır. Gösterim amacıyla küçük bir örnek oluşturduk ve her hizmeti işletme alan adı, Siparişler, Ürünler ve Ön Uç ile ilgili ayrıntıları paylaştık. Bu kod daha önce taşındı. Hizmetleri Google Kubernetes Engine'de (GKE) derleyip dağıtmaya odaklanacağız.

Yeni Siparişler Mikro Hizmeti Oluşturma

Ayrılacağımız ilk hizmet Siparişler hizmetidir. Sağlanan ayrı kod tabanından yararlanıp bu hizmet için ayrı bir Docker container'ı oluşturacağız.

Google Cloud Build ile Docker Container'ı Oluşturma

Kod tabanını sizin için zaten taşıdığımızdan, ilk adımımız Google Cloud Build'i kullanarak Siparişler hizmetimizin bir Docker container'ını oluşturmak olacak.

Normalde bu süreç iki adımda tamamlanır: Bir Docker container'ı derlenir ve görüntünün, GKE'nin çekebileceği şekilde depolanması için bu container bir kayıt defterine aktarılır. İşinizi kolaylaştırabiliriz. Google Cloud Build'i kullanarak Docker container'ını derleyebilir ve görüntüyü tek bir komutla Google Cloud Container Registry'ye yerleştirebiliriz. Böylece tek bir komut vererek görüntümüzü derleyip Container Registry'ye taşıyabiliriz. Docker dosyasını oluşturup push etmeyi sağlayan manuel işlemi buradan görüntüleyebilirsiniz.

Google Cloud Build, dizindeki dosyaları sıkıştırır ve bir Google Cloud Storage paketine taşır. Ardından, derleme işlemi sırasında paketteki tüm dosyalar alınır ve Dockerfile üzerinden Docker derleme işlemi çalıştırılır. Docker görüntüsü için ana makineyi gcr.io olarak ayarladığınız --tag işaretini belirttiğimizden, elde edilen Docker görüntüsü Google Cloud Container Registry'ye aktarılır.

Docker container'ınızı derlemek ve Google Container Registry'ye aktarmak için aşağıdaki komutları kullanın:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0 .

Bu işlem birkaç dakika sürer ve tamamlandıktan sonra terminalde aşağıdakine benzer bir çıkış alınır:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/orders:1.0.0  SUCCESS

Derleme geçmişinizi görüntülemek veya işlemi gerçek zamanlı olarak izlemek için Google Cloud konsoluna gidebilirsiniz. Sol üstteki menü düğmesini tıklayın ve aşağı kaydırarak Araçlar → Cloud Build'e gidip Geçmiş'i tıklayın. Burada, önceki tüm derlemelerinizin listesini görebilirsiniz. Şimdilik yalnızca az önce oluşturduğunuz derleme vardır.

4c753ede203255f6.png

Derleme kimliğini tıklarsanız derlemenin günlük çıkışı da dahil olmak üzere tüm ayrıntılarını görebilirsiniz.

Derleme ayrıntıları sayfasında, derleme bilgileri bölümünde görüntü adını tıklayarak oluşturulan container görüntüsünü görebilirsiniz.

6e88ed1643dfe629.png

Container'ı GKE'ye dağıtma

Web sitemizi container mimarisine aldığımıza ve container'ı Google Container Registry'ye aktardığımıza göre sıra Kubernetes'e dağıtım yapmaya geldi.

Kubernetes'te uygulamalar kapsüller olarak temsil edilir. Kapsüller, bir container'ı (veya birbirlerine sıkı sıkıya bağlı bir grup container'ı) temsil eden birimlerdir. Kapsül, Kubernetes'teki en küçük dağıtılabilir birimdir. Bu eğiticideki her kapsülde yalnızca mikro hizmetler container'ınız yer almaktadır.

Uygulamaları bir GKE kümesinde dağıtıp yönetmek için Kubernetes küme yönetimi sistemiyle iletişim kurmanız gerekir. Bunun için genellikle Cloud Shell içinden kubectl komut satırı aracı kullanılır.

İlk olarak bir Dağıtım kaynağı oluşturacağız. Dağıtım, uygulamanızın replika adı verilen birden fazla kopyasını yönetir ve bu kopyaların her birinin kümenizdeki ayrı birer düğümde çalıştırılmasını planlar. Bu durumda, Dağıtım tarafından uygulamanızın yalnızca bir kapsülü çalıştırılacaktır. Dağıtımlar bu iş için bir ReplicaSet oluşturur. ReplicaSet, belirtilen sayıda replikanın her zaman çalışmasını sağlamaktan sorumludur.

Aşağıdaki kubectl create deployment komutu, Kubernetes'in kümenizde 1 replikaya sahip orders adlı bir Dağıtım oluşturmasını sağlar.

Uygulamanızı dağıtmak için aşağıdaki komutu çalıştırın:

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

Dağıtımı doğrulama

Dağıtımın başarıyla oluşturulduğunu doğrulamak için aşağıdaki komutu çalıştırın. Kapsül durumunun Çalışıyor olması birkaç dakika sürebilir:

kubectl get all

Çıkış:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

Bu çıkışta çeşitli bilgiler sunulmaktadır. Mevcut Dağıtımımızı, istenen kapsül sayısı 1 olan ReplicaSet'i ve çalışan kapsülümüzü görebiliriz. Bu durumda tüm öğeler başarıyla oluşturulmuş demektir.

GKE container'ını kullanıma sunun:

Uygulamamızı GKE'de dağıttık ancak buna küme dışından erişmemiz mümkün değil. Varsayılan olarak, GKE'de çalıştırılan container'ların harici bir IP adresi bulunmadığından bu container'lara internet üzerinden erişilemez. İnternet trafiği alabilmesi için uygulamanızı bir Hizmet kaynağı üzerinden açıkça kullanıma sunmanız gerekir. Hizmetler, uygulamanızın Kapsüllerine ağ ve IP desteği sağlar. GKE, uygulamanız için harici bir IP adresi ve bir Yük Dengeleyici (faturalandırmaya tabidir) oluşturur.

Siparişler hizmetimizi dağıttığımızda bir Kubernetes dağıtımı aracılığıyla bağlantı noktası 8081'de dahili olarak kullanıma sunduk. Bu hizmeti harici olarak kullanıma sunmak için trafiği Siparişler hizmeti için harici bağlantı noktası 80'den dahili bağlantı noktası 8081'e yönlendirmek üzere LoadBalancer türünde bir Kubernetes hizmeti oluşturmamız gerekir. Web sitenizi internet üzerinden kullanıma sunmak için aşağıdaki komutu çalıştırın:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

Hizmete Erişim

GKE, harici IP adresini Dağıtım'a değil Hizmet kaynağına atar. GKE tarafından uygulamanıza sağlanan harici IP adresini öğrenmek istiyorsanız hizmeti incelemek için kubectl get service komutunu kullanabilirsiniz:

kubectl get service orders

Çıkış:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

Uygulamanızın harici IP adresini belirledikten sonra kopyalayın. Monolitimizi yeni Siparişler hizmetimize işaret edecek şekilde değiştireceğimiz sonraki adım için bu adresi saklayın.

Monoliti yeniden yapılandırma

Siparişler hizmetini monolitten kaldırdığımız için monoliti yeni harici Siparişler mikro hizmetine işaret edecek şekilde değiştirmemiz gerekiyor.

Monolitleri ayırırken tek bir kod tabanındaki kod parçalarını birden çok kod tabanına ayırır ve ayrı ayrı dağıtırız. Mikro hizmet farklı bir sunucuda çalıştığından artık hizmet URL'lerimize mutlak yollar olarak referans veremiyoruz. Bu nedenle, Siparişler mikro hizmetinin yeni sunucu adresine yönlendirme yapmamız gerekiyor. Bunun, ayrılan her bir hizmetin URL'sini güncellemek için monolit hizmetin bir süre kapalı kalması gerekeceğini unutmayın. Mikro hizmetleri taşıma sürecinde mikro hizmetlerinizi ve monolitinizi üretime taşımayı planlarken bunu göz önünde bulundurmalısınız.

Monolitimizdeki yapılandırma dosyamızı, yeni Siparişler mikro hizmetleri IP adresine işaret edecek şekilde güncellememiz gerekiyor. Yerel URL'yi yeni Siparişler mikro hizmetimizin IP adresiyle değiştirmek için nano düzenleyiciyi kullanın. Aşağıdaki komutu çalıştırarak

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Düzenleyici açıldığında dosyanız şu şekilde görünmelidir:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

REACT_APP_ORDERS_URL değerini Siparişler mikro hizmetinizin IP adresiyle değiştirirken aşağıdakiyle eşleşecek şekilde yeni biçimle değiştirin:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

Dosyayı nano düzenleyiciye kaydetmek için CTRL+O, ENTER ve ardından CTRL+X tuşlarına basın.

Bu dosyada ayarlamış olduğunuz URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Siparişler mikro hizmetimizden bir JSON yanıtı döndürecektir.

Şimdi monolit ön ucumuzu yeniden derleyip monolit container'ını derlemek ve GKE kümemize yeniden dağıtım yapmak için derleme işlemini tekrarlamamız gerekiyor. Bu adımları tamamlamak için aşağıdaki komutları çalıştırın:

Monolit Yapılandırma Dosyalarını Yeniden Derleme

npm run build:monolith

Google Cloud Build ile Docker Container'ı Oluşturma

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Container'ı GKE'ye dağıtma

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Tarayıcınızda monolitik uygulamaya gidip Siparişler sayfasına giderek uygulamanızın yeni Siparişler mikro hizmetine işaret ettiğini doğrulayabilirsiniz. Tüm sipariş kimlikleri, aşağıda gösterildiği gibi -MICROSERVICE son ekiyle bitmelidir:

1cdd60bb0d4d1148.png

7. Ürünleri Mikro Hizmete taşıma

Yeni Ürünler Mikro Hizmeti Oluşturma

Bir sonraki adımda Ürünler hizmetini taşıyarak hizmetlerimizin kapsamını genişletmeye devam edebiliriz. Bir önceki adımla aynı süreci izleriz. Docker container'ı derlemek, container'ınızı dağıtmak ve Kubernetes hizmeti aracılığıyla kullanıma sunmak için aşağıdaki komutları çalıştırın.

Google Cloud Build ile Docker Container'ı Oluşturma

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

Container'ı GKE'ye dağıtma

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

GKE container'ını kullanıma sunun:

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

Aşağıdaki komutu kullanarak, Siparişler hizmetimiz için yaptığımız gibi, Ürün hizmetlerimizin de herkese açık IP'sini bulun:

kubectl get service products

Çıkış:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

Monolitimizi yeni Ürünler mikro hizmetimize işaret edecek şekilde yeniden yapılandıracağımız bir sonraki adım için IP adresini kaydedin.

Monoliti yeniden yapılandırma

Yerel URL'yi yeni Ürünler mikro hizmetlerimizin IP adresiyle değiştirmek için nano düzenleyiciyi kullanın:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

Düzenleyici açıldığında dosyanız şu şekilde görünmelidir:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

REACT_APP_PRODUCTS_URL kısmını yeni biçimle değiştirin ve Ürünler mikro hizmetinizin IP adresini aşağıdakiyle eşleşecek şekilde değiştirin:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

Dosyayı nano düzenleyiciye kaydetmek için CTRL+O, ENTER ve ardından CTRL+X tuşlarına basın.

Bu dosyada ayarlamış olduğunuz URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Ürünler mikro hizmetimizden bir JSON yanıtı döndürecektir.

Şimdi monolit ön ucumuzu yeniden derleyip monolit container'ını derlemek ve GKE kümemize yeniden dağıtım yapmak için derleme işlemini tekrarlamamız gerekiyor. Bu adımları tamamlamak için aşağıdaki komutları çalıştırın:

Monolit Yapılandırma Dosyalarını Yeniden Derleme

npm run build:monolith

Google Cloud Build ile Docker Container'ı Oluşturma

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

Container'ı GKE'ye dağıtma

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

Tarayıcınızda monolitik uygulamaya gidip Ürünler sayfasına giderek uygulamanızın yeni Ürünler mikro hizmetine işaret ettiğini doğrulayabilirsiniz. Tüm ürün adları, aşağıda gösterildiği gibi MS- ön ekiyle başlamalıdır:

5389b29f4b8c7c69.png

8. Ön Ucu Mikro Hizmete Taşıma

Taşıma sürecinin son adımı, Ön Uç kodunu bir mikro hizmete taşımak ve monoliti kapatmaktır. Bu adım tamamlandıktan sonra monolitimizi mikro hizmet mimarisine başarıyla taşımış olacağız.

Yeni Ön Uç Mikro Hizmeti Oluşturma

Yeni bir ön uç mikro hizmeti oluşturmak için son iki adımdaki prosedürü izleyelim.

Önceden monolitimizi yeniden derlediğimizde yapılandırmamızı monolitimize işaret edecek şekilde güncelledik. Ancak şimdi, Ön Uç mikro hizmetimiz için de aynı yapılandırmayı kullanmamız gerekiyor. Mikro hizmetler URL'sinin yapılandırma dosyalarımızı Ön uç mikro hizmet kod tabanına kopyalamak için aşağıdaki komutları çalıştırın:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

Bu işlem tamamlandıktan sonra, önceki adımlarla aynı süreci izleriz. Docker container'ı derlemek, container'ınızı dağıtmak ve Kubernetes hizmeti aracılığıyla kullanıma sunmak için aşağıdaki komutları çalıştırın.

Google Cloud Build ile Docker Container'ı Oluşturma

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

Container'ı GKE'ye dağıtma

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

GKE container'ını kullanıma sunun:

kubectl expose deployment frontend --type=LoadBalancer --port 80 --target-port 8080

Monoliti Silme

Tüm hizmetlerimiz mikro hizmet olarak çalıştığına göre artık monolitik uygulamamızı silebiliriz. Gerçek bir taşıma işleminde bu adımı gerçekleştirirken mevcut alan adlarımızın uygulamamızdaki yeni ön uç mikro hizmetlere işaret etmesini sağlamak için DNS değişiklikleri vb. gerekeceğini unutmayın. Monolitimizi silmek için aşağıdaki komutları çalıştırın:

kubectl delete deployment monolith
kubectl delete service monolith

Çalışmanızı Test Etme

Her şeyin çalıştığını doğrulamak için monolit hizmetinize ait eski IP adresiniz çalışmamalı ve ön uç hizmetinize ait yeni IP adresiniz yeni uygulamayı barındırıyor olmalıdır. Tüm hizmetlerin ve IP adreslerinin listesini görmek için aşağıdaki komutu kullanın:

kubectl get services

Şuna benzer bir çıkış alırsınız:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

Ön uç mikro hizmetinizin harici IP adresini belirledikten sonra kopyalayın. Ön ucunuzun erişilebilir durumda olup olmadığını kontrol etmek için tarayıcınızı bu URL'ye (örneğin http://203.0.113.0) yönlendirin. Web siteniz, monoliti mikro hizmetlere ayırmadan önce nasılsa yine o şekilde görünmelidir.

9. Temizleme

Hazır olduğunuzda, gerçekleştirilen tüm etkinlikleri temizlemenin en kolay yolu Projeyi silmektir. Projenin silinmesi, beklenmedik yinelenen ücretlerin oluşmaması için bu Codelab'de oluşturulan tüm kaynakları siler. Cloud Shell'de aşağıdaki kodu yürütün. Burada PROJECT_ID yalnızca Proje Adı değil, tam Proje Kimliğidir.

gcloud projects delete [PROJECT_ID]

"Y" yazarak silme işlemini onaylayın sorulduğunda.

10. Tebrikler!

Monolitik uygulamanızı Google Kubernetes Engine'de başarıyla mikro hizmetlere ayırdınız ve dağıttınız.

Sonraki Adımlar

Kubernetes hakkında daha fazla bilgi edinmek için aşağıdaki codelab'lere göz atın:

Ek Kaynaklar