1. Giriş
Google Cloud'da web sitelerini dağıtmanın birçok yolu vardır ve her çözüm farklı özellikler, beceriler ve kontrol seviyeleri sunar. Compute Engine, web sitesini çalıştırırken kullanılan altyapı üzerinde kapsamlı kontrol olanağı sunmakla birlikte, Google Kubernetes Engine, App Engine veya diğer çözümlere göre 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 olan Fancy Store'un e-ticaret web sitesini dağıtacaksınız.
Neler öğreneceksiniz?
- Compute Engine örnekleri oluşturma
- Kaynak örnekleri kullanarak örnek şablonları oluşturma
- Yönetilen örnek grupları oluşturma
- Durum denetimleri ve otomatik iyileştirme nasıl ayarlanır?
- HTTP(S) yük dengeleme oluşturma
- Yük dengeleyiciler için durum denetimleri oluşturma
- Önbelleğe alma için içerik yayınlama ağı kullanma
Bu 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
- Bu laboratuvarda kullanacağımız kavramların tanıtım amaçlı özetleri için lütfen aşağıdaki materyali inceleyin:
- Google Cloud Platform'a Hoş Geldiniz - GCP'nin Temel Unsurları
- Google Cloud Compute Engine'i Kullanmaya Başlama
- Google Cloud Storage'ı kullanmaya başlama
- Başlangıç: Cloud Shell
2. Ortam kurulumu
Yönlendirmesiz ortam kurulumu
- Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.



Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.
- Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Compute Engine API'yi etkinleştirme
Ardından Compute Engine API'yi etkinleştirmeniz gerekir. Bir API'yi etkinleştirmek için hizmet şartlarını ve API'nin faturalandırma sorumluluğunu kabul etmeniz gerekir.
Cloud Shell'de Compute Engine API'yi etkinleştirmek için aşağıdaki komutu yürütün:
gcloud services enable compute.googleapis.com
Cloud Shell
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksını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).
- Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir 'i
tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer).


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:

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>
- 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.
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 yeni bir Cloud Storage paketi oluşturmak için aşağıdaki komutu yürütün:
gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID
3. Kaynak depoyu klonlama
Web sitenizin temeli olarak, Fancy Store'un monolith-to-microservices deposuna dayanan 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. Daha sonra, Compute Engine'de güncelleme işleminin ne kadar basit olduğunu göstermek için kodda küçük bir güncelleme yapacaksınız.
Aşağıdaki bağlantıyı kullanarak kod deposunu projeye otomatik olarak klonlayabilir, Cloud Shell'i ve yerleşik kod düzenleyiciyi açabilirsiniz: Open in Cloud Shell (Cloud Shell'de Aç).
Alternatif olarak, Cloud Shell'de aşağıdaki komutlarla depoyu manuel olarak klonlayabilirsiniz:
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices
Cloud Shell komut isteminde, uygulamanın yerel olarak çalıştırılmasını sağlamak için 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 "8080 numaralı bağlantı noktasında önizle"yi seçerek uygulamanızı önizleyin.

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

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:
- Örnekleri yapılandırmak için başlangıç komut dosyası oluşturma
- Kaynak kodunu klonlayın ve Cloud Storage'a yükleyin.
- Arka uç mikro hizmetlerini barındırmak için bir Compute Engine örneği dağıtma
- Arka uç mikro hizmetler örneğini kullanmak için ön uç kodunu yeniden yapılandırma
- Ön uç mikro hizmetini barındırmak için Compute Engine örneği dağıtma
- İletişime olanak tanıyacak şekilde ağı yapılandırma
Başlangıç komut dosyası oluşturma
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.
Cloud Shell şeridinde kalem simgesini tıklayarak kod düzenleyiciyi açın.
monolith-to-microservices klasörüne gidin. File (Dosya) > New File'ı (Yeni Dosya) tıklayın ve startup-script.sh adlı bir dosya oluşturun.

