1. Tổng quan
Giới thiệu
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai một dịch vụ Cloud Run sử dụng nhiều vùng chứa. Bạn sẽ tạo một ứng dụng Node.js được dùng làm vùng chứa chuyển tiếp Cloud Run và một ứng dụng Node.js khác được dùng làm tệp trợ giúp.
Tổng quan về kỹ thuật
Khi sử dụng nhiều vùng chứa trong một phiên bản Cloud Run, một vùng chứa sẽ được dùng làm vùng chứa chính cho lưu lượng truy cập web. Một hoặc nhiều vùng chứa bổ sung được gọi là vùng chứa phụ.
Có hai cách để nhiều vùng chứa giao tiếp với nhau:
- Các vùng chứa dùng chung giao diện mạng máy chủ cục bộ, vì vậy, tất cả vùng chứa đều có thể lắng nghe một cổng, ví dụ: localhost:port.
- Bạn cũng có thể sử dụng các ổ đĩa trong bộ nhớ và gắn chúng vào các vùng chứa để chia sẻ tệp.
Trường hợp sử dụng
Vì tất cả các vùng chứa trong phiên bản Cloud Run đều dùng chung giao diện mạng cục bộ, nên bạn có thể sử dụng một vùng chứa phụ ở phía trước vùng chứa chính để chuyển yêu cầu. Các proxy như vậy có thể cung cấp thêm một lớp trừu tượng để lưu lượng truy cập đến ứng dụng giữa máy khách và máy chủ hiệu quả hơn bằng cách chặn các yêu cầu và chuyển tiếp chúng đến điểm cuối thích hợp. Ví dụ: bạn có thể sử dụng hình ảnh Nginx chính thức từ DockerHub (như minh hoạ tại đây).
Vì nhiều vùng chứa có thể giao tiếp bằng cách chia sẻ tệp thông qua các ổ đĩa dùng chung, nên bạn có thể thêm nhiều ứng dụng phụ vào dịch vụ của mình. Ví dụ: bạn có thể đo lường dịch vụ Cloud Run để sử dụng các tác nhân tuỳ chỉnh như OpenTelemetry nhằm xuất nhật ký, chỉ số và dấu vết (Ví dụ về OpenTelemetry). Một ví dụ khác là sử dụng một sidecar để kết nối với cơ sở dữ liệu PostgreSQL của Cloud Spanner (Ví dụ về PostgreSQL của Cloud Spanner).
Các ví dụ trong lớp học lập trình này
Trong lớp học lập trình này, trước tiên, bạn sẽ triển khai một dịch vụ Cloud Run, trong đó vùng chứa đầu vào của dịch vụ này giao tiếp với một vùng chứa phụ thông qua một cổng localhost. Sau đó, bạn sẽ cập nhật vùng chứa đầu vào và tệp trợ giúp để chia sẻ tệp thông qua một điểm gắn kết ổ đĩa.
Kiến thức bạn sẽ học được
- Cách tạo một vùng chứa sử dụng sidecar
- Cách một vùng chứa đầu vào có thể giao tiếp với một vùng chứa phụ bằng localhost
- Cách vùng chứa đầu vào và vùng chứa phụ có thể cùng chia sẻ một tệp thông qua ổ đĩa được gắn
2. Thiết lập và yêu cầu
Điều kiện tiên quyết
- Bạn đã đăng nhập vào Cloud Console.
- Trước đây, bạn đã triển khai một dịch vụ Cloud Run. Ví dụ: bạn có thể làm theo hướng dẫn nhanh về cách triển khai dịch vụ web từ mã nguồn để bắt đầu.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Tạo ứng dụng đầu vào
Đặt các biến môi trường
Trong lớp học lập trình này, bạn sẽ tạo một số biến môi trường để cải thiện khả năng đọc của các lệnh gcloud được dùng trong lớp học lập trình này.
REGION=<YOUR-REGION> PROJECT_ID=<YOUR-PROJECT-ID> SERVICE_NAME=sidecar-codelab REPO_NAME=sidecar-codelab
Tạo một kho lưu trữ ArtifactRegistry để lưu trữ hình ảnh vùng chứa
Bạn có thể tạo một kho lưu trữ trong Artifact Registry để lưu trữ các hình ảnh vùng chứa cho lớp học lập trình này.
gcloud artifacts repositories create $REPO_NAME --repository-format=docker \ --location=$REGION --description="sidecar codelab"
Sau đó, hãy tạo một tệp package.json có nội dung sau:
{
"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"
}
}
Bây giờ, hãy tạo một tệp có tên là ingress.js với nội dung sau:
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}`);
});
Tạo một dockerfile cho vùng chứa chuyển tiếp
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" ]
Và tạo tệp ``.dockerignore` cho vùng chứa đầu vào.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Bây giờ, bạn có thể tạo hình ảnh cho vùng chứa chuyển tiếp bằng cách chạy lệnh sau:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
4. Tạo ứng dụng đồng hành
Trong phần này, bạn sẽ tạo một ứng dụng Node.js thứ hai sẽ được dùng làm vùng chứa phụ trong dịch vụ Cloud Run.
Chuyển đến thư mục sidecar.
cd ../sidecar
Tạo tệp package.json có nội dung sau:
{
"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"
}
}
Bây giờ, hãy tạo một tệp có tên là sidecar.js với nội dung sau:
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}`);
});
Tạo một Dockerfile cho vùng chứa phụ
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" ]
Và tạo tệp ``.dockerignore` cho vùng chứa phụ.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Bây giờ, bạn có thể tạo hình ảnh cho vùng chứa chuyển tiếp bằng cách chạy lệnh sau:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Triển khai dịch vụ Cloud Run
Bạn sẽ triển khai dịch vụ Cloud Run bằng tệp yaml.
Chuyển đến thư mục mẹ.
cd ..
Tạo một tệp có tên là sidecar-codelab.yaml với nội dung sau:
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"
Sau đó, triển khai dịch vụ bằng lệnh sau. Bạn cần sử dụng gcloud beta vì tính năng gắn ổ đĩa đang ở giai đoạn dùng thử công khai.
gcloud beta run services replace sidecar-codelab.yaml
Sau khi triển khai, hãy lưu URL dịch vụ vào một biến môi trường.
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)')
5. Gọi dịch vụ Cloud Run
Giờ đây, bạn có thể gọi dịch vụ bằng cách cung cấp mã nhận dạng của mình.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Kết quả của bạn sẽ có dạng tương tự như kết quả mẫu bên dưới:
The sidecar says: Hello ingress container! I'm the sidecar.
6. Chia sẻ tệp thông qua một ổ đĩa được gắn
Trong phần này, bạn sẽ cập nhật các vùng chứa để chia sẻ tệp thông qua một điểm gắn kết ổ đĩa. Trong ví dụ này, vùng chứa đầu vào sẽ ghi vào một tệp trên ổ đĩa dùng chung. Sidecar sẽ đọc tệp và trả nội dung của tệp về vùng chứa đầu vào.
Trước tiên, bạn sẽ cập nhật mã vùng chứa đầu vào. Chuyển đến thư mục ingress.
cd ../ingress
rồi thay thế nội dung của tệp ingress.js bằng nội dung sau:
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}`);
});
Và tạo hình ảnh mới cho vùng chứa cổng vào bằng cách chạy lệnh sau:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
Bây giờ, hãy chuyển đến thư mục sidecar:
cd ../sidecar
Và cập nhật sidecar.js bằng nội dung sau:
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}`);
});
Và tạo hình ảnh mới cho vùng chứa phụ bằng cách chạy lệnh sau:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Cập nhật sidecar-codelab.yaml bằng nội dung sau để chia sẻ một ổ đĩa:
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
Triển khai tệp sidecar-codelab.yaml đã cập nhật
gcloud beta run services replace sidecar-codelab.yaml
Giờ đây, bạn có thể gọi dịch vụ bằng cách cung cấp mã nhận dạng của mình.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Kết quả của bạn sẽ có dạng tương tự như kết quả mẫu bên dưới:
The sidecar says: the ingress container created this file.
7. Xin chúc mừng!
Chúc mừng bạn đã hoàn thành lớp học lập trình này!
Bạn nên xem tài liệu về Cloud Run, cụ thể là triển khai nhiều vùng chứa và sử dụng lệnh gắn ổ đĩa trong bộ nhớ.
Nội dung đã đề cập
- Cách tạo một vùng chứa sử dụng sidecar
- Cách một vùng chứa đầu vào có thể giao tiếp với một vùng chứa phụ bằng localhost
- Cách vùng chứa chuyển tiếp và vùng chứa phụ có thể cùng chia sẻ một ổ đĩa được gắn
8. Dọn dẹp
Để tránh bị tính phí ngoài ý muốn (ví dụ: nếu Cloud Function này được gọi nhiều lần hơn hạn mức gọi Cloud Run hằng tháng của bạn trong cấp miễn phí), bạn có thể xoá dịch vụ Cloud Run hoặc xoá dự án mà bạn đã tạo ở Bước 2.
Để xoá Cloud Function, hãy truy cập vào Cloud Console của Cloud Function tại https://console.cloud.google.com/run/ rồi xoá dịch vụ sidecar-codelab (hoặc $SERVICE_NAME nếu bạn dùng tên khác).
Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn bằng cách chạy gcloud projects list.