Node.js'de Cloud Run ile kapsayıcı dağıtma ve çalıştırma

Cloud Run, HTTP istekleri ile çağrılabilen durum bilgisiz container'lar çalıştırmanızı sağlayan, yönetilen bir işlem platformudur. Cloud Run sunucusuzdur; altyapı yönetimine olan ihtiyacı ortadan kaldırır. Böylece en önemli uygulamalara, yani başarılı uygulamalar oluşturmaya odaklanabilirsiniz. Klocal'den derlenen bu platform, container'larınızı Cloud Run (tümüyle yönetilen) veya Cloud Run for Anthos ile çalıştırmayı tercih etmenizi sağlar. Bu codelab'in amacı, container görüntüsü oluşturup Cloud Run'a dağıtmaktır.

Ön koşullar

Yok

Bağımsız tempolu ortam kurulumu

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

Ekran görüntüsü: 10.02.2016 12:45:26.png

Proje kimliğini tüm Google Cloud projeleri genelinde benzersiz bir ad olarak hatırlayın (yukarıdaki ad zaten alınmıştı ve maalesef sizin için çalışmaz). Bu, daha sonra bu codelab'de 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 gözden geçirmek için çalışmanın birkaç dolardan fazla maliyeti olmayacak. Ancak daha fazla kaynak kullanmaya karar verirseniz veya bunları çalışır durumda bırakırsanız (bu belgenin sonundaki "temizlik" bölümüne bakın) daha yüksek maliyetli olabilir.

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

Cloud Shell

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanırsınız.

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

Google Cloud Shell'i etkinleştirmek için geliştirici konsolunun sağ üst tarafındaki düğmeyi tıklayın (temel hazırlığın yapılması ve ortama bağlanmanız yalnızca birkaç dakika sürer):

cloudShell.png'yi etkinleştir

"Cloud Shell'i Başlat" düğmesini tıklayın:

Ekran Görüntüsü, 14.06.2017 10.13.43.png

Cloud shell'e bağlandıktan sonra kimliğinizin zaten doğrulanmış olduğunu ve projenin PROJECT_ID olarak ayarlandığını görmeniz gerekir:

gcloud auth list

Komut çıkışı

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

Komut çıkışı

[core]
project = <PROJECT_ID>

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

echo $GOOGLE_CLOUD_PROJECT

Komut çıkışı

<PROJECT_ID>

Herhangi bir nedenle proje ayarlanmadıysa aşağıdaki 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ıza göz atın veya konsolu kontrol panelinde arayın:

Proje_kimliği.png

ÖNEMLİ: Son olarak varsayılan alt bölgeyi ve proje yapılandırmasını ayarlayın:

gcloud config set compute/zone us-central1-f

Farklı bölgeler seçebilirsiniz. Bölgeler ve Alt Bölgeler dokümanlarında daha fazla bilgi edinin.

Cloud Run API'yi etkinleştirme

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

gcloud services enable run.googleapis.com

Bu, aşağıdakine benzer başarılı bir mesaj oluşturmalıdır:

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

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

Uygulamanızı oluşturmak için helloworld-nodejs adlı yeni bir dizin oluşturmak ve bu dizini değiştirmek üzere Cloud Shell'i kullanın.

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 başlangıç komut dosyası komutu ve Express web uygulaması çerçevesine bağımlılığı içerir.

Daha sonra, aynı dizinden 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ını dinleyen temel bir web sunucusu oluşturur. Uygulamanız container mimarisine alınmaya, test edilmeye ve Container Registry'ye yüklenmeye hazır.

Ö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 buraya 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 dosyasını içeren dizinde aşağıdaki komutu çalıştırarak Cloud Build'i kullanarak container görüntünüzü oluşturun:

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. gcloud config get-value project kullanarak bu özellikten de yararlanabilirsiniz.

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 istendiğinde yeniden kullanılabilir.

Şu komutu kullanarak mevcut projenizle ilişkilendirilmiş tüm kapsayıcı resimlerini listeleyebilirsiniz:

gcloud container images list

Uygulamayı Cloud Shell'den yerel olarak çalıştırmak ve test etmek istiyorsanız şu standart docker komutunu kullanarak uygulamayı başlatabilirsiniz:

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

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

Ardından Hello World yazan bir tarayıcı penceresi açılır.

curl localhost:8080 seçeneğini de kullanabilirsiniz.

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

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

--allow-unauthenticated dağıtım seçeneği, kimlik doğrulama olmadan uygulamaya erişmenizi sağlar. --platform managed \ dağıtım seçeneği, Anthos aracılığıyla Kubernetes altyapısını değil, tümüyle yönetilen ortamı 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:

Cloud Run, alınan istekleri işleyebilmek için kapsayıcı görüntünüzü otomatik ve yatay olarak ölçeklendirir. Ardından talep düştüğünde ölçeği azaltır. Yalnızca istek işleme sırasında kullanılan CPU, bellek ve ağ için ödeme yaparsınız.

Cloud Run, hizmet kullanımda değilken ücret almasa da yerleşik kapsayıcı görüntüsünün depolanması için sizden ücret alınabilir.

Ek ücret ödememek için Google Cloud projenizi silebilirsiniz. Bu durumda, söz konusu projede kullanılan tüm kaynaklar için faturalandırma durdurulur veya yalnızca aşağıdaki komutu kullanarak helloworld resminizi 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

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

Daha fazla bilgi

Bir sonraki adım olarak Quickstart: Deploy to Cloud Run for Google Cloud'a (Hızlı Başlangıç: Anthos için Google Cloud'da Dağıtım) göz atmanız önerilir.

Kod kaynağından Cloud Run için uygun, durum bilgisiz bir HTTP kapsayıcısı oluşturma 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 sayfasını inceleyin.