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 ek olarak bir sidecar olarak kullanılacak bir node.js uygulaması oluşturacaksınız.

Teknik genel bakış

Bir Cloud Run örneğinde birden fazla kapsayıcı kullanıldığında, web girişi için bir kapsayıcı ana kapsayıcı olarak kullanılır. Bir veya daha fazla ek kapsayıcıya sidecar adı verilir.

Birden fazla kapsayıcının birbirleriyle iletişim kurmasının iki yolu vardır:

  1. Container'lar localhost ağ arayüzünü paylaştığı için tüm container'lar bir bağlantı noktasını (ör. localhost:bağlantı noktası) dinleyebilir.
  2. Ayrıca, dosyaları paylaşmak için bellek içi birimleri kullanabilir ve bunları kapsayıcılara monte edebilirsiniz.

Kullanım alanları

Cloud Run örneğindeki tüm container'lar localhost ağ arayüzünü paylaştığından, istekleri proxy'lemek için ana container'ınızın önünde bir yardımcı container kullanabilirsiniz. Bu tür proxy'ler, istekleri yakalayıp uygun uç noktaya ileterek istemci ile sunucular arasında uygulamaya daha verimli bir trafik akışı için ek bir soyutlama katmanı sağlayabilir. Örneğin, DockerHub'daki 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 ekleyebilirsiniz. Örneğin, günlükleri, metrikleri ve izleri dışa aktarmak için Cloud Run hizmetinizi OpenTelemetry gibi özel aracıları kullanacak şekilde ayarlayabilirsiniz (OpenTelemetry örneği). Bir diğer örnek ise Cloud Spanner PostgreSQL veritabanına bağlanmak için bir yardımcı kapsayıcı kullanmaktır (Cloud Spanner PostgreSQL örneği).

Bu codelab'deki örnekler

Bu codelab'de öncelikle giriş container'ının localhost bağlantı noktası üzerinden bir yardımcı programla iletişim kurduğu bir Cloud Run hizmeti dağıtacaksınız. Ardından, bir dosyayı bir birim bağlama yoluyla paylaşmak için giriş kapsayıcısını ve yardımcı kapsayıcıyı güncelleyeceksiniz.

Neler öğreneceksiniz?

  • Sidecar kullanan bir kapsayıcı oluşturma
  • Giriş kapsayıcısı, localhost kullanarak sidecar ile nasıl iletişim kurabilir?
  • Bir giriş kapsayıcısının ve bir yardımcı kapsayıcının, bağlı bir birim aracılığıyla dosyayı nasıl paylaşabileceği

2. Kurulum ve Gereksinimler

Ön koşullar

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i d1264ca30785e435.png 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 ekran gösterildiyse Devam'ı tıklayın.

d95252b003979716.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

7833d5e1c5d18f54.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 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 codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu 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 projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu 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 artırmak 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 tutmak için bir Artifact Registry deposu oluşturun

Bu codelab için container görüntülerinizi depolamak üzere Artifact Registry'de bir 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çeriklerle 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 bir Dockerfile oluşturun.

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" ]

Ayrıca, 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

Şimdi aşağıdaki komutu çalıştırarak giriş kapsayıcı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. Sidecar uygulamasını oluşturma

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

Sidecar dizinine 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çeriklerle 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ı 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" ]

Ayrıca, yardımcı kapsayıcı 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

Şimdi aşağıdaki komutu çalıştırarak giriş kapsayıcı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 bir YAML dosyası kullanarak dağıtacaksınız.

Üst dizine gidin.

cd ..

Aşağıdaki içeriklere 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 bağlama özelliği herkese açık önizleme aşamasında olduğundan gcloud beta'yı kullanmanız gerekir.

gcloud beta run services replace sidecar-codelab.yaml

Dağıtım tamamlandıktan 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 arayabilirsiniz.

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

Sonuçlarınız, aşağıdaki örnek çıkışa benzer şekilde görünmelidir:

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

6. Birim bağlama yoluyla dosya paylaşma

Bu bölümde, bir dosyayı bir birim bağlama yoluyla paylaşmak için kapsayıcıları güncelleyeceksiniz. Bu örnekte, giriş kapsayıcısı paylaşılan bir birimdeki dosyaya yazacaktır. Sidecar, dosyayı okur ve içeriğini giriş kapsayıcısına geri döndürür.

Öncelikle giriş kapsayıcısı kodunu güncelleyin. Giriş dizinine gidin.

cd ../ingress

ve ardından ingress.js dosyasının içeriğini aşağıdakilerle 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}`);
});

Aşağıdaki komutu çalıştırarak giriş kapsayıcınız için yeni görüntüyü oluşturun:

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

Şimdi sidecar dizinine gidin:

cd ../sidecar

Ayrıca sidecar.js öğesini 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}`);
});

Aşağıdaki komutu çalıştırarak yardımcı kapsayıcınız için yeni görüntüyü oluşturun:

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

Bir birimi paylaşmak için sidecar-codelab.yaml uygulamasını aşağıdaki bilgilerle 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ğıtma

gcloud beta run services replace sidecar-codelab.yaml

Artık kimlik jetonunuzu sağlayarak hizmetinizi arayabilirsiniz.

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

Sonuçlarınız, aşağıdaki örnek çıkışa benzer şekilde görünmelidir:

The sidecar says: the ingress container created this file.

7. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Cloud Run ile ilgili dokümanları, özellikle çoklu kapsayıcı dağıtma ve bellek içi birim bağlamalarını kullanma konularını incelemenizi öneririz.

İşlediğimiz konular

  • Sidecar kullanan bir kapsayıcı oluşturma
  • Giriş kapsayıcısı, localhost kullanarak sidecar ile nasıl iletişim kurabilir?
  • Bir giriş kapsayıcısı ve bir sidecar'ın, bağlı bir birimi nasıl paylaşabileceği

8. Temizleme

Yanlışlıkla ücretlendirilmemek için (örneğin, bu Cloud Function, ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla sayıda çağrılırsa) Cloud Run hizmetini 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 Cloud Console'a gidin ve 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 gidebilir, 2. adımda oluşturduğunuz projeyi seçip Sil'i tıklayabilirsiniz. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.