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:
- Kapsayıcılar, localhost ağ arayüzünü paylaşır.Böylece tüm container'lar, bir bağlantı noktasını (ör. localhost:port.
- 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
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
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.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
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.
- 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`
- 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.