Yardımcı dosyayla Cloud Run hizmeti oluşturma

1. Genel Bakış

Giriş

Bu codelab'de birden fazla kapsayıcı kullanan bir Cloud Run hizmetini nasıl dağıtacağınızı öğreneceksiniz. Cloud Run giriş kapsayıcısı olarak kullanılacak bir node.js uygulaması ve yardımcı dosya olarak kullanılacak ek bir node.js uygulaması oluşturacaksınız.

Teknik genel bakış

Bir Cloud Run örneği içinde birden fazla container kullanılırken bir container, web girişi için ana kapsayıcı olarak kullanılır. Bir veya daha fazla ek kapsayıcı, yardımcı dosya olarak adlandırılır.

Birden çok kapsayıcının birbiriyle iletişim kurmasının iki yolu vardır:

  1. Kapsayıcılar, localhost ağ arayüzünü paylaşır.Böylece tüm container'lar, bir bağlantı noktasını (ör. localhost:port.
  2. Dosyaları paylaşmak için bellek içi birimleri de kullanabilir ve bunları kapsayıcılara ekleyebilirsiniz.

Kullanım alanları

Cloud Run örneğindeki tüm kapsayıcılar yerel ana makine ağ arayüzünü paylaştığından isteklere proxy uygulamak için ana kapsayıcınızın önünde bir yardımcı dosya kullanabilirsiniz. Bu tür proxy'ler, isteklere müdahale ederek ve bunları uygun uç noktaya ileterek istemci ile sunucular arasında uygulamaya daha verimli bir trafik akışı için ek bir soyutlama katmanı sağlayabilir. Örnek olarak DockerHub'dan resmi Nginx görüntüsünü kullanabilirsiniz (burada gösterildiği gibi).

Birden fazla kapsayıcı, paylaşılan birimler aracılığıyla dosya paylaşarak iletişim kurabildiğinden, hizmetinize çeşitli yardımcı uygulamalar eklersiniz. Örneğin, günlükleri, metrikleri ve izleri dışa aktarmak üzere OpenTelemetry gibi özel aracılar kullanmak için Cloud Run hizmetinizde gerekli araçları kullanabilirsiniz (OpenTelemetry örneği). Diğer bir örnek de Cloud Spanner PostgreSQL veritabanına bir yardımcı dosya bağlantısı kullanmaktır (Cloud Spanner Postgress örneği).

Bu codelab'deki örnekler

Bu codelab'de önce giriş container'ının bir localhost bağlantı noktası aracılığıyla bir yardımcı dosyayla iletişim kurduğu bir Cloud Run hizmetini dağıtacaksınız. Ardından, birim bağlantısı aracılığıyla dosya paylaşmak için giriş container'ını ve yardımcı dosyayı güncelleyeceksiniz.

Neler öğreneceksiniz?

  • Yardımcı dosya kullanan container oluşturma
  • Bir giriş container'ı, localhost'u kullanarak bir yardımcı dosyayla nasıl iletişim kurabilir?
  • Hem giriş container'ı hem de yardımcı dosya eklenen birim aracılığıyla nasıl dosya paylaşabilir?

2. Kurulum ve Gereksinimler

Ön koşullar

  • Cloud Console'a giriş yaptınız.
  • Daha önce bir Cloud Run hizmeti dağıttınız. Örneğin, başlamak için kaynak kodundan web hizmeti dağıtma başlıklı makaledeki adımları uygulayabilirsiniz.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir d1264ca30785e435.png simgesini tıklayın.

cb81e7c8e34bc8d.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

d95252b003979716.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

7833d5e1c5d18f54.png

Gereken tüm geliştirme araçları bu sanal makinede 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. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Giriş uygulamasını oluşturma

Ortam Değişkenlerini Ayarlama

Bu codelab'de, bu codelab'de kullanılan gcloud komutlarının okunabilirliğini iyileştirmek için birkaç ortam değişkeni oluşturacaksınız.

