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

Cloud Run, HTTP istekleriyle çağrılabilen durum bilgisiz container'lar çalıştırmanıza olanak tanıyan yönetilen bir işlem platformudur. Cloud Run sunucusuzdur. Altyapı yönetimi ihtiyacını ortadan kaldırır. Böylece en önemli iş olan mükemmel uygulamalar geliştirmeye odaklanabilirsiniz. Knative'den derlenen bu platform sayesinde, container'larınızı Cloud Run (tümüyle yönetilen) veya Cloud Run for Anthos ile çalıştırmayı tercih edebilirsiniz. Bu kod laboratuvarının amacı, bir container görüntüsü oluşturup Cloud Run'a dağıtmanızı sağlamaktır.

Ön koşullar

Yok

Kendi hızınızda ortam kurulumu

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

Screenshot from 2016-02-10 12:45:26.png

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 size birkaç dolardan fazla maliyet getirmemelidir. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız maliyet daha yüksek olabilir (bu belgenin sonundaki "temizleme" bölümüne bakın).

Google Cloud Platform'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme sürümünden yararlanabilir.

Cloud Shell

Google Cloud'u dizüstü bilgisayarınızdan uzaktan çalıştırabilirsiniz ancak Google Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanırsı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 sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu nedenle, bu codelab için ihtiyacınız olan tek şey bir tarayıcıdır (Chromebook'ta da çalışır).

Google Cloud Shell'i etkinleştirmek için geliştirici konsolunda sağ üst taraftaki düğmeyi tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç dakika sürer):

activateCloudShell.png

"Start Cloud Shell" (Cloud Shell'i başlat) düğmesini tıklayın:

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

Cloud Shell'e bağlandıktan sonra kimliğinizin zaten doğrulandığını 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, 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>

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 konsol kontrol panelinde arayın:

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

Çeşitli bölgeler arasından seçim yapabilirsiniz. Bölgeler ve Alt Bölgeler belgelerinden daha fazla bilgi edinebilirsiniz.

Cloud Run API'yi etkinleştirme

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

gcloud services enable run.googleapis.com

Bu işlem, şuna benzer bir başarı mesajı oluşturur:

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

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

Uygulamanızı oluşturmak için Cloud Shell'i kullanarak helloworld-nodejs adlı yeni bir dizin oluşturun ve dizini 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 başlangıç komut dosyası komutu ve Express web uygulaması çerçevesine bağımlılık içeriyor.

Ardından, 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şkeninin tanımladığı bağlantı noktasında dinleme yapan temel bir web sunucusu oluşturur. Uygulamanız artık kapsayıcıya alınmaya, test edilmeye ve Container Registry'ye yüklenmeye hazır.

Örnek uygulamayı kapsayıcılaştırmak için kaynak dosyalarla aynı dizinde Dockerfile adlı yeni bir dosya oluşturun ve aşağıdaki içeriği bu dosyaya 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 kapsayıcı 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 komutunu çalıştırarak da alabilirsiniz.

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 kapsayıcı resimlerini listeleyebilirsiniz:

gcloud container images list

Uygulamayı Cloud Shell'den yerel olarak çalıştırmak ve test etmek isterseniz ş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ın ve 8080 numaralı bağlantı noktasında önizle'yi seçin.

Bu işlem, Hello World! (Merhaba Dünya!) yazan bir tarayıcı penceresi açar.

curl localhost:8080 aracını da kullanabilirsiniz.

Container'a yerleştirilmiş uygulamanızı Cloud Run'a dağıtmak için aşağıdaki komutu kullanın (oluşturduğunuz uygulama için doğru görüntü adını ayarladığınızdan veya gcr.io/cloudrun/hello önceden oluşturulmuş görüntüyü 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ğıtma seçeneği, kimlik doğrulaması yapmadan uygulamaya ulaşmanızı sağlar. --platform managed \ dağıtma 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şlemek için kapsayıcı resminizi otomatik olarak ve yatay yönde ölçeklendirir, talep azaldığında ise ölçeği küçültür. Yalnızca istek işleme sırasında kullanılan CPU, bellek ve ağ iletişimi için ödeme yaparsınız.

Cloud Run, hizmet kullanılmadığında ücret almaz ancak oluşturulan container görüntüsünü depolama için ücretlendirilebilirsiniz.

Ücretlendirilmemek için Google Cloud projenizi silebilirsiniz. Bu durumda, söz konusu proje için kullanılan tüm kaynakların faturalandırılması durdurulur. Alternatif olarak, şu 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 Hızlı Başlangıç: Google Cloud'da Cloud Run for Anthos'a dağıtma başlıklı makaleye göz atabilirsiniz.

Kod kaynağında Cloud Run için uygun durum bilgisiz bir HTTP kapsayıcısı oluşturma ve bunu Container Registry'ye gönderme hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Temel alınan açık kaynak projesi Knative hakkında daha fazla bilgi edinmek için Knative başlıklı makaleyi inceleyin.