Yeni dosyaya aşağıdaki kodu yapıştırın. Bu kodun bir kısmını yapıştırdıktan sonra 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 bulun ve 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ı aşağıdaki gibi görünü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:
- Günlük kaydı aracısının yüklenmesi (bu aracı, syslog'dan günlükleri otomatik olarak toplar)
- Node.js ve Supervisor'ın yüklenmesi (Supervisor, uygulamayı bir arka plan programı olarak çalıştırır)
- Uygulamanın kaynak kodunun Cloud Storage paketinden klonlanması ve bağımlıların yüklenmesi
- Uygulamayı çalıştıran Süpervizör'ün yapılandırılması, beklenmedik bir şekilde çıkış yapılırsa veya bir yönetici ya da işlem tarafından durdurulursa uygulamanın yeniden başlatılmasını sağlar ve uygulamanın stdout ve stderr akışlarını günlük kaydı aracısı tarafından toplanması için syslog'a gönderir.
Şimdi oluşturulan startup-script.sh dosyasını daha önce oluşturduğunuz Cloud Storage paketinize kopyalayın:
gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID
Artık dosyaya şu adresten erişilebilir: https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh. [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 kodu Cloud Storage paketinden alırlar. Böylece bazı yapılandırma değişkenlerini kodun ".env" dosyası içinde depolayabilirsiniz.
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şler ve ürünler mikro hizmetlerini barındıracak olan arka uç örneği olacaktır.
Daha önce oluşturduğunuz başlangıç komut dosyasını kullanacak şekilde yapılandırılmış ve daha sonra belirli güvenlik duvarı kurallarını uygulayabilmeniz için arka uç örneği olarak etiketlenmiş bir f1-micro örneği oluşturmak üzere Cloud Shell'de aşağıdaki komutu yürütün:
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üntülenebilir:
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 > react-app klasörüne gidin. .env dosyasını görmek için Kod Düzenleyici menüsünden View > Toggle Hidden Files'ı (Görünüm > Gizli Dosyaları Aç/Kapat) seçin.

.env dosyasını arka ucun harici IP adresine işaret edecek şekilde düzenleyin. Aşağıdaki [BACKEND_ADDRESS], 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.
Ön uç kodunu güncelleyecek olan react-app'i yeniden derlemek için aşağıdaki komutu kullanın:
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
Artık kod yapılandırıldığına göre, ön uç örneğini dağıtabilirsiniz. Öncekine benzer bir komutla ön uç örneğini dağıtmak için aşağıdaki kodu yürütün. Ancak bu örnek, güvenlik duvarı nedeniyle "frontend" olarak etiketlenir.
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ırma
Ön uç için bağlantı noktası 8080'e ve arka uç için de bağlantı noktası 8081 ve 8082'ye erişim sağlayacak güvenlik duvarı kuralları oluşturun. Güvenlik duvarı komutları, örnek oluşturulurken atanan etiketleri kuralları uygulamak için kullanı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 işlevsel olmalıdır. Ön ucun harici IP adresini belirleyin. Adres, ön uç örneğinin EXTERNAL_IP değeri bulunarak 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ırlık durumunu izlemek için aşağıdakileri 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. Watch komutunu iptal etmek için komut isteminde Control+C (Macintosh'ta Command+C) tuşuna basın.

Web sitesine erişmek için yeni bir web tarayıcısı sekmesiyle http://[FRONTEND_ADDRESS]:8080 adresine gidin. Burada [FRONTEND_ADDRESS], yukarıda belirlenen EXTERNAL_IP değeridir.
Ürünler ve Siparişler sayfalarına gitmeyi deneyin. Bu sayfalar da çalışıyor olmalıdır.

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 şablonları olarak frontend ve backend örneklerini kullanır.
Yönetilen örnek grubu, tek bir alt bölgede tek varlık gibi yönetebileceğiniz birbirinin aynı örnekler 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 daha önce oluşturduğunuz mevcut örnekleri kullanın.
Öncelikle 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 arka uç için olmak üzere iki yönetilen örnek grubu oluşturacaksınız. Bu yönetilen örnek grupları, daha önce oluşturulan örnek şablonlarını kullanır ve her grubun içinde birer örnek olmak üzere iki örneğin başlatılacağı şekilde yapılandırılır. Örnekler, belirtilen "base-instance-name" temel alınarak otomatik olarak adlandırılır ve sonlarına rastgele karakterler eklenir.
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
Uygulamanızda ön uç mikro hizmeti bağlantı noktası 8080 üzerinde, arka uç mikro hizmetleri ise siparişler için bağlantı noktası 8081 ve ürünler için bağlantı noktası 8082 üzerinde çalışır. Bunlar 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 kendi kullanılabilirliğini artırmak ve yanıt verdiğini doğrulamak için yönetilen örnek gruplarına bir 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 RUNNING (ÇALIŞIYOR) durumda olduğunu doğrulamaktan (varsayılan davranış) daha kesin sonuç verir.
Ön uç ve arka uç için arka arkaya üç kez kötü durumda olarak 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 için, HTTP(S) yük dengeleme kullanarak trafiği ön uç ve arka uç mikro hizmetlerine sunacak ve eşlemeleri kullanarak trafiği yol kuralları temelinde doğru arka uç hizmetlerine göndereceksiniz. Bu sayede, tüm hizmetler için yük dengeli tek bir IP adresi olacaktır.
Google Cloud'da kullanılabilen yük dengeleme seçenekleri hakkında daha fazla bilgi için Yük Dengelemeye Genel Bakış başlıklı makaleyi 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 dengeleme kullanacaksınız. HTTP(S) yük dengeleme aşağıdaki gibi yapılandırılmıştır:
- Bir iletim kuralı gelen istekleri hedef HTTP proxy'ye yönlendirir.
- Hedef HTTP proxy isteğe uygun arka uç hizmetini belirlemek için her isteği bir URL eşlemesine göre denetler.
- 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.
- Yük dengeleyici ile örnek arasındaki oturumlar HTTP, HTTPS veya HTTP/2 protokolünü kullanabilir. HTTPS veya HTTP/2 kullanıyorsanı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, 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 frontend kodunu daha önce kullanılan ve backend örneğine işaret eden geçici adres yerine bu yeni adrese işaret edecek şekilde güncellemeniz gerekir.
Cloud Shell'de, içinde yapılandırmanın bulunduğu .env dosyasını barındıran react-app 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
Yük dengeleyicinin herkese açık IP adresini işaret etmek için .env dosyasını tercih ettiğiniz metin düzenleyiciyle (ör. GNU nano) 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 react-app'i 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
Artık yönetilen örnek grubundaki ön uç örneklerinin yeni kodu almasını istiyorsunuz. Örnekleriniz, başlatma sırasında kodu aldığından 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 komutu gönderildikten sonra 30 saniye kadar bekleyin. Ardından, örnekler listede gösterilene 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 olarak listelendiğini onaylayı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 watch komutundan çıkmak için Control+C tuşuna (Macintosh'ta Command+C) basın.
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. Bu, tam olarak 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. Bu komutlar, yönetilen örnek gruplarında yük dengeleyici% 60 kullanım oranının üzerine çıktığı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şturur.
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 içerik yayınlama ağı hizmeti olan Cloud CDN'yi etkinleştirmektir. Bunu yapmak için ön uç hizmetinizde aşağıdaki komutu yürütebilirsiniz:
gcloud compute backend-services update fancy-fe-frontend \
--enable-cdn --global
Artık bir kullanıcı yük dengeleyiciden içerik istediğinde istek, Google ön ucu hizmetine gelir ve bu hizmet de 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üncelleme
Örnek şablonunu güncelleme
Mevcut örnek şablonları düzenlenemez. Ancak örneklerinizin durum bilgisiz olduğundan ve tüm yapılandırma başlangıç komut dosyası yoluyla gerçekleştirildiğinden, şablon ayarlarını veya temel görüntüyü değiştirmek istediğinizde örnek şablonunu değiştirmeniz yeterlidir. Şimdi daha büyük bir makine türü kullanmak ve bunu dışarı çıkarmak için basit bir değişiklik yapacaksınız.
Örnek şablonuna temel oluşturan ö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 3.840 MiB RAM içeren bir özel makine türüne geçerek örnek şablonunuzun makine türünü değiştireceksiniz.
Cloud Shell'de, frontend örneğinin makine türünü değiştirmek için aşağıdaki komutu çalıştırın:
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
Durumu RUNNING olan, ACTION'ın None olarak ayarlandığı ve INSTANCE_TEMPLATE'in yeni şablon adı (fancy-fe-new) olarak ayarlandığı birden fazla örneğiniz olduğunda, sonraki komutta kullanılmak üzere listelenen makinelerden birinin adını kopyalayın.
Control+S (Macintosh'ta Command+S) tuşuna 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 memnun etmek için ana sayfaya bazı metinler ekleyeceksiniz. Geliştiricilerinizden biri, istenen değişiklikleri index.js.new adlı bir dosyada zaten hazırlamış. 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üncellenmiş dosyayı doğru dosya adına kopyalayın ve değişiklikleri doğrulamak için dosya 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 & 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 Cloud Storage paketinize tekrar 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üncellemelerle 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 rolling-action restart komutu gönderildikten sonra 30 saniye kadar bekleyin ve ardından örnekler listede gösterilene kadar yönetilen örnek grubunun durumunu denetleyin.
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.
Aşağıdaki komutu çalıştırarak hizmetin healthy (iyi durumda) olarak listelendiğini onaylayı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österilmesini sağlamak 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.

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, örneklerden birinde kabuğun güvenliğini sağlayın. Burada INSTANCE_NAME, listedeki örneklerden biridir:
gcloud compute ssh [INSTANCE_NAME]
Örneğin içinde supervisorctl kullanarak uygulamayı durdurun.
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 fark edildikten sonra, izleme komutundan çıkmak için Control+C (Macintosh'ta Command+S) tuşuna basın. Bu noktada, yönetilen örnek grubu, örneği yeniden oluşturarak sorunu çözdü.
9. Temizleme
Hazır olduğunuzda, gerçekleştirilen tüm etkinlikleri temizlemenin en kolay yolu projeyi silmektir. Projenin silinmesi, yük dengeleyiciyi, örnekleri, şablonları ve codelab sırasında oluşturulan diğer öğeleri siler. Böylece beklenmedik yinelenen ücretler oluşmaz. 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!
Web sitenizi Compute Engine'de 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.