Cloud Run ile web sitesi dağıtma

1. Başlamadan önce

Sanal Makine (VM) örneklerini, kümeleri, kapsülleri, hizmetleri ve daha fazlasını oluşturup yönetmenin ek yükü nedeniyle web sitelerini çalıştırmak zor olabilir. Büyük ve çok katmanlı uygulamalar için sorun yok ancak yalnızca web sitenizi dağıtıp görünür hale getirmek istiyorsanız bunun oldukça fazla ek yükü var demektir.

Knative'in Google Cloud uygulaması olan Cloud Run sayesinde, sanal makine veya Kubernetes tabanlı dağıtımlarda ihtiyaç duyduğunuz ek yük olmadan web sitenizi yönetebilir ve dağıtabilirsiniz. Yönetim açısından daha basit bir yaklaşım sunmakla kalmaz, aynı zamanda web sitenize hiçbir istek gelmediğinde size sıfıra ölçekleme olanağı da sunar.

Cloud Run, container'lara sunucusuz geliştirme hizmeti sunmakla kalmaz, aynı zamanda kendi Google Kubernetes Engine (GKE) kümelerinizde veya Cloud Run'ın sağladığı tümüyle yönetilen bir hizmet olarak platform (PaaS) çözümünde de çalıştırılabilir. İkinci senaryoyu da bu codelab'de test edeceksiniz.

Aşağıdaki şemada, dağıtım ve Cloud Run barındırma akışı gösterilmektedir. Cloud Build aracılığıyla oluşturulan bir Docker görüntüsüyle başlarsınız. Bu işlemi Cloud Shell'de tetiklersiniz. Ardından bu görüntüyü Cloud Shell'de bir komut kullanarak Cloud Run'a dağıtacaksınız.

db5f05c090d5ebcb.png

Ön koşullar

Neler öğreneceksiniz?

  • Cloud Build ile Docker görüntüsü derleme ve gcr.io'ya yükleme
  • Docker görüntülerini Cloud Run'a dağıtma
  • Cloud Run dağıtımlarını yönetme
  • Cloud Run'da bir uygulama için uç nokta kurulumu yapma

Neler oluşturacaksınız?

  • Docker container'ı içinde çalışan statik web sitesi
  • Bu kapsayıcının Container Registry'de bulunan bir sürümü
  • Statik web siteniz için Cloud Run dağıtımı

İhtiyacınız olanlar

  • Proje oluşturmak için yönetim erişimine sahip bir Google Hesabı veya proje sahibi rolüne sahip bir proje

2. Ortam kurulumu

Kendi hızınızda ortam kurulumu

Google Hesabınız yoksa bir hesap oluşturmanız gerekir. Ardından, Google Cloud Console'da oturum açın ve Proje'yi tıklayın > Proje oluşturun.

53dad2cefdae71da.png

faab21976aabeb4c.png

Proje adınızın altında otomatik olarak doldurulan proje kimliğini unutmayın. Proje kimliği, tüm Google Cloud projeleri için benzersiz bir addır. Bu nedenle, ekran görüntüsündeki ad önceden alınmış ve sizin için uygun olmayacaktır. Daha sonra PROJECT_ID olarak adlandırılacaktır.

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

Cloud Run API'yi etkinleştirme

Gezinme menüsü Takipçisi'ni tıklayın > API'ler ve Hizmetler > Kontrol paneli > API'leri ve Hizmetleri Etkinleştirin. .

5dbb2e6e27a55fcf.png

"Cloud Run API" araması yapın. ardından Cloud Run API'yi tıklayın > Etkinleştir.

f1fd486174a744cf.png

Bu codelab'i kullanmanın maliyeti birkaç dolardan fazla olmayacaktır. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız bu tutar daha yüksek olabilir (en sondaki Temizleme bölümüne bakın). Daha fazla bilgi için Fiyatlandırma'ya bakın.

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

Cloud Shell

Google Cloud ve Cloud Run dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız. Ortam, ihtiyacınız olan tüm istemci kitaplıkları ve çerçevelerle önceden yapılandırılmıştır.

Bu Debian tabanlı sanal makine, ihtiyacınız olan tüm geliştirme araçlarıyla yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Yani bu codelab'de ihtiyacınız olan tek şey bir tarayıcıdır (evet, Chromebook'ta çalışır).

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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

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

gcloud auth list

Komut çıkışı

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

Komut çıkışı

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

Komut çıkışı

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

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

3. Kaynak depoyu klonlama

Mevcut bir web sitesini dağıttığınız için yalnızca kaynağı deponuzdan klonlamanız yeterlidir. Böylece Docker görüntüleri oluşturup Cloud Run'a dağıtmaya odaklanabilirsiniz.

