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 dịch vụ Cloud Run sử dụng nhiều vùng chứa. Bạn sẽ tạo một ứng dụngnode.js sẽ được dùng làm vùng chứa lưu lượng truy cập Cloud Run và một ứng dụngnode.js khác sẽ đượ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 được dùng làm vùng chứa chính cho lưu lượng vào web. Một hoặc nhiều vùng chứa bổ sung được gọi là tệp trợ giúp.
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 localhost, vì vậy, tất cả các vùng chứa đều có thể theo dõi một cổng, ví dụ: localhost:port.
- Bạn cũng có thể 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ả vùng chứa trong phiên bản Cloud Run đều dùng chung giao diện mạng máy chủ cục bộ, nên bạn có thể sử dụng một tệp trợ giúp phía trước vùng chứa chính để gửi các yêu cầu proxy. Các proxy như vậy có thể cung cấp lớp trừu tượng bổ sung để lưu lượng lưu lượng truy cập vào ứng dụng giữa ứng dụng và máy chủ hiệu quả hơn bằng cách chặn 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).
Do nhiều vùng chứa có thể giao tiếp bằng cách chia sẻ tệp qua ổ đĩa dùng chung, nên bạn sẽ thêm nhiều ứng dụng trợ giúp vào dịch vụ của mình. Ví dụ: bạn có thể thiết lập dịch vụ Cloud Run để sử dụng các tác nhân tuỳ chỉnh như OpenTelemetry để 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 tệp trợ giúp kết nối với cơ sở dữ liệu Cloud Spanner PostgreSQL (ví dụ về Cloud Spanner Postgress).
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 dịch vụ Cloud Run, trong đó vùng chứa lưu lượng vào của dịch vụ đó giao tiếp với một tệp trợ giúp thông qua cổng máy chủ cục bộ. Sau đó, bạn sẽ cập nhật vùng chứa lưu lượng vào và ngăn trợ giúp để chia sẻ tệp qua giá đỡ âm lượng.
Kiến thức bạn sẽ học được
- Cách tạo vùng chứa sử dụng tệp trợ giúp
- Cách một vùng chứa lưu lượng vào có thể giao tiếp với một tệp trợ giúp bằng localhost
- Cách cả vùng chứa lưu lượng vào và tệp trợ giúp đều có thể chia sẻ một tệp thông qua một ổ đĩ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 triển khai dịch vụ web từ phần bắt đầu nhanh bằng 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 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 nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự á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
Kết quả 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
Kết quả lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
3. Tạo ứng dụng ingress
Đặt 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á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 giữ hình ảnh vùng chứa của bạn
Bạn có thể tạo một kho lưu trữ trong Artifact Registry để lưu trữ 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
với 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 tệp dockerfile cho vùng chứa lưu lượng vào
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" ]
Đồng thời, hãy tạo một tệp ".dockerignore" cho vùng chứa lưu lượng 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 lưu lượ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
4. Tạo ứng dụng trợ giúp
Trong phần này, bạn sẽ tạo một ứng dụngnode.js thứ hai sẽ được dùng làm ứng dụng trợ giúp trong dịch vụ Cloud Run.
Chuyển đến thư mục tệp trợ giúp.
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 trợ giú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=5000 CMD [ "npm", "start" ]
Và tạo một tệp ".dockerignore" cho vùng chứa tệp trợ giúp.
# 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 lưu lượng vào 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
có 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 đó, hãy 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 kết ổ đĩa đang ở chế độ dùng trước công khai.
gcloud beta run services replace sidecar-codelab.yaml
Sau khi triển khai, hãy lưu URL của dịch vụ trong 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ã thông báo nhận dạng.
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 dưới đây:
The sidecar says: Hello ingress container! I'm the sidecar.
6. Chia sẻ tệp qua giá đỡ ổ đĩa
Trong phần này, bạn sẽ cập nhật các vùng chứa để chia sẻ tệp qua tính năng gắn kết ổ đĩa. Trong ví dụ này, vùng chứa lưu lượng vào sẽ ghi vào một tệp trên ổ đĩa dùng chung. Tệp trợ giúp sẽ đọc tệp và trả nội dung của tệp trở lại vùng chứa lưu lượng vào.
Trước tiên, bạn sẽ cập nhật mã vùng chứa lưu lượng vào. Chuyển đến thư mục lưu lượng vào.
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 lưu lượ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 trợ giúp:
cd ../sidecar
Và cập nhật sidecar.js
với 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 trợ giúp của bạn 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
như sau để chia sẻ âm lượng:
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ã thông báo nhận dạng.
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 dưới đây:
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!
Bạn nên tham khảo tài liệu về Cloud Run, cụ thể là về việc triển khai đa vùng chứa và sử dụng thiết bị gắn ổ đĩa trong bộ nhớ.
Nội dung đã đề cập
- Cách tạo vùng chứa sử dụng tệp trợ giúp
- Cách một vùng chứa lưu lượng vào có thể giao tiếp với một tệp trợ giúp bằng localhost
- Cách cả vùng chứa lưu lượng vào và tệp trợ giúp đều có thể dùng chung một ổ đĩa được gắn
8. Dọn dẹp
Để tránh các khoản phí vô tình (ví dụ: nếu Hàm đám mây này vô tình bị gọi nhiều lần hơn mức phân bổ lệnh gọi Cloud Run hằng tháng của bạn ở cấp miễn phí), bạn có thể xoá dịch vụ Cloud Run hoặc xoá dự án đã tạo ở Bước 2.
Để xoá Cloud Function, hãy truy cập vào Cloud Function Cloud Console tại https://console.cloud.google.com/run/ rồi xoá dịch vụ sidecar-codelab
(hoặc $SERVICE_NAME nếu bạn đã sử 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 mà bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ phải thay đổi các dự án trong Cloud SDK của mình. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list
.