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? Uygulamaları mikro hizmetlere ayırmanın sunduğu avantajlar aşağıda verilmiştir ve bunların çoğu, mikro hizmetlerin serbest bağlantılı olmasından kaynaklıdı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, mikro hizmetleri Google Kubernetes Engine'de (GKE) ç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ı

Bu işlem için 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 Shell'den tetiklediğimiz Cloud Build'i kullanarak her mikro hizmet için bir Docker görüntüsü oluştururuz. Ardından, mikro hizmetlerimizi LoadBalancer türü bir Kubernetes hizmetiyle Google Kubernetes Engine'de (GKE) dağıtıp erişime açacağız. Hizmetleri yeniden düzenleyerek monolitimizden çıkarırken bu işlemi her hizmet için tekrarlayacağız. İşlem sırasında, monolitimizi silebileceğimiz en son aşamaya gelene kadar hem monolitimizi hem de mikro hizmetlerimizi çalıştırmaya devam edeceğiz.

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

Yönlendirmesiz ortam kurulumu

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

53dad2cefdae71da.png

Screenshot from 2016-02-10 12:45:26.png

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 Developers Console'da faturalandırmayı etkinleştirmeniz ve Container Engine API'yi etkinleştirmeniz gerekir.

Bu codelab'i tamamlamak size birkaç dolardan fazla maliyet getirmemelidir. Ancak daha fazla kaynak kullanmaya veya kaynakları çalışır durumda bırakmaya karar verirseniz maliyet artabilir (bu belgenin sonundaki "temizleme" bölümüne bakın). Google Kubernetes Engine fiyatlandırması burada belgelenmiştir.

Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme sürümünden yararlanabilir.

Google Cloud Shell

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

