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:
- 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.
- 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 Console'a giriş yapmış olmanız gerekir.
- Daha önce bir Cloud Run hizmeti dağıtmış olmanız gerekir. Örneğin, başlamak için Kaynak koddan web hizmeti dağıtma hızlı başlangıç kılavuzunu inceleyebilirsiniz.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

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.

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

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