iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Kubernetes

K8s 資料庫管理系統系列 第 13

day 12 K8s 科學園區廠區氣體資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第十二天我們可以寫一個k8s科技園區廠區氣體資料庫管理系統,由於公司內部需要氣體轉換去做排放廢氣的問題因此我們可以k8s去做大量資料的管理,以下是我的程式碼

  1. 氣體數據的記錄和存儲:可以記錄不同類型氣體的使用量、廢氣排放量、轉換過程中的關鍵參數(如壓力、溫度等)。
  2. 外部接管線數據監控:監測外部氣體接管線的狀況,例如流量、廢氣成分,並能夠在異常情況下發出警告。
  3. Kubernetes 部署管理:系統使用微服務架構,部署在 K8s 叢集上,具備高擴展性和彈性。

系統架構:

  1. 前端 (Frontend)

    • 使用 React 或 Vue.js 來製作氣體數據顯示儀表板,顯示實時數據、警告信息、歷史數據查詢。
  2. 後端 (Backend)

    • 使用 Python 的 Flask 或 FastAPI 框架來處理 API 請求,並與資料庫進行互動。
    • 支援 RESTful API 來提供數據查詢、上傳等功能。
  3. 資料庫 (Database)

    • 使用 MySQL 或 PostgreSQL 作為資料庫,記錄氣體的數據,如氣體種類、使用量、排放量、廢氣成分等。
  4. K8s 叢集 (Kubernetes Cluster)

    • 每個服務以 Docker 容器的形式部署,K8s 負責管理這些容器的部署、擴展和負載均衡。
    • 使用 Prometheus 監控氣體相關數據,如流量、接管線狀態,並且整合 Grafana 顯示監控數據。

具體步驟

1. 建立資料庫模型

使用 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)

2. 後端 API

建立 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

3. 前端顯示數據 (使用 React)

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;

4. Kubernetes 部署

將後端和前端分別打包成 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 進行可視化,或設置自動警告功能:

  1. Prometheus:負責收集所有氣體傳感器的數據,監控氣體的流動狀態和排放狀況。
  2. Grafana:使用儀表板來展示氣體數據的變化趨勢,並設定警告,當某些氣體數據超出安全範圍時發出通知。

1. 資料庫模型 (GasData)

這部分是使用 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 自動設定為當前時間,用來記錄每次數據輸入的時間點。

2. 後端 API (使用 FastAPI)

這部分是後端的核心,使用 FastAPI 框架來處理 HTTP 請求並與資料庫進行互動。

創建氣體數據的 API 端點

@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() 確保這些變更保存到資料庫中。

獲取所有氣體數據的 API 端點

@app.get("/gas/")
def get_gas_data():
    session = Session()  # 建立資料庫連線
    gas_data = session.query(GasData).all()  # 查詢所有氣體數據
    return gas_data  # 返回數據作為 JSON

說明:

  • @app.get("/gas/"):這是用來查詢氣體數據的端點,它會從資料庫中取得所有的 GasData 資料並以 JSON 格式返回給前端。

3. 前端顯示數據 (使用 React)

前端部分是使用 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 表格中。

4. Kubernetes 部署 (K8s)

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 部分將服務暴露在外網,並設定負載均衡器來分發請求。

總結

  • 資料庫模型 定義了如何存儲和管理氣體數據。
  • 後端 API 處理數據的創建、查詢,並與資料庫進行交互。
  • 前端 負責顯示氣體的監控數據,並且能與後端 API 進行交互。
  • Kubernetes 部署 確保應用可以在容器環境下以高可用的方式運行。

上一篇
day 12 K8s住戶個人資料庫管理系統
下一篇
day 14 K8s銀行提款資料庫管理系統
系列文
K8s 資料庫管理系統15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言