今天是第九天我們可以寫一個公車的K8s資料庫管理系統,以下是我的程式碼
每個服務都可以作為獨立的微服務部署在 Kubernetes 集群中。
// vehicle-service.js
const express = require('express');
const app = express();
app.use(express.json());
let vehicles = [
{ id: 1, type: 'bus', status: 'active' },
{ id: 2, type: 'mini-bus', status: 'maintenance' }
];
// 獲取所有車輛信息
app.get('/vehicles', (req, res) => {
res.json(vehicles);
});
// 新增車輛
app.post('/vehicles', (req, res) => {
const vehicle = req.body;
vehicles.push(vehicle);
res.status(201).json(vehicle);
});
// 更新車輛狀態
app.put('/vehicles/:id', (req, res) => {
const { id } = req.params;
const { status } = req.body;
const vehicle = vehicles.find(v => v.id == id);
if (vehicle) {
vehicle.status = status;
res.json(vehicle);
} else {
res.status(404).send('Vehicle not found');
}
});
app.listen(3000, () => {
console.log('Vehicle management service running on port 3000');
});
dockerfile
# 使用 Node.js 基礎映像
FROM node:14
# 設定工作目錄
WORKDIR /app
# 複製 package.json 並安裝依賴
COPY package*.json ./
RUN npm install
# 複製其餘的應用程式代碼
COPY . .
# 暴露應用程式的埠
EXPOSE 3000
# 啟動應用程式
CMD ["node", "vehicle-service.js"]
vehicle-deployment.yaml
):apiVersion: apps/v1
kind: Deployment
metadata:
name: vehicle-service
spec:
replicas: 3
selector:
matchLabels:
app: vehicle-service
template:
metadata:
labels:
app: vehicle-service
spec:
containers:
- name: vehicle-service
image: <your-docker-image>:latest
ports:
- containerPort: 3000
vehicle-service.yaml
):apiVersion: v1
kind: Service
metadata:
name: vehicle-service
spec:
selector:
app: vehicle-service
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP
確保你已經安裝好 Kubernetes 集群並且 Kubectl 可以正常使用。
# 部署車輛管理服務
kubectl apply -f vehicle-deployment.yaml
# 創建服務暴露
kubectl apply -f vehicle-service.yaml
為其他服務(如路線管理、乘客管理等)創建類似的微服務和 Kubernetes 配置。
你可以使用 Service Mesh(例如 Istio)來監控、管理和安全地路由服務之間的流量。
你可以使用 ConfigMaps 保存配置信息,例如服務的環境變數:
apiVersion: v1
kind: ConfigMap
metadata:
name: bus-management-config
data:
vehicle-service-url: "http://vehicle-service:3000"
Secrets 用於保存敏感數據,如 API 密鑰。
vehicle-service.js
檔案const express = require('express');
const app = express();
app.use(express.json());
express
是一個 Node.js 的 web 應用框架。使用它可以快速建立一個 HTTP 服務。app.use(express.json())
用來解析傳入的 JSON 請求,這讓我們可以從請求體中提取資料。車輛資料 (Vehicles)
let vehicles = [
{ id: 1, type: 'bus', status: 'active' },
{ id: 2, type: 'mini-bus', status: 'maintenance' }
];
vehicles
來模擬資料庫,儲存所有的車輛資料。每輛車有一個 id
、type
(車型)和 status
(狀態)。獲取車輛列表
app.get('/vehicles', (req, res) => {
res.json(vehicles);
});
app.get
定義了當用戶發送 GET /vehicles
請求時的行為,它會回傳所有車輛的 JSON 資料。新增車輛
app.post('/vehicles', (req, res) => {
const vehicle = req.body;
vehicles.push(vehicle);
res.status(201).json(vehicle);
});
app.post
定義了當用戶發送 POST /vehicles
請求時的行為,會從請求體中取得車輛資料 (req.body
),並將該車輛新增到 vehicles
陣列中,然後回傳新增的車輛資料並設定 HTTP 狀態碼為 201
(Created)。更新車輛狀態
app.put('/vehicles/:id', (req, res) => {
const { id } = req.params;
const { status } = req.body;
const vehicle = vehicles.find(v => v.id == id);
if (vehicle) {
vehicle.status = status;
res.json(vehicle);
} else {
res.status(404).send('Vehicle not found');
}
});
app.put
定義了當用戶發送 PUT /vehicles/:id
請求時的行為。這裡使用了 URL 參數 (:id
) 來取得特定車輛的 ID,並從請求體中取得新的狀態 (status
)。id
對應的車輛,如果找到就更新狀態並回傳更新後的車輛資料。如果找不到該車輛,則回傳 404 (Not Found)。啟動服務
app.listen(3000, () => {
console.log('Vehicle management service running on port 3000');
});
3000
埠,當服務啟動時會在控制台輸出 "Vehicle management service running on port 3000"。Dockerfile 定義了如何將 Node.js 應用程式容器化。
dockerfile
# 使用 Node.js 基礎映像
FROM node:14
14
作為基礎映像,它提供了運行 Node.js 應用的環境。dockerfile
# 設定工作目錄
WORKDIR /app
WORKDIR
指定了容器內的工作目錄,這裡設置為 /app
。後續的指令都會在這個目錄下執行。dockerfile
# 複製 package.json 並安裝依賴
COPY package*.json ./
RUN npm install
COPY package*.json ./
會將本地的 package.json
檔案複製到容器中的 /app
目錄。RUN npm install
執行安裝所有定義在 package.json
中的 Node.js 依賴。dockerfile
# 複製其餘的應用程式代碼
COPY . .
/app
目錄中。dockerfile
# 暴露應用程式的埠
EXPOSE 3000
3000
埠,這是我們應用程式在容器內監聽的埠。dockerfile
# 啟動應用程式
CMD ["node", "vehicle-service.js"]
CMD
命令來啟動 Node.js 應用,這裡執行的是 vehicle-service.js
檔案。這些檔案定義了如何將微服務部署到 Kubernetes。
vehicle-deployment.yaml
)apiVersion: apps/v1
kind: Deployment
metadata:
name: vehicle-service
spec:
replicas: 3
selector:
matchLabels:
app: vehicle-service
template:
metadata:
labels:
app: vehicle-service
spec:
containers:
- name: vehicle-service
image: <your-docker-image>:latest
ports:
- containerPort: 3000
apiVersion: apps/v1
定義了 API 版本,我們使用 apps/v1
來創建 Deployment
資源。kind: Deployment
指定我們要創建的是一個 Kubernetes 部署。metadata
中的 name
定義了部署的名稱,這裡是 vehicle-service
。spec.replicas
設定了運行該服務的副本數量(這裡是 3 個副本,確保服務的可用性和擴展性)。template
定義了應用程式的 Pod 模板,指定了應用的容器、映像(image)和監聽的埠(3000
埠)。vehicle-service.yaml
)apiVersion: v1
kind: Service
metadata:
name: vehicle-service
spec:
selector:
app: vehicle-service
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP
kind: Service
創建一個 Kubernetes 服務,用來暴露我們的應用。metadata.name
指定服務的名稱為 vehicle-service
。selector
用來選擇與該服務對應的 Pod(即所有標籤為 app: vehicle-service
的 Pod)。ports
定義了從外部到內部的端口映射,外部使用 80
埠訪問,並將流量轉發到容器內部的 3000
埠。type: ClusterIP
指定服務的類型為內部的集群 IP,這樣只有集群內的其他應用可以訪問這個服務。最後,我可以使用 kubectl
指令將這些資源部署到 Kubernetes 集群。
# 部署車輛管理服務
kubectl apply -f vehicle-deployment.yaml
# 創建服務暴露
kubectl apply -f vehicle-service.yaml
這些命令會創建並部署你的車輛管理微服務到 Kubernetes 集群。