Bu Debian tabanlı sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu nedenle, bu codelab için ihtiyacınız olan tek şey bir tarayıcıdır (Chromebook'ta da çalışır).

  1. Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir 'i fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye 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'nize ayarlandığını görürsünüz.

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 verin:

gcloud config set project <PROJECT_ID>

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

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell, gelecekteki komutları çalıştırırken faydalı olabilecek bazı ortam değişkenlerini de varsayılan olarak ayarlar.

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 bölgeler arasından seçim yapabilirsiniz. Daha fazla bilgi için Bölgeler ve Alt Bölgeler başlıklı makaleyi inceleyin.

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 edebilmemiz için NodeJS bağımlılarını da 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 klonlar, dizine geçer ve uygulamamızı yerel olarak çalıştırmak için gereken bağımlılıkları yükler. 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şturabilmemiz için önce gerekli API'lerin etkin olduğundan emin olmamız gerekir. Google Kubernetes Engine'i kullanabilmek için Containers API'yi 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, kümenin üç çalışan sanal makine örneğini görmek için aşağıdaki komutu çalıştırın:

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 gidin 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 sürecini adım adım incelemek olduğundan öncelikle bir monolitik uygulamayı çalışır duruma getirmeniz gerekir. Bu laboratuvar kapsamında GKE kümemize bir monolitik 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

Monolitik 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 dengeleyici ve IP sağlanması gerekir. Bu nedenle, işlemin tamamlanması biraz zaman alacaktır. Çıkışınızda harici IP olarak listeleniyorsa kısa bir süre bekleyin ve komutu yeniden çalıştırın.

<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

Mevcut monolitik web sitemiz GKE'de çalıştığına göre artık her hizmeti 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 basit bir örnek oluşturduk ve her hizmeti iş alanına göre ayırdık: Siparişler, Ürünler ve Ön Uç. Kod önceden taşındı. Hizmetleri Google Kubernetes Engine'de (GKE) derleyip dağıtmaya odaklanacağız.

Yeni Siparişler Mikro Hizmeti Oluşturma

Ayrılacak ilk hizmet Siparişler hizmetidir. Sağlanan bağımsız kod tabanından faydalanarak 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ş hizmetimizin Docker kapsayıcısı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. Ancak işimizi kolaylaştırabiliriz. Docker container'ı oluşturmak ve görüntüyü tek bir komutla Google Cloud Container Registry'ye yerleştirmek için Google Cloud Build'i kullanabiliriz. Böylece tek bir komut vererek görüntümüzü derleyebilir ve 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 ve --tag işaretini belirttiğinizden, 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 Console'a gidebilirsiniz. Sol üstteki menü düğmesini tıklayın ve 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ındaki derleme bilgileri bölümünde, oluşturulan container görüntüsünü görüntülemek için görüntü adını tıklayın.

6e88ed1643dfe629.png

Container'ı GKE'ye dağıtma

Web sitemizi container mimarisine aldığımıza ve container'ımızı 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 Deployment 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 laboratuvarda, 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 (siparişler) 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 birkaç şey gösterilir. Geçerli dağıtımımızı, istenen kapsül sayısı 1 olan ReplicaSet'imizi ve çalışmakta olan 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 erişime açmanı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 erişime açmak için trafiği harici bağlantı noktası 80'den Siparişler hizmetinin 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 artık monoliti yeni harici Siparişler mikro hizmetine işaret edecek şekilde değiştirmemiz gerekir.

Monolitleri ayırırken tek bir kod tabanındaki kod parçalarını birden çok yere böler ve ayrı ayrı dağıtırız. Mikro hizmet ayrı bir sunucuda çalıştığından artık hizmet URL'lerimizi mutlak yollar olarak referans veremeyiz. Siparişler mikro hizmetimizin yeni sunucu adresine yönlendirme yapmamız gerekir. Bunun için monolit hizmetin bir süre kapalı kalması ve ayrılan her bir hizmetin URL'sini güncellemesi gerekir. Mikro hizmetleri taşıma sürecinde mikro hizmetlerinizi ve monolitinizi üretime taşımayı planlarken bunu göz önünde bulundurmalısınız.

Monolitteki yapılandırma dosyamızı, yeni Siparişler mikro hizmetinin IP adresine işaret edeceği şekilde güncellememiz gerekir. Yerel URL'yi yeni Siparişler mikro hizmetimizin IP adresiyle değiştirmek için nano düzenleyiciyi kullanın. Dosyayı düzenlemek için aşağıdaki komutu çalıştırı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=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

REACT_APP_ORDERS_URL kısmını yeni biçimle değiştirin ve Siparişler 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=/service/products

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

Bu dosyada ayarladığınız URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Siparişler mikro hizmetimizden bir JSON yanıtı döndürmelidir.

Ardından, monolit ön ucumuzu yeniden oluşturmamız, monolit için kapsayıcıyı oluşturmak üzere derleme işlemini tekrarlamamız ve GKE kümemize yeniden dağıtım yapmamız gerekir. 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 bakarak 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

Şimdi hizmetleri ayırmaya devam ederek Ürünler hizmetini taşıyabiliriz. Önceki adımla aynı süreci izleyeceğiz. 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 şekilde Ürünler hizmetimizin 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üzenleyicide kaydetmek için CTRL+O, ENTER ve ardından CTRL+X tuşlarına basın.

Bu dosyada ayarladığınız URL'ye giderek yeni mikro hizmetinizi test edebilirsiniz. Web sayfası, Ürünler mikro hizmetimizden bir JSON yanıtı döndürmelidir.

Ardından, monolit ön ucumuzu yeniden oluşturmamız, monolit için kapsayıcıyı oluşturmak üzere derleme işlemini tekrarlamamız ve GKE kümemize yeniden dağıtım yapmamız gerekir. 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 bakarak 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ü uygulayalım.

Daha önce monolitimizi yeniden oluşturduğumuzda yapılandırmamızı monolitimize işaret edecek şekilde güncelliyorduk ancak artık ön uç mikro hizmetimiz için aynı yapılandırmayı kullanmamız gerekiyor. Mikro hizmetler URL'sinin yapılandırma dosyalarını ö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ğrulayın: Monolit hizmetinize ait eski IP adresiniz artık çalışmıyor olmalı 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ğıdakileri çalıştırın. Burada PROJECT_ID, yalnızca proje adı değil, tam proje kimliğidir.

gcloud projects delete [PROJECT_ID]

İstendiğinde "Y" girerek silme işlemini onaylayın.

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 kod laboratuvarlarına göz atın:

Ek Kaynaklar