Kod 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 uygulamanızı test edebilmeniz için Node.js bağımlılıklarını yüklemeniz gerekir.

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

Bu işlem deponuzu klonlar, dizinde değişiklik yapar ve uygulamanızı yerel olarak çalıştırmak için gereken bağımlılıkları yükler. Komut dosyasının çalışması birkaç dakika sürebilir.

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

cd ~/monolith-to-microservices/monolith
npm start

Çıkış:

Monolith listening on port 8080!

Web Önizlemesi'ni acc630712255c604.png tıklayıp 8080 bağlantı noktasında önizle'yi seçerek uygulamanızı önizleyebilirsiniz.

5869738f0e9ec386.png

Bunu yaptığınızda Fancy Store'u iş başında görebilirsiniz.

9ed25c3f0cbe62fa.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. Cloud Build ile Docker container'ı oluşturma

Kaynak dosyalarınız artık kullanıma hazır olduğuna göre sıra, uygulamanızı Docker'a uygun hale getirmeye geldi.

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 Docker container'ı Cloud Build yardımıyla oluşturup görüntüyü tek bir komutla Container Registry'ye yerleştirerek hayatınızı kolaylaştırabilirsiniz. Dockerfile oluşturma ve aktarma işlemlerini manuel olarak görüntülemek için Container Registry hızlı başlangıç kılavuzu sayfasına göz atın.

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

Öncelikle, Cloud Build API'yi etkinleştirdiğinizden emin olmanız gerekir. API'yi etkinleştirmek için aşağıdaki komutu çalıştırın:

gcloud services enable cloudbuild.googleapis.com

API etkinleştirildikten sonra Cloud Shell'de aşağıdaki komutu çalıştırarak derleme işlemini başlatın:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith: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>/monolith:1.0.0  SUCCESS

Derleme geçmişinizi görüntülemek veya işlemi gerçek zamanlı olarak izlemek için Cloud Console'a gidip gezinme menüsü lastik > Cloud Build > Geçmiş. Burada, önceki tüm derlemelerinizin listesini görebilirsiniz ancak yalnızca kendi oluşturduğunuz derlemeler olmalıdır.

4c753ede203255f6.png

Build id (Derleme kimliği) seçeneğini tıklarsanız derlemenin günlük çıkışı da dahil olmak üzere tüm ayrıntılarını görebilirsiniz. Resim'in yanındaki bağlantıyı tıklayarak, oluşturulan kapsayıcı görüntüsünü görebilirsiniz.

6e88ed1643dfe629.png

5. Container'ı Cloud Run'a dağıtma

Web sitenizi container mimarisine aldığınıza ve Container Registry'ye aktardığınıza göre sıra Cloud Run'a dağıtım yapmaya geldi.

Cloud Run'a dağıtım yapmak için iki yaklaşım mevcuttur:

  • Cloud Run (tümüyle yönetilen), container yaşam döngüsünün tamamının yönetildiği PaaS modelidir. Bu codelab'de bu yaklaşımı kullanacaksınız.
  • Cloud Run for Anthos, kümelerinizi ve Kapsüllerinizi GKE'den taşımanızı sağlayan ek bir kontrol katmanına sahip Cloud Run'dır. Daha fazla bilgi için Google Cloud'da Cloud Run for Anthos'u ayarlama başlıklı makaleye bakın.

Komut satırı örnekleri, daha önce ayarladığınız ortam değişkenlerini kullanarak Cloud Shell'de yer alır.

Komut satırı

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

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

Kampanyayı yayınlamak istediğiniz bölgeyi belirtmeniz istenir. Size en yakın bölgeyi seçin, ardından önerilen varsayılan hizmet adını (monolit) kabul edin.

d52d9419c5166674.png

Test amacıyla, uygulamaya kimliği doğrulanmamış isteklere izin verin. İstemde y yazın.

3a57b32f133dad61.png

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. Pod status öğesinin Running olması birkaç dakika sürebilir:

gcloud run services list

[1] Cloud Run (tümüyle yönetilen) seçeneğini belirleyin.

Çıkış:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

Çıkışta birkaç şey gösterilir. Dağıtımınızın yanı sıra dağıtım yapan kullanıcıyı (e-posta adresiniz) ve uygulamaya erişmek için kullanabileceğiniz URL'yi görebilirsiniz. Bu durumda tüm öğeler başarıyla oluşturulmuş demektir.

Web tarayıcınızda hizmetler listesinde sağlanan URL'yi açın. Yerel olarak önizlediğiniz web sitesini görürsünüz.

6. Daha düşük eşzamanlılığa sahip yeni bir düzeltme oluşturma

Şimdi, uygulamanızı tekrar dağıtın ancak bu kez parametrelerden birini ayarlayın.

