今天是第九天我們可以寫一個公車的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 集群。