Node.js üzerinde Cloud Run ile container dağıtıp çalıştırma

1. Başlamadan önce

6a5cf23c8e20491f.png

Cloud Run, HTTP istekleriyle çağrılabilen durum bilgisiz container'lar çalıştırmanızı sağlayan bir yönetilen bilgi işlem platformudur. Cloud Run sunucusuzdur; altyapı yönetimi ihtiyacını ortadan kaldırır, böylece siz de en önemli şey olan mükemmel uygulamalar geliştirmeye odaklanabilirsiniz. Knative'den derlenen bu platform, container'larınızı Cloud Run (tümüyle yönetilen) veya Cloud Run for Anthos ile çalıştırmayı seçebilmenizi sağlar. Bu codelab'in amacı, container görüntüsü oluşturup Cloud Run'a dağıtmaktır.

Ön koşullar

Yok

2. Kurulum ve şartlar

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 G Suite hesabınız yoksa hesap oluşturmanız gerekir.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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ı ücretsiz deneme programından yararlanabilir.

Cloud Shell

Google Cloud 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.

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

Cloud Run API'yi etkinleştirme

Cloud Shell'den Cloud Run API'yi etkinleştirin.

gcloud services enable run.googleapis.com

Bu işlem, aşağıdakine benzer başarılı bir mesaj üretir:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. Örnek uygulamayı yazma

HTTP isteklerine yanıt veren basit, ekspres tabanlı bir Node.js uygulaması oluşturacaksınız.

Uygulamanızı derlemek için Cloud Shell'i kullanarak helloworld-nodejs adlı yeni bir dizin oluşturun ve dizini bunun üzerinde değiştirin.

mkdir helloworld-nodejs
cd helloworld-nodejs

Aşağıdaki içeriğe sahip bir package.json dosyası oluşturun:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

En önemlisi, yukarıdaki dosya bir komut dosyası başlatma komutu ve Express web uygulaması çerçevesine bağımlılık içerir.

Daha sonra, aynı dizinde bir index.js dosyası oluşturun ve aşağıdaki içeriği bu dosyaya kopyalayın:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Bu kod, PORT ortam değişkeni tarafından tanımlanan bağlantı noktasında dinleme yapan temel bir web sunucusu oluşturur. Uygulamanız artık container mimarisine alınmaya, test edilmeye ve Container Registry'ye yüklenmeye hazır.

4. Uygulamanızı container mimarisine alma ve Container Registry'ye yükleme

Örnek uygulamayı container mimarisine almak için kaynak dosyalarla aynı dizinde Dockerfile adlı yeni bir dosya oluşturun ve aşağıdaki içeriği buna kopyalayın:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

Şimdi, Dockerfile'ı içeren dizinden aşağıdaki komutu çalıştırarak Cloud Build'i kullanarak container görüntünüzü derleyin:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT, Cloud Shell'de çalışırken Google Cloud proje kimliğinizi içeren bir ortam değişkenidir. Bu eklentiyi gcloud config get-value project komutunu çalıştırarak da edinebilirsiniz.

Kayıt defterine aktarıldıktan sonra görüntü adını (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) içeren bir SUCCESS mesajı görürsünüz. Görüntü, Container Registry'de depolanır ve istenirse yeniden kullanılabilir.

Şu komutu kullanarak mevcut projenizle ilişkili tüm container görüntülerini listeleyebilirsiniz:

gcloud container images list

Uygulamayı Cloud Shell'den yerel olarak çalıştırıp test etmek isterseniz şu standart docker komutunu kullanarak başlatabilirsiniz:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Cloud Shell'de Web Önizlemesi'ni 170b7a95be8c6296.png tıklayın ve 8080 bağlantı noktasında önizle'yi seçin.

3618ca3a4a135570.png

Hello World! ifadesini içeren bir tarayıcı penceresi açılır.

a0307f34cacf9e6a.png

Yalnızca curl localhost:8080 kullanmanız da yeterlidir.

5. Cloud Run'a dağıt

Container mimarisine alınmış uygulamanızı Cloud Run'a dağıtma işlemi şu komut kullanılarak gerçekleştirilir (uygulamayı, derlediğiniz uygulama için doğru görüntü adına ayarladığınızdan emin olun veya önceden oluşturulmuş gcr.io/cloudrun/hello görüntüsünü kullanın):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

--allow-unauthenticated dağıtma seçeneği, uygulamaya kimlik doğrulama olmadan erişmenizi sağlar. --platform managed \ dağıtım seçeneği, tümüyle yönetilen ortamı (Anthos aracılığıyla Kubernetes altyapısını değil) istediğiniz anlamına gelir.

Dağıtım tamamlanana kadar birkaç dakika bekleyin. İşlem tamamlandığında komut satırında hizmet URL'si gösterilir.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

Artık hizmet URL'sini bir web tarayıcısında açarak dağıtılan kapsayıcınızı ziyaret edebilirsiniz:

63260b4d3aee42b8.png

Cloud Run, alınan istekleri işlemek için container görüntünüzü otomatik ve yatay olarak ölçeklendirir, ardından talep azaldığında ölçeği azaltır. Yalnızca istek işleme sırasında tüketilen CPU, bellek ve ağ için ödeme yaparsınız.

6. Temizleme

Cloud Run hizmet kullanılmadığında da ücret ödemez ancak derlenen container görüntüsünü depolamak için yine de ücret alınabilir.

Ücret ödemek istemiyorsanız söz konusu proje için kullanılan tüm kaynakların faturalandırılmasını durdurmak üzere Google Cloud projenizi silebilir veya şu komutu kullanarak helloworld görüntünüzü silebilirsiniz:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

Cloud Run hizmetini silmek için şu komutu kullanın:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

7. Tebrikler

Tebrikler! Container görüntüsünde paketlenmiş bir uygulamayı Cloud Run'a dağıttınız.

Daha fazla bilgi

Sonraki adım olarak Hızlı Başlangıç: Google Cloud'da Cloud Run for Anthos'a Dağıtım başlıklı makaleye göz atabilirsiniz.

Kod kaynağından Cloud Run'a uygun durum bilgisiz bir HTTP container'ı derleme ve bunu Container Registry'ye aktarma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Temel açık kaynak projesi olan Knative hakkında daha fazla bilgi edinmek için Knative'e göz atın.