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ı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

2. Kurulum ve şartlar

Yönlendirmesiz ortam kurulumu

  1. Cloud Console'da oturum açın ve 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

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.

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

Cloud Shell

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu laboratuvarda Google 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).

  1. Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir 'i fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye 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'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:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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>
  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 bölgeler arasından seçim yapabilirsiniz. Daha fazla bilgi için Bölgeler ve Alt Bölgeler başlıklı makaleyi inceleyin.

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.

3. Örnek uygulamayı yazma

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ştirerek bu dizine geçin.

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 container mimarisine alınmaya, test edilmeye ve Container Registry'ye yüklenmeye hazır.

4. Uygulamanızı kapsayıcıya alın ve Container Registry'ye yükleyin

Örnek uygulamayı kapsayıcıya almak 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 istiyorsanız ş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 numaralı bağlantı noktasında önizle'yi seçin.

3618ca3a4a135570.png

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

a0307f34cacf9e6a.png

curl localhost:8080 aracını da kullanabilirsiniz.

5. Cloud Run'a dağıt

Container mimarisine alınmış 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:

63260b4d3aee42b8.png

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.

6. Temizleme

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

7. Tebrikler

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.