REGION=<YOUR-REGION>
PROJECT_ID=<YOUR-PROJECT-ID>

SERVICE_NAME=sidecar-codelab
REPO_NAME=sidecar-codelab

Container görüntülerinizi saklamak için ArtifactRegistry deposu oluşturma

Bu codelab için container görüntülerinizi depolamak amacıyla Artifact Registry'de depo oluşturabilirsiniz.

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=$REGION --description="sidecar codelab"

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

{
  "name": "sidecar-codelab",
  "version": "1.0.0",
  "private": true,
  "description": "demonstrates how to use sidecars in cloud run",
  "main": "index.js",
  "author": "Google LLC",
  "license": "Apache-2.0",
  "scripts": {
    "start": "node ingress.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "express": "^4.18.2"
  }
}

Şimdi, aşağıdaki içeriklere sahip ingress.js adlı bir dosya oluşturun:

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

app.get('/', async (req, res) => {

    let response = await axios.get("http://localhost:5000");

    res.send("The sidecar says: " + response.data);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`Ingress container listening on port ${port}`);
});

Giriş container'ı için Dockerfile oluşturma

FROM node:20.10.0-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production

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

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

Ardından giriş kapsayıcısı için bir ".dockerignore" dosyası oluşturun.

# Exclude locally installed dependencies
node_modules/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

Artık aşağıdaki komutu çalıştırarak giriş container'ınızın görüntüsünü oluşturabilirsiniz:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest

4. Yardımcı dosya uygulaması oluşturma

Bu bölümde, Cloud Run hizmetinde yardımcı dosya olarak kullanılacak ikinci bir node.js uygulaması oluşturacaksınız.

Yardımcı dizine gidin.

cd ../sidecar

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

{
  "name": "sidecar-codelab",
  "version": "1.0.0",
  "private": true,
  "description": "demonstrates how to use sidecars in cloud run",
  "main": "index.js",
  "author": "Google LLC",
  "license": "Apache-2.0",
  "scripts": {
    "start": "node sidecar.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "express": "^4.18.2"
  }
}

Şimdi, aşağıdaki içeriklere sahip sidecar.js adlı bir dosya oluşturun:

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

app.get('/', async (req, res) => {
    res.send("Hello ingress container! I'm the sidecar.");
});

const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
    console.log(`Sidecar container listening on port ${port}`);
});

Yardımcı dosya container'ı için Dockerfile oluşturma

FROM node:20.10.0-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production

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

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

Yardımcı dosya kapsayıcısı için de bir ".dockerignore" dosyası oluşturun.

# Exclude locally installed dependencies
node_modules/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

Artık aşağıdaki komutu çalıştırarak giriş container'ınızın görüntüsünü oluşturabilirsiniz:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest

Cloud Run hizmetini dağıtma

Cloud Run hizmetini yaml dosyası kullanarak dağıtacaksınız.

Üst dizine gidin.

cd ..

Aşağıdaki içeriğe sahip sidecar-codelab.yaml adlı bir dosya oluşturun:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: sidecar-codelab
  labels:
    cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
  template:
    spec:
      containers:
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
          ports:
            - containerPort: 8080
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
          env:
            - name: PORT
              value: "5000"

Ardından aşağıdaki komutu kullanarak hizmeti dağıtın. Birim ekleme işlemleri herkese açık önizlemede olduğu için gcloud beta'yı kullanmanız gerekir.

gcloud beta run services replace sidecar-codelab.yaml

Dağıtımdan sonra hizmet URL'sini bir ortam değişkenine kaydedin.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)') 

5. Cloud Run hizmetini çağırma

Artık kimlik jetonunuzu sağlayarak hizmetinizi çağırabilirsiniz.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

Sonuçlarınız, aşağıdaki örnek çıkışa benzer bir görünümde olacaktır:

The sidecar says: Hello ingress container! I'm the sidecar.

6. Birim bağlantısı aracılığıyla dosya paylaşma

