今天是第十二天我們可以寫一個k8s科技園區廠區氣體資料庫管理系統,由於公司內部需要氣體轉換去做排放廢氣的問題因此我們可以k8s去做大量資料的管理,以下是我的程式碼
前端 (Frontend):
後端 (Backend):
資料庫 (Database):
K8s 叢集 (Kubernetes Cluster):
使用 ORM (例如 SQLAlchemy),定義氣體數據的資料表結構:
from sqlalchemy import Column, Integer, String, Float, DateTime
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class GasData(Base):
__tablename__ = 'gas_data'
id = Column(Integer, primary_key=True)
gas_type = Column(String(50))
flow_rate = Column(Float) # 氣體流量
pressure = Column(Float) # 壓力
temperature = Column(Float) # 溫度
emission_amount = Column(Float) # 廢氣排放量
timestamp = Column(DateTime, default=datetime.utcnow)
建立 API 來處理數據的創建、查詢和監控:
from fastapi import FastAPI
from sqlalchemy.orm import Session
from models import GasData
app = FastAPI()
@app.post("/gas/")
def create_gas_data(gas_type: str, flow_rate: float, pressure: float, temperature: float, emission_amount: float):
session = Session()
gas_data = GasData(gas_type=gas_type, flow_rate=flow_rate, pressure=pressure, temperature=temperature, emission_amount=emission_amount)
session.add(gas_data)
session.commit()
return {"message": "Gas data added successfully"}
@app.get("/gas/")
def get_gas_data():
session = Session()
gas_data = session.query(GasData).all()
return gas_data
React 前端可以使用 fetch
API 向後端查詢數據,並展示氣體的實時狀況:
import React, { useState, useEffect } from "react";
function GasDashboard() {
const [gasData, setGasData] = useState([]);
useEffect(() => {
fetch("/gas/")
.then((response) => response.json())
.then((data) => setGasData(data));
}, []);
return (
<div>
<h1>Gas Monitoring Dashboard</h1>
<table>
<thead>
<tr>
<th>Gas Type</th>
<th>Flow Rate</th>
<th>Pressure</th>
<th>Temperature</th>
<th>Emission Amount</th>
</tr>
</thead>
<tbody>
{gasData.map((item) => (
<tr key={item.id}>
<td>{item.gas_type}</td>
<td>{item.flow_rate}</td>
<td>{item.pressure}</td>
<td>{item.temperature}</td>
<td>{item.emission_amount}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default GasDashboard;
將後端和前端分別打包成 Docker 容器,並在 K8s 中進行部署。deployment.yaml
例子如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: gas-management-backend
spec:
replicas: 2
selector:
matchLabels:
app: gas-management-backend
template:
metadata:
labels:
app: gas-management-backend
spec:
containers:
- name: gas-management-backend
image: gas-management-backend:latest
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: gas-management-backend
spec:
selector:
app: gas-management-backend
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: LoadBalancer
你可以利用 Prometheus 收集氣體數據,並透過 Grafana 進行可視化,或設置自動警告功能:
這部分是使用 Python 的 SQLAlchemy 建立資料庫的 ORM(物件關聯映射)模型。GasData
類定義了資料表的結構,它對應於資料庫中一個表,並用來儲存氣體的相關數據:
from sqlalchemy import Column, Integer, String, Float, DateTime
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class GasData(Base):
__tablename__ = 'gas_data'
id = Column(Integer, primary_key=True)
gas_type = Column(String(50)) # 氣體種類(如氫氣、氧氣)
flow_rate = Column(Float) # 氣體流量
pressure = Column(Float) # 壓力
temperature = Column(Float) # 溫度
emission_amount = Column(Float) # 廢氣排放量
timestamp = Column(DateTime, default=datetime.utcnow) # 自動添加時間戳
說明:
__tablename__ = 'gas_data'
:指定資料表名稱為 gas_data
。Column()
都對應到資料庫中的一個欄位。例如,gas_type
是氣體種類,flow_rate
是流量,pressure
是壓力,emission_amount
是廢氣排放量。timestamp
自動設定為當前時間,用來記錄每次數據輸入的時間點。這部分是後端的核心,使用 FastAPI 框架來處理 HTTP 請求並與資料庫進行互動。
@app.post("/gas/")
def create_gas_data(gas_type: str, flow_rate: float, pressure: float, temperature: float, emission_amount: float):
session = Session() # 建立資料庫連線
gas_data = GasData(gas_type=gas_type, flow_rate=flow_rate, pressure=pressure, temperature=temperature, emission_amount=emission_amount)
session.add(gas_data) # 將氣體數據新增至資料庫
session.commit() # 提交資料庫更改
return {"message": "Gas data added successfully"} # 返回成功訊息
說明:
@app.post("/gas/")
:這是一個 POST 請求的端點,當用戶發送氣體數據時,它會將數據保存到資料庫。gas_type
, flow_rate
, pressure
, temperature
, emission_amount
是從請求中傳入的數據。session.add()
將新的 GasData
實例添加到資料庫會話,session.commit()
確保這些變更保存到資料庫中。@app.get("/gas/")
def get_gas_data():
session = Session() # 建立資料庫連線
gas_data = session.query(GasData).all() # 查詢所有氣體數據
return gas_data # 返回數據作為 JSON
說明:
@app.get("/gas/")
:這是用來查詢氣體數據的端點,它會從資料庫中取得所有的 GasData
資料並以 JSON 格式返回給前端。前端部分是使用 React 框架來顯示後端 API 返回的氣體數據。這是一個簡單的儀表板,用於顯示氣體的各項參數。
import React, { useState, useEffect } from "react";
function GasDashboard() {
const [gasData, setGasData] = useState([]); // 用來存放氣體數據的狀態變數
useEffect(() => {
fetch("/gas/") // 從後端 API 獲取數據
.then((response) => response.json()) // 將回應轉換為 JSON 格式
.then((data) => setGasData(data)); // 將數據儲存在狀態變數中
}, []);
return (
<div>
<h1>Gas Monitoring Dashboard</h1>
<table>
<thead>
<tr>
<th>Gas Type</th>
<th>Flow Rate</th>
<th>Pressure</th>
<th>Temperature</th>
<th>Emission Amount</th>
</tr>
</thead>
<tbody>
{gasData.map((item) => (
<tr key={item.id}>
<td>{item.gas_type}</td>
<td>{item.flow_rate}</td>
<td>{item.pressure}</td>
<td>{item.temperature}</td>
<td>{item.emission_amount}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default GasDashboard;
說明:
useState([])
:初始化空陣列來存放從後端獲取的氣體數據。useEffect(() => { ... }, [])
:在組件加載時執行一次 fetch("/gas/")
,用來向後端請求氣體數據。map()
函數用來遍歷氣體數據並將每條數據顯示在 HTML 表格中。deployment.yaml
用來在 Kubernetes 中部署這個後端服務。
apiVersion: apps/v1
kind: Deployment
metadata:
name: gas-management-backend
spec:
replicas: 2 # 部署兩個實例
selector:
matchLabels:
app: gas-management-backend
template:
metadata:
labels:
app: gas-management-backend
spec:
containers:
- name: gas-management-backend
image: gas-management-backend:latest # 使用最新的容器鏡像
ports:
- containerPort: 8000 # 服務運行在 8000 端口
---
apiVersion: v1
kind: Service
metadata:
name: gas-management-backend
spec:
selector:
app: gas-management-backend
ports:
- protocol: TCP
port: 80 # 對外開放的端口
targetPort: 8000 # 目標容器內部運行的端口
type: LoadBalancer # 使用負載均衡器來分發流量
說明:
replicas: 2
:部署兩個後端服務的實例來實現高可用性。image: gas-management-backend:latest
:使用容器化後的後端應用。Service
部分將服務暴露在外網,並設定負載均衡器來分發請求。