Compute Engine ile Google Cloud'da web uygulaması barındırma ve ölçeklendirme

1. Giriş

Google Cloud'da web sitelerini dağıtmanın birçok yolu vardır. Her çözüm farklı özellikler, beceriler ve kontrol düzeyleri sunar. Compute Engine, web sitesini çalıştırırken kullanılan altyapı üzerinde derin bir kontrol seviyesi sunmakla birlikte Google Kubernetes Engine ve App Engine gibi çözümlere kıyasla biraz daha fazla operasyon yönetimi gerektirir. Compute Engine ile altyapının sanal makineler ve yük dengeleyici gibi birçok yönü üzerinde ayrıntılı kontrol sahibi olursunuz. Bugün bir web sitesinin Compute Engine ile nasıl kolayca dağıtılabileceğini ve ölçeklendirilebileceğini göstermek için örnek bir uygulama (Fancy Store'un e-ticaret web sitesi) dağıtacaksınız.

Neler öğreneceksiniz?

Codelab'in sonunda web sitenize otomatik iyileştirme, yük dengeleme, otomatik ölçeklendirme ve periyodik güncellemeler sağlamak üzere yönetilen örnek gruplarının içinde örnekleriniz olacak.

Ön koşullar

2. Ortam kurulumu

Kendi hızınızda ortam kurulumu

  1. 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.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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.

  1. Sonraki adımda, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. "Temizleme" bölümündeki talimatları izlediğinizden emin olun. bölümünde, bu eğiticinin dışında faturalandırmayla karşılaşmamanız için kaynakları nasıl kapatacağınız konusunda tavsiyelerde bulunuyoruz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Compute Engine API'yi etkinleştirme

Sonraki adımda Compute Engine API'yi etkinleştirmeniz gerekir. API'yi etkinleştirebilmek için API'nin hizmet şartlarını ve faturalandırma sorumluluğunu kabul etmeniz gerekir.

Cloud Shell'de aşağıdaki kodu yürüterek Compute Engine API'yi etkinleştirin:

gcloud services enable compute.googleapis.com

Cloud Shell

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksını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 a8460e837e9f5fda.png simgesini tıklamanız yeterlidir (sağlanması ve ortama bağlanması yalnızca birkaç dakika sürer).

b532b2f19ab85dda.png

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:

2485e00c1223af09.png

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.

Cloud Storage paketi oluşturma

Hem derleme kodumuzu hem de başlangıç komut dosyalarımızı barındırmak için bir Cloud Storage paketi kullanacağız. Cloud Shell'de aşağıdaki komutu yürüterek yeni bir Cloud Storage paketi oluşturun:

gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID

3. Kaynak depoyu klonlama

Web sitenizin temeli olarak monolitten mikro hizmetlere veri deposunu temel alan Fancy Store'un mevcut e-ticaret web sitesini kullanacaksınız. Compute Engine'e dağıtımla ilgili özelliklere odaklanabilmek için deponuzdaki kaynak kodunu klonlayacaksınız. Ardından, Compute Engine'deki güncellemelerin ne kadar basit olduğunu göstermek için kodda küçük bir güncelleme yapacaksınız.

Kod deposunu otomatik olarak projeye klonlayabilir, ayrıca Cloud Shell'i ve yerleşik kod düzenleyiciyi açmak için şu bağlantıyı kullanabilirsiniz: Cloud Shell'de aç.

Alternatif olarak, Cloud Shell'de aşağıdaki komutları kullanarak depoyu manuel olarak klonlayabilirsiniz:

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

Uygulamanın yerel olarak çalıştırılmasını sağlamak için Cloud Shell komut isteminde kodun ilk derlemesini çalıştırın. Komut dosyasının çalışması birkaç dakika sürebilir.

./setup.sh

Gerekli özeni gösterin ve uygulamanızı test edin. Web sunucunuzu başlatmak için aşağıdaki komutu çalıştırın:

cd microservices
npm start

Çıkış:

Products microservice listening on port 8082!
Frontend microservice listening on port 8080!
Orders microservice listening on port 8081!

Web önizlemesi simgesini tıklayıp "Preview on port 8080" (8080 bağlantı noktasında önizle) seçeneğini belirleyerek uygulamanızı önizleyin.

6634c06dd0b9172c.png

Bunu yaptığınızda Fancy Store'un ön ucunu iş başında görebileceğiniz yeni bir pencere açılacaktır.

abf2ca314bf80d03.png