Bu bölümde, birim ekleme aracılığıyla dosya paylaşmak için kapsayıcıları güncelleyeceksiniz. Bu örnekte giriş kapsayıcısı, paylaşılan birimdeki bir dosyaya yazar. Yardımcı dosya dosyayı okur ve içeriğini giriş kapsayıcısına geri döndürür.

Önce giriş container kodunu güncelleyin. Giriş dizinine gidin.

cd ../ingress

ve ardından, ingress.js dosyasının içeriğini aşağıdakiyle değiştirin:

const express = require('express');
const app = express();
const fs = require('fs');
const axios = require("axios");

const filename = "test.txt"

let path = "/my-volume-mount";
app.use(path, express.static(path));

try {
    fs.writeFileSync(`${path}/${filename}`, "The ingress container created this file.");
} catch (err) {
    console.error(err);
}

app.get('/', async (req, res) => {

    let response = await axios.get("http://localhost:5000");

    res.send("The sidecar says: " + response.data);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`Ingress container listening on port ${port}`);
});

Ardından aşağıdaki komutu çalıştırarak giriş container'ınız için yeni görüntü derleyin:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest

Şimdi yardımcı dizine gidin:

cd ../sidecar

sidecar.js uygulamasını aşağıdaki içeriklerle güncelleyin:

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

const filename = "test.txt"

let path = "/my-volume-mount";
app.use(path, express.static(path));

async function readFile() {
    try {
        return await fs.readFileSync(`${path}/${filename}`, { encoding: 'utf8' });
    } catch (err) {
        console.log(err);
    }
}

app.get('/', async (req, res) => {
    let contents = await readFile();
    res.send(contents);
});

const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
    console.log(`Sidecar container listening on port ${port}`);
});

Ardından aşağıdaki komutu çalıştırarak yardımcı dosya container'ınız için yeni görüntü oluşturun:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest

Birim paylaşmak için sidecar-codelab.yaml bölümünü aşağıdakilerle güncelleyin:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: sidecar-codelab
  labels:
    cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
  template:
    spec:
      containers:
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
          ports:
            - containerPort: 8080
          volumeMounts:
            - mountPath: /my-volume-mount
              name: in-memory-1
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
          env:
            - name: PORT
              value: "5000"
          volumeMounts:
            - mountPath: /my-volume-mount
              name: in-memory-1
      volumes:
        - emptyDir:
            medium: Memory
          name: in-memory-1

Güncellenen sidecar-codelab.yaml dosyasını dağıtın

gcloud beta run services replace sidecar-codelab.yaml

Artık kimlik jetonunuzu sağlayarak hizmetinizi çağırabilirsiniz.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

Sonuçlarınız, aşağıdaki örnek çıkışa benzer bir görünümde olacaktır:

The sidecar says: the ingress container created this file.

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Cloud Run ile ilgili belgeleri gözden geçirmenizi, özellikle de çoklu container'ları dağıtmanızı ve bellek içi birim bağlantılarını kullanmanızı öneririz.

İşlediklerimiz

  • Yardımcı dosya kullanan container oluşturma
  • Bir giriş container'ı, localhost'u kullanarak bir yardımcı dosyayla nasıl iletişim kurabilir?
  • Hem giriş container'ı hem de yardımcı dosya eklenen bir birimi nasıl paylaşabilir?

8. Temizleme

Yanlışlıkla yapılan ücretleri önlemek için (örneğin, bu Cloud Functions işlevi yanlışlıkla ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla kez çağrıldıysa) Cloud Run hizmetini silebilir veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.

Cloud Functions işlevini silmek için https://console.cloud.google.com/run/ adresinden Cloud Functions İşlevi Bulut Konsolu'na giderek sidecar-codelab hizmetini (veya farklı bir ad kullandıysanız $SERVICE_NAME) silin.

Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidip 2. adımda oluşturduğunuz projeyi, ardından Sil'i seçebilirsiniz. Projeyi silerseniz Cloud SDK'nızdaki projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak mevcut tüm projelerin listesini görüntüleyebilirsiniz.