Varsayılan olarak bir Cloud Run uygulamasının eşzamanlılık değeri 80'dir, yani her container örneği tek seferde en fazla 80 isteğe hizmet verir. Bu, bir örneğin tek seferde bir isteği işlediği hizmet olarak işlevler (FaaS) modelinden büyük bir farktır.

Aynı container görüntüsünü eşzamanlılık değerini 1 yaparak yeniden dağıtın (yalnızca test amaçlıdır) ve neler olacağını görün.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

Ardından gelen soruları ilk seferde yaptığınız gibi yanıtlayın. Komut başarılı olduktan sonra sonucu görmek için Cloud Console'u kontrol edin.

Ayrıntıları görmek için Cloud Run kontrol panelinden monolit hizmetini tıklayın.

7d1eed2e4728a4f2.png

Revisions (Düzeltmeler) sekmesini tıklayın. İki düzeltmenin oluşturulduğunu göreceksiniz. monolith-00002'yi tıklayın ve ayrıntıları inceleyin. Eşzamanlılık değerinin 1'e düştüğünü görürsünüz.

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

Test için bu yapılandırma yeterli olsa da çoğu üretim senaryosunda birden çok eşzamanlı isteği destekleyen container'larınız olur.

Yeniden dağıtım yapmadan ilk eşzamanlılık değerini geri yükleyin. Eşzamanlılık değerini varsayılan 80 veya 0 olarak ayarlayabilirsiniz. Bu durumda, eşzamanlılık kısıtlamaları kaldırılır ve varsayılan maksimum değer (bu yazı yazıldığı sırada 80 olur).

Mevcut düzeltmeyi güncellemek için Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Yeni bir düzeltmenin oluşturulduğunu, trafiğin yönlendirildiğini ve eşzamanlılığın tekrar 80 olduğunu fark edeceksiniz.

7. Web sitesinde değişiklik yapma

Pazarlama ekibiniz sizden şirketinizin web sitesinin ana sayfasını değiştirmenizi istedi. Bu sayfanın şirketin ürünleri ve sattığı ürünler 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ında zaten oluşturmuş. Bu dosyayı index.js hedefine kopyalarsanız değişiklikleriniz sayfaya yansıtılacaktır. Uygun değişiklikleri yapmak için talimatları uygulayın.

Aşağıdaki komutları çalıştırın, güncellenen dosyayı doğru dosya adına kopyalayın ve 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 run build:monolith

Artık kodunuz güncellendiğine göre Docker container'ınızı yeniden oluşturup Container Registry'de yayınlamanız gerekiyor. Aynı komutu öncekiyle aynı şekilde kullanabilirsiniz ancak bu kez sürüm etiketini güncelleyin.

Güncellenmiş 2.0.0 görüntü sürümüyle yeni bir Cloud Build tetiklemek için aşağıdaki komutu çalıştırın:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

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

Sonraki bölümde, kapalı kalma süresi olmadan uygulamanızı güncellemek için bu resmi kullanacaksınız.

8. Kapalı kalma süresi olmadan web sitesini güncelleme

Değişiklikler tamamlandı ve pazarlama ekibi yaptığınız güncellemelerden memnun kaldı. Sırada, kullanıcıların işlerini kesintiye uğratmadan web sitesini güncellemek var.

Cloud Run tüm dağıtımları çevrimiçi hale getirilen ve ardından trafik yönlendirilen yeni bir düzeltme olarak değerlendirir.

Web sitenizi güncellemek için sonraki talimat gruplarını uygulayın.

Komut satırı

Görüntüyü yeni sürüme güncellemek için komut satırında aşağıdaki komutu kullanarak hizmeti yeniden dağıtabilirsiniz:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

Dağıtımı doğrulama

Aşağıdaki komutu çalıştırarak dağıtım güncellemenizi doğrulayın:

gcloud run services describe monolith --platform managed 

Çıkış şu şekilde görünür:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

Hizmetinizin artık yeni bir düzeltmede dağıtılan görüntünüzün en son sürümünü kullandığını görürsünüz.

Değişikliklerinizi doğrulamak için tekrar Cloud Run hizmetinizin harici URL'sine gidin ve uygulama başlığınızın güncellendiğine dikkat edin.

Hizmetleri listelemek ve unutmanız durumunda IP adresini görüntülemek için aşağıdaki komutu çalıştırın:

gcloud run services list

Ana sayfa bileşenine eklediğiniz metin artık web sitenizde gösterilir.

451ca252acae6928.png

9. Temizleme

Container Registry görüntülerini silin

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

Cloud Storage'daki Cloud Build yapılarını silme

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

Cloud Run hizmeti silme

gcloud run services delete monolith --platform managed

10. Tebrikler

Cloud Run ile web sitenizi dağıttınız, ölçeklendirdiniz ve güncellediniz.

Daha fazla bilgi