Web sitesini görüntüledikten sonra bu pencereyi kapatabilirsiniz. Web sunucusu işlemini durdurmak için terminal penceresinde Control+C (Macintosh'ta Command+C) tuşuna basın.

4. Compute Engine örnekleri oluşturma

Geliştirme ortamınız çalışır durumda olduğuna göre artık bazı Compute Engine örneklerini dağıtabilirsiniz. Aşağıdaki adımlarda şunları yapacaksınız:

  1. Örnekleri yapılandırmak için başlangıç komut dosyası oluşturma
  2. Kaynak kodunu klonlama ve Cloud Storage'a yükleme
  3. Arka uç mikro hizmetlerini barındırmak için bir Compute Engine örneği dağıtma
  4. Arka uç mikro hizmetler örneğini kullanmak için ön uç kodunu yeniden yapılandırma
  5. Ön uç mikro hizmetini barındırmak için Compute Engine örneği dağıtma
  6. İletişime olanak tanıyacak şekilde ağı yapılandırma

Başlangıç komut dosyası oluşturun

Başlangıç komut dosyası, örneğe her başlatıldığında ne yapılacağına ilişkin talimatları vermek için kullanılır. Bu yolla örnekler otomatik olarak yapılandırılır.

Kod düzenleyiciyi açmak için Cloud Shell şeridindeki kalem simgesini tıklayın.

monolith-to-microservices klasörüne gidin. File (Dosya) seçeneğini tıklayın > Yeni Dosya'yı tıklayın ve startup-script.sh adlı bir dosya oluşturun.

439553c934139b82.png

Aşağıdaki kodu yeni dosyaya yapıştırın. Yapıştırdıktan sonra bazılarını düzenleyeceksiniz:

#!/bin/bash

# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &

# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc

# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm

# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/

# Install app dependencies.
cd /fancy-store/
npm install

# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app

# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF

supervisorctl reread
supervisorctl update

Şimdi, kod düzenleyicide [DEVSHELL_PROJECT_ID] metnini bulup aşağıdaki komutun çıkışıyla değiştirin:

echo $DEVSHELL_PROJECT_ID

Örnek çıkış:

my-gce-codelab-253520

startup-script.sh dosyasındaki kod satırı şimdi aşağıdakine benzer olmalıdır:

gs://fancy-store-my-gce-codelab-253520/monolith-to-microservices/microservices/* /fancy-store/

Başlangıç komut dosyası aşağıdaki görevleri yerine getirir:

  • Syslog'dan günlükleri otomatik olarak toplayan Günlük Kaydı aracısının kurulumu
  • Uygulamayı arka plan programı olarak çalıştıran Node.js ve Supervisor'ın yüklenmesi
  • Cloud Storage paketinden uygulamanın kaynak kodunun klonlanması ve bağımlılıkların yüklenmesi
  • Uygulamayı çalıştıran Supervisor'ın yapılandırması, beklenmedik bir şekilde çıkış yapılırsa veya bir yönetici ya da proses tarafından durdurulursa uygulamanın yeniden başlatılmasını ve uygulamanın stdout ile stderr değerlerini Günlük Kaydı aracısının toplaması için syslog'a göndermesini sağlar.

Şimdi, oluşturulan startup-script.sh dosyasını daha önce oluşturduğunuz Cloud Storage paketine kopyalayın:

gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID

Artık dosyaya https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh adresinden erişebilirsiniz. [BUCKET_NAME], Cloud Storage paketinin adını temsil eder. Bu paket, varsayılan olarak yalnızca yetkili kullanıcılar ve hizmet hesapları tarafından görüntülenebilir. Dolayısıyla web tarayıcısı üzerinden erişilemez. Compute Engine örnekleri kendi hizmet hesapları aracılığıyla bu pakete otomatik olarak erişebilir.

Kodu Cloud Storage paketine kopyalama

Örnekler başlatıldığında kod Cloud Storage paketinden alınır. Böylece bazı yapılandırma değişkenlerini ".env" içinde depolayabilirsiniz. ile başlamalıdır.

Klonlanan kodu Cloud Storage paketine kopyalayın:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Arka uç örneğini dağıtma

Dağıtacağınız ilk örnek, siparişleri ve ürünlerin mikro hizmetlerini barındıracak olan arka uç örneği olacaktır.

Önceden oluşturduğunuz başlangıç komut dosyasını kullanacak şekilde yapılandırılan ve arka uç örneği olarak etiketlenmiş bir f1-micro örneği oluşturmak için Cloud Shell'de aşağıdaki komutu yürütün. Böylece, bu örneğe daha sonra belirli güvenlik duvarı kurallarını uygulayabilirsiniz:

gcloud compute instances create backend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=backend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh

Arka uca bağlantıyı yapılandırma

Uygulamanın ön ucunu dağıtmadan önce yapılandırmayı dağıttığınız arka uca işaret edecek şekilde güncellemeniz gerekir.

Arka ucun harici IP adresini alın. Bu adres, arka uç örneği için EXTERNAL_IP sekmesi altındaki aşağıdaki komuttan görülebilir:

gcloud compute instances list

Örnek çıkış:

NAME     ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
backend  us-central1-a  f1-micro                   10.128.0.2   34.68.223.88  RUNNING

Cloud Shell'in kod düzenleyicisinde monolith-to-microservices klasörüne gidin > react-app. Kod Düzenleyici menüsünden Görünüm > Gizli Dosyalar'ı açın/kapatın.env dosyasını görmek için.

e7314ceda643e16.png

.env dosyasını arka ucun harici IP adresine işaret edecek şekilde düzenleyin. [ARKA_UÇ_ADRESİ], gcloud aracındaki önceki komutta belirlenen arka uç örneğinin harici IP adresini temsil eder.

REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products

Dosyayı kaydedin.

Aşağıdaki komutu kullanarak tepki uygulamasını yeniden derleyin. Bu işlemle ön uç kodu güncellenir:

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Uygulama kodunu Cloud Storage paketine kopyalayın:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Ön uç örneğini dağıtma

Kod yapılandırıldığına göre artık ön uç örneğini dağıtabilirsiniz. Ön uç örneğini öncekine benzer bir komutla dağıtmak için aşağıdaki kodu yürütün. Ancak bu örnek "frontend" olarak etiketlenmiştir .

gcloud compute instances create frontend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=frontend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh 

Ağı yapılandırın

Ön uç için bağlantı noktası 8080'e ve arka uç için de bağlantı noktası 8081 ile 8082'ye erişim sağlayacak güvenlik duvarı kuralları oluşturun. Güvenlik duvarı komutlarında, uygulama için örnek oluşturulurken atanan etiketler kullanılır.

gcloud compute firewall-rules create fw-fe \
    --allow tcp:8080 \
    --target-tags=frontend
gcloud compute firewall-rules create fw-be \
    --allow tcp:8081-8082 \
    --target-tags=backend

Web sitesi artık çalışır durumda olmalıdır. Ön ucun harici IP adresini belirleyin. Adres, ön uç örneğinin EXTERNAL_IP bilgisi aratılarak belirlenebilir:

gcloud compute instances list

Örnek çıkış:

NAME      ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
backend   us-central1-a  f1-micro                   10.128.0.2   104.198.235.171  RUNNING
frontend  us-central1-a  f1-micro                   10.128.0.3   34.69.141.9      RUNNING

Örneğin başlatılması ve yapılandırılması birkaç dakika sürebilir. Uygulamanın hazır olma durumunu izlemek için aşağıdaki komutu yürütün:

watch -n 5 curl http://[EXTERNAL_IP]:8080 

Aşağıdakine benzer bir çıkış gördüğünüzde web sitesi hazır olacaktır. Saat komutunu iptal etmek için, komut isteminde Control+C (Macintosh'ta Command+C) tuşuna basın.

80dc8721dc08d7e4.png

Web sitesine erişmek için yeni bir web tarayıcısı sekmesi kullanarak http://[ÖN_UÇ_ADRESİ]:8080 adresine gidin. Burada [ÖN_UÇ_ADRESİ], yukarıda belirlenen EXTERNAL_IP değeridir.

Ürünler ve Siparişler sayfalarına gitmeyi deneyin. Talimatlar da çalışacaktır.

a11460a1fffb07d8.png

5. Yönetilen örnek grupları oluşturma

Uygulamanızın ölçeklendirilmesine olanak sağlamak için yönetilen örnek grupları oluşturulur ve bunlar, örnek şablonu olarak frontend ve backend örneklerini kullanır.

Yönetilen örnek grupları, tek bir alt bölgede tek bir varlık olarak yönetebileceğiniz benzer örnekleri içerir. Yönetilen örnek grupları, örneklerinizi proaktif olarak kullanılabilir durumda, diğer bir deyişle RUNNING (ÇALIŞIYOR) durumda tutarak yüksek kullanılabilirlik sağlar. Otomatik iyileştirme, yük dengeleme, otomatik ölçeklendirme ve periyodik güncellemeler sağlamak amacıyla ön uç ve arka uç örneklerinizde yönetilen örnek grupları kullanacaksınız.

Kaynak örnekten örnek şablonu oluşturma

Yönetilen örnek grubu oluşturabilmek için önce grubun temelini sağlayan bir örnek şablonu oluşturmanız gerekir. Örnek şablonları yeni sanal makine örnekleri oluştururken kullanılacak makine türü, önyükleme diski görüntüsü veya kapsayıcı görüntüsü, ağ ve diğer örnek özelliklerini tanımlamanıza olanak sağlar. Örnek şablonlarını kullanarak yönetilen örnek grubunun içinde örnekler oluşturabileceğiniz gibi tek tek örnekler bile oluşturabilirsiniz.

Örnek şablonunu oluşturmak için hazırladığınız mevcut örnekleri kullanın.

İlk olarak her iki örneği de durdurmanız gerekir.

gcloud compute instances stop frontend
gcloud compute instances stop backend

Şimdi kaynak örneklerden örnek şablonu oluşturun.

gcloud compute instance-templates create fancy-fe \
    --source-instance=frontend
gcloud compute instance-templates create fancy-be \
    --source-instance=backend

Örnek şablonlarının oluşturulduğunu onaylayın:

gcloud compute instance-templates list

Örnek çıkış:

NAME      MACHINE_TYPE  PREEMPTIBLE  CREATION_TIMESTAMP
fancy-be  f1-micro                   2019-09-12T07:52:57.544-07:00
fancy-fe  f1-micro                   2019-09-12T07:52:48.238-07:00

Yönetilen örnek grubu oluşturma

Biri ön uç, diğeri de arka uç için olmak üzere iki yönetilen örnek grubu oluşturacaksınız. Bu yönetilen örnek grupları daha önce oluşturulmuş örnek şablonlarını kullanır ve her grupta her biri birer örnek olmak üzere iki örneğin başlatılacağı şekilde yapılandırılır. Örnekler "base-instance-name" temel alınarak otomatik olarak adlandırılır eklenmiş rastgele karakterlerle belirtilir.

gcloud compute instance-groups managed create fancy-fe-mig \
    --base-instance-name fancy-fe \
    --size 2 \
    --template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
    --base-instance-name fancy-be \
    --size 2 \
    --template fancy-be

Sizin uygulamanızda ön uç mikro hizmeti 8080 bağlantı noktasında çalışırken arka uç mikro hizmetleri siparişler için bağlantı noktası 8081 ve ürünler için bağlantı noktası 8082 üzerinde çalışır. Bunların standart olmayan bağlantı noktaları olduğundan, bunları tanımlamak için adlandırılmış bağlantı noktaları belirtirsiniz. Adlandırılmış bağlantı noktaları, hizmet adını ve bu hizmetin üzerinde çalıştırıldığı bağlantı noktasını temsil eden anahtar:değer çifti meta verileridir. Adlandırılmış bağlantı noktaları bir örnek grubuna atanabilir ve bu da hizmetin gruptaki tüm örneklerde kullanılabilir olduğunu gösterir. Bu bilgiler, daha sonra yapılandıracağınız yük dengeleyici tarafından kullanılır.

gcloud compute instance-groups set-named-ports fancy-fe-mig \ 
    --named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
    --named-ports orders:8081,products:8082

Otomatik iyileştirmeyi yapılandırma

Uygulamanın kullanılabilirliğini iyileştirmek ve yanıt verdiğini doğrulamak amacıyla yönetilen örnek grupları için otomatik iyileştirme politikası yapılandırabilirsiniz.

Otomatik iyileştirme politikası uygulamanın beklendiği gibi yanıt verdiğini doğrulamak için uygulama tabanlı durum denetimine güvenir. Uygulamanın yanıt verip vermediğini denetlemek, yalnızca örneğin ÇALIŞIYOR durumda olduğunu doğrulamaktan (varsayılan davranış) daha kesin sonuç verir.

Ön uç ve arka uç için art arda üç kez kötü durumda döndürülürse örneği onaran bir durum denetimi oluşturun:

gcloud compute health-checks create http fancy-fe-hc \
    --port 8080 \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
    --port 8081 \
    --request-path=/api/orders \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3

Durum denetimi kontrollerinin 8080 ve 8081 bağlantı noktalarında mikro hizmetlere bağlanmasını sağlamak için bir güvenlik duvarı kuralı oluşturun:

gcloud compute firewall-rules create allow-health-check \
    --allow tcp:8080-8081 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 \
    --network default

Durum denetimlerini ilgili hizmetlerine uygulayın:

gcloud compute instance-groups managed update fancy-fe-mig \
    --health-check fancy-fe-hc \
    --initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
    --health-check fancy-be-hc \
    --initial-delay 300

Otomatik iyileştirmenin gruptaki örnekleri izlemesine biraz zaman tanımak için codelab'e devam edin. Daha sonra, otomatik iyileştirmeyi test etmek için bir hatayı simüle edeceksiniz.

6. Yük dengeleyici oluştur

Yönetilen örnek gruplarımızı tamamlamak amacıyla ön uç ve arka uç mikro hizmetlerine trafik sağlamak için HTTP(S) Yük Dengeleme'yi, yol oluşturma kurallarına göre uygun arka uç hizmetlerine trafik göndermek için eşlemeleri kullanacaksınız. Bu sayede tüm hizmetler için yük dengeli tek bir IP adresi elde edilir.

Google Cloud'da kullanılabilen yük dengeleme seçenekleri hakkında daha fazla bilgi edinmek için Yük Dengelemeye Genel Bakış sayfasını inceleyin.

HTTP(S) Yük Dengeleme Oluşturma

Google Cloud birçok farklı türde yük dengeleme sunar ancak trafiğiniz için HTTP(S) Yük Dengelemeyi kullanırsınız. HTTP(S) Yük Dengeleme şu şekilde yapılandırılır:

  1. Bir iletim kuralı gelen istekleri hedef HTTP proxy'ye yönlendirir.
  2. Hedef HTTP proxy isteğe uygun arka uç hizmetini belirlemek için her isteği bir URL eşlemesine göre denetler.
  3. Arka uç hizmeti; ekli arka uçlarının hizmet kapasitesi, alt bölgesi ve örnek durumuna göre her isteği uygun arka uca yönlendirir. Her arka uç örneğinin durumu HTTP durum denetimi kullanılarak doğrulanır. Arka uç hizmeti HTTPS veya HTTP/2 durum denetimi kullanacak şekilde yapılandırıldıysa istek, arka uç örneğine giderken şifrelenir.
  4. Yük dengeleyici ile örnek arasındaki oturumlar HTTP, HTTPS veya HTTP/2 protokolünü kullanabilir. HTTPS veya HTTP/2 kullanırsanız arka uç hizmetlerindeki her örneğin bir SSL sertifikası olmalıdır.

Her hizmette trafik sunabilecek örnekleri belirlemek için kullanılacak durum denetimlerini oluşturun.

gcloud compute http-health-checks create fancy-fe-frontend-hc \
  --request-path / \
  --port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \
  --request-path /api/orders \
  --port 8081
gcloud compute http-health-checks create fancy-be-products-hc \
  --request-path /api/products \
  --port 8082

Yük dengeli trafiğin hedefi olan arka uç hizmetlerini oluşturun. Arka uç hizmetleri sizin oluşturduğunuz durum denetimlerini ve adlandırılmış bağlantı noktalarını kullanır.

gcloud compute backend-services create fancy-fe-frontend \
  --http-health-checks fancy-fe-frontend-hc \
  --port-name frontend \
  --global
gcloud compute backend-services create fancy-be-orders \
  --http-health-checks fancy-be-orders-hc \
  --port-name orders \
  --global
gcloud compute backend-services create fancy-be-products \
  --http-health-checks fancy-be-products-hc \
  --port-name products \
  --global

Arka uç hizmetlerini ekleyin.

gcloud compute backend-services add-backend fancy-fe-frontend \
  --instance-group fancy-fe-mig \
  --instance-group-zone us-central1-f \
  --global
gcloud compute backend-services add-backend fancy-be-orders \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-f \
  --global
gcloud compute backend-services add-backend fancy-be-products \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-f \
  --global

URL eşlemesi oluşturun. URL eşlemesi hangi URL'lerin hangi arka uç hizmetlerine yönlendirildiğini tanımlar.

gcloud compute url-maps create fancy-map \
  --default-service fancy-fe-frontend

/api/orders ve /api/products yollarının ilgili hizmetlere yönlendirilmesini sağlamak için bir yol eşleştirici oluşturun.

gcloud compute url-maps add-path-matcher fancy-map \
   --default-service fancy-fe-frontend \
   --path-matcher-name orders \
   --path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"

Oluşturulan URL eşlemesine bağlanan bir proxy oluşturun.

gcloud compute target-http-proxies create fancy-proxy \
  --url-map fancy-map

Herkese açık IP adresini ve bağlantı noktasını proxy'ye bağlayan bir genel iletim kuralı oluşturun.

gcloud compute forwarding-rules create fancy-http-rule \
  --global \
  --target-http-proxy fancy-proxy \
  --ports 80

Yapılandırmayı güncelleyin

Artık yeni bir statik IP adresiniz olduğuna göre ön uçtaki kodu, daha önce kullanılan ve backend örneğine işaret eden geçici adres yerine yeni adrese işaret edecek şekilde güncellemeniz gerekir.

Cloud Shell'de, yapılandırmanın bulunduğu .env dosyasını barındıran tepki-uygulama klasörüne geçin.

cd ~/monolith-to-microservices/react-app/

Yük dengeleyicinin IP adresini bulun:

gcloud compute forwarding-rules list --global

Örnek çıkış:

NAME                    REGION  IP_ADDRESS     IP_PROTOCOL  TARGET
fancy-http-rule          34.102.237.51  TCP          fancy-proxy

Tercih ettiğiniz metin düzenleyiciyle (ör. GNU nano) .env dosyasını yük dengeleyicinin herkese açık IP adresine işaret edecek şekilde düzenleyin. [LB_IP], arka uç örneğinin harici IP adresini temsil eder.

REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products

Ön uç kodunu güncelleyecek olan tepki uygulamasını yeniden derleyin.

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Uygulama kodunu GCS paketine kopyalayın.

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Ön uç örneklerini güncelleme

Şimdi, yönetilen örnek grubundaki ön uç örneklerinin yeni kodu almasını istiyorsunuz. Örnekleriniz, başlatma sırasında kodu alır. Böylece periyodik bir yeniden başlatma komutu düzenleyebilirsiniz.

gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
    --max-unavailable 100%

Web sitesini test etme

Örneklerin işlenmesine zaman tanımak için rolling-action restart komutunu yayınladıktan sonra yaklaşık 30 saniye bekleyin. Ardından, örnekler listede görünene kadar yönetilen örnek grubunun durumunu kontrol edin.

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

Öğeler listede göründükten sonra, Control+C (Macintosh'ta Command+C) tuşuna basarak Watch komutundan çıkın.

Hizmetin iyi durumda olduğunu doğrulayın.

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

Örnek çıkış:

---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
  healthStatus:
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
    ipAddress: 10.128.0.7
    port: 8080
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
    ipAddress: 10.128.0.11
    port: 8080
  kind: compute#backendServiceGroupHealth

Öğeler listede göründüğünde, Control+C (Macintosh'ta Command+C) tuşuna basarak watch komutundan çıkın.

Ardından uygulamaya http://[LB_IP] üzerinden erişilebilir. Burada [LB_IP], yük dengeleyici için belirlenen IP_ADDRESS değeridir ve aşağıdaki komutla bulunabilir:

gcloud compute forwarding-rules list --global

7. Compute Engine'i ölçeklendirme

Şimdiye kadar her birinde iki örnek bulunan iki yönetilen örnek grubu oluşturdunuz. Tamamen işlevsel ama yükten bağımsız olarak statik bir yapılandırmadır. Şimdi, her yönetilen örnek grubunu otomatik olarak ölçeklendirmek üzere kullanımı temel alan bir otomatik ölçeklendirme politikası oluşturacaksınız.

Kullanıma göre otomatik olarak yeniden boyutlandırma

Otomatik ölçeklendirme politikası oluşturmak için Cloud Shell'de aşağıdaki komutları yürütün. Yönetilen örnek gruplarında, yük dengeleyicinin kullanım oranı% 60'ı aştığında otomatik olarak örnek ekleyen ve yük dengeleyici% 60 kullanım oranının altına düştüğünde örnek kaldıran bir otomatik ölçekleyici oluştururlar.

gcloud compute instance-groups managed set-autoscaling \
  fancy-fe-mig \
  --max-num-replicas 5 \
  --target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \
  fancy-be-mig \
  --max-num-replicas 5 \
  --target-load-balancing-utilization 0.60

İçerik yayınlama ağını etkinleştirme

Ölçeklendirmeye yardımcı olabilecek bir diğer özellik, ön uç hizmeti için önbelleğe alma sağlamak üzere bir içerik yayınlama ağ hizmeti olan Cloud CDN'yi etkinleştirmektir. Bunun için ön uç hizmetinizde aşağıdaki komutu çalıştırabilirsiniz:

gcloud compute backend-services update fancy-fe-frontend \
    --enable-cdn --global

Artık bir kullanıcı yük dengeleyiciden içerik istediğinde istek bir Google ön ucuna gelir ve bu ön uç, kullanıcı isteğinin yanıtı için ilk olarak Cloud CDN önbelleğine bakar. Ön uç önbelleğe alınmış bir yanıt bulursa önbellekteki yanıtı kullanıcıya gönderir. Buna önbellek isabeti denir.

Aksi takdirde, ön uç istek için önbelleğe alınmış bir yanıt bulamazsa doğrudan arka uca istekte bulunur. Bu isteğin yanıtı önbelleğe alınabiliyorsa ön uç, yanıtı Cloud CDN önbelleğinde depolar ve bu şekilde sonraki isteklerde önbellek kullanılabilir.

8. Web sitesini güncelle

Örnek şablonunu güncelleme

Mevcut örnek şablonları düzenlenemez. Bununla birlikte, örneklerinizin durum bilgisiz olduğu ve tüm yapılandırmanın başlangıç komut dosyası aracılığıyla yapıldığı göz önünde bulundurulduğunda, şablon ayarları temel görüntüsünün kendisini değiştirmek istediğinizde örnek şablonunu değiştirmeniz yeterlidir. Şimdi, daha büyük bir makine türü kullanıp bunu yaymak için basit bir değişiklik yapacaksınız.

Örnek şablonu için temel işlevi gören ön uç örneğini güncelleyin. Güncelleme sırasında örnek şablonu görüntüsünün güncellenmiş sürümüne bir dosya yerleştirecek, ardından örnek şablonunu güncelleyecek, yeni şablonu kullanıma sunacak ve dosyanın yönetilen örnek grubu örneklerinde mevcut olduğunu onaylayacaksınız.

f1-micro standart makine türünden 4 vCPU ve 3840 MiB RAM'e sahip bir özel makine türüne geçerek örnek şablonunuzun makine türünü değiştireceksiniz.

Cloud Shell'de aşağıdaki komutu çalıştırarak frontend örneğinin makine türünü değiştirin:

gcloud compute instances set-machine-type frontend --machine-type custom-4-3840

Yeni örnek şablonunu oluşturun:

gcloud compute instance-templates create fancy-fe-new \
    --source-instance=frontend \
    --source-instance-zone=us-central1-a

Güncellenen örnek şablonunu yönetilen örnek grubunun kullanımına sunun:

gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
    --version template=fancy-fe-new

Güncellemenin durumunu izleyin:

watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig

RUNNING durumunda birden fazla örneğiniz olduğunda, ACTION None olarak ayarlandığında ve INSTANCE_TEMPLATE yeni şablon adı (fancy-fe-new) olarak ayarlandığında sonraki komutta kullanılmak üzere listelenen makinelerden birinin adını kopyalayın.

Control+S (Macintosh'ta Command+S) tuşlarına basarak izleme işleminden çıkın.

Sanal makinenin yeni makine türünü (custom-4-3840) kullanıp kullanmadığını görmek için aşağıdakini çalıştırın; burada [SANAL MAKİNE_ADI], yeni oluşturulan örnektir:

gcloud compute instances describe [VM_NAME] | grep machineType

Beklenen örnek çıkış:

machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840

Web sitesinde değişiklik yapma

Pazarlama ekibiniz sizden sitenizin ana sayfasını değiştirmenizi istedi. Bu sayfanın şirketinizin kimliği ve aslında nelerin satışını yaptığı konusunda daha bilgilendirici olması gerektiğini düşünüyorlar. Bu bölümde pazarlama ekibini mutlu etmek için ana sayfaya bazı metinler ekleyeceksiniz. Geliştiricilerinizden biri, istenen değişiklikleri index.js.new dosya adıyla zaten oluşturmuş. Dosyayı index.js dosyasına kopyalarsanız değişiklikleriniz sayfaya yansıtılacaktır. Uygun değişiklikleri yapmak için aşağıdaki talimatları uygulayın.

Aşağıdaki komutları çalıştırın, güncellenen dosyayı doğru dosya adına kopyalayın ve ardından değişiklikleri doğrulamak için dosyanın içeriğini yazdırın:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

Bu işlem sonucunda elde edilen kod aşağıdaki gibi görünmelidir:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

React bileşenlerini güncellediniz ancak statik dosyaları oluşturmak için React uygulamasını derlemeniz gerekiyor. React uygulamasını derlemek için aşağıdaki komutu çalıştırın ve monolitin herkese açık dizinine kopyalayın:

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

Ardından kodu tekrar Cloud Storage paketinize aktarın.

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

Periyodik güncellemeleri kullanarak değişiklikleri aktarma

Artık güncellemeyi almak için tüm örnekleri yeniden başlatmaya zorlayabilirsiniz.

gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
    --max-unavailable=100%

Örneklerin işlenmesine zaman tanımak için periyodik işlem yeniden başlatma komutu gönderildikten sonra yaklaşık 30 saniye bekleyin ve ardından örnekler listede görünene kadar yönetilen örnek grubunun durumunu kontrol edin.

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

Öğeler listede göründüğünde, Control+S (Macintosh'ta Command+S) tuşuna basarak Watch komutundan çıkın.

Hizmetin sağlıklı olarak listelendiğini onaylamak için aşağıdaki komutu çalıştırın:

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

Örnek çıkış:

---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
  healthStatus:
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
    ipAddress: 10.128.0.7
    port: 8080
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
    ipAddress: 10.128.0.11
    port: 8080
  kind: compute#backendServiceGroupHealth

Öğeler listede göründükten sonra, Control+S (Macintosh'ta Command+S) tuşuna basarak Watch komutundan çıkın.

İçerik yayınlama ağındaki önbelleğe alınmış içeriği geçersiz kılmak ve yeni içeriğin gösterildiğinden emin olmak için aşağıdakileri çalıştırın:

gcloud compute url-maps invalidate-cdn-cache fancy-map \
    --path "/*"

Web sitesine http://[LB_IP] üzerinden göz atabilirsiniz. Burada [LB_IP], yük dengeleyici için belirlenen IP_ADDRESS değeridir ve aşağıdaki komutla bulunabilir:

gcloud compute forwarding-rules list --global

Yeni web sitesi değişiklikleri artık görülebiliyor olmalıdır.

b081b8e885bf0723.png

Hata simülasyonu

Durum denetiminin çalıştığını onaylamak için bir örneğe giriş yapın ve hizmetleri durdurun. Örnek adını bulmak için aşağıdakini yürütün:

gcloud compute instance-groups list-instances fancy-fe-mig

Buradan, güvenli kabuk aşağıdaki örneklerden birinde oluşturulur; burada ÖRNEK_ADI, listedeki örneklerden biridir:

gcloud compute ssh [INSTANCE_NAME]

Örnekte uygulamayı durdurmak için supervisorctl'i kullanın.

sudo supervisorctl stop nodeapp; sudo killall node

Örnekten çıkın.

exit

Onarım işlemlerini izleyin.

watch -n 5 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'

Aşağıdaki örnek çıkışı bulun:

NAME                                                  TYPE                                       TARGET                                 HTTP_STATUS  STATUS  TIMESTAMP
repair-1568314034627-5925f90ee238d-fe645bf0-7becce15  compute.instances.repair.recreateInstance  us-central1-a/instances/fancy-fe-1vqq  200          DONE    2019-09-12T11:47:14.627-07:00

Onarım işlemi fark edildikten sonra, saat komutundan çıkmak için Control+C (Macintosh'ta Command+S). Bu noktada, yönetilen örnek grubu örneği onarmak için yeniden oluşturur.

9. Temizleme

Hazır olduğunuzda, gerçekleştirilen tüm faaliyetleri temizlemenin en kolay yolu projeyi silmektir. Proje silindiğinde, beklenmedik yinelenen ücretlerin oluşmaması için codelab'de oluşturulan yük dengeleyici, örnekler, şablonlar ve diğer öğeler silinir. Cloud Shell'de aşağıdaki kodu yürütün. Burada PROJECT_ID yalnızca proje adını değil, tam proje kimliğini de temsil eder.

gcloud projects delete [PROJECT_ID]

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

10. Tebrikler!

Web sitenizi Compute Engine üzerinde dağıttınız, ölçeklendirdiniz ve güncellediniz. Artık Compute Engine, yönetilen örnek grupları, yük dengeleme ve durum denetimleri konularında deneyimli bir kullanıcısınız.