今天是第二十八天我們可以寫一個k8s農業部資料庫管理系統,以下是我的程式碼
為了讓應用程式在 Kubernetes 上運行,你需要先為每個服務創建 Docker 映像。
# app.py
from flask import Flask, jsonify, request
import mysql.connector
app = Flask(__name__)
@app.route('/crops', methods=['GET'])
def get_crops():
    connection = mysql.connector.connect(
        host='mysql-service',  # Kubernetes 內的資料庫服務名稱
        user='root',
        password='password',
        database='agriculture'
    )
    cursor = connection.cursor(dictionary=True)
    cursor.execute("SELECT * FROM crops")
    crops = cursor.fetchall()
    return jsonify(crops)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
dockerfile
# 使用 Python 3.9 基礎映像
FROM python:3.9-slim
# 設置工作目錄
WORKDIR /app
# 安裝依賴
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
# 複製應用程式代碼
COPY . .
# 暴露端口
EXPOSE 5000
# 啟動應用程式
CMD ["python", "app.py"]
requirements.txtFlask==2.0.3
mysql-connector-python==8.0.28
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: your-docker-repo/backend:latest
        ports:
        - containerPort: 5000
---
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
  type: LoadBalancer
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        - name: MYSQL_DATABASE
          value: "agriculture"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
假設前端使用 React:
dockerfile
# 使用 node 基礎映像
FROM node:16-alpine
WORKDIR /app
# 複製 package.json 並安裝依賴
COPY package*.json ./
RUN npm install
# 複製應用程式代碼
COPY . .
# 構建應用
RUN npm run build
# 使用 nginx 作為服務器
FROM nginx:1.21-alpine
COPY --from=0 /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: your-docker-repo/frontend:latest
        ports:
        - containerPort: 80
---
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
部署流程:
構建 Docker 映像:
docker build -t your-docker-repo/backend:latest -f Dockerfile .
docker build -t your-docker-repo/frontend:latest -f Dockerfile .
上傳到 DockerHub 或私人容器註冊表:
docker push your-docker-repo/backend:latest
docker push your-docker-repo/frontend:latest
部署到 Kubernetes:
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f backend-deployment.yaml
kubectl apply -f backend-service.yaml
kubectl apply -f frontend-deployment.yaml
kubectl apply -f frontend-service.yaml
kubectl get pods
kubectl get services
這個部分的程式碼使用了 Flask 作為後端框架,並通過 MySQL 連接來管理和存取農業部的資料庫。
app.pyfrom flask import Flask, jsonify, request
import mysql.connector
app = Flask(__name__)  # 創建 Flask 應用實例
@app.route('/crops', methods=['GET'])
def get_crops():
    # 連接 MySQL 資料庫
    connection = mysql.connector.connect(
        host='mysql-service',  # Kubernetes 中 MySQL 服務的名稱
        user='root',
        password='password',
        database='agriculture'  # 資料庫名稱
    )
    cursor = connection.cursor(dictionary=True)
    cursor.execute("SELECT * FROM crops")  # 執行 SQL 查詢,從 crops 表中選擇所有數據
    crops = cursor.fetchall()  # 獲取查詢結果
    return jsonify(crops)  # 返回 JSON 格式的結果
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)  # 啟動 Flask 伺服器
Flask 應用:用於創建 API 來處理 HTTP 請求。@app.route('/crops') 定義了當訪問 /crops 路徑時,會返回作物數據的功能。
MySQL 連接:mysql.connector.connect() 用來連接 MySQL 資料庫。這裡的 host 是 Kubernetes 內的服務名稱 (mysql-service),user 是 MySQL 用戶名,password 是數據庫的密碼。
SQL 查詢:透過 SQL 語句 SELECT * FROM crops 從資料庫中提取作物數據,然後將結果轉換為 JSON 格式通過 API 返回。
dockerfile
# 使用 Python 3.9 基礎映像
FROM python:3.9-slim
# 設置工作目錄
WORKDIR /app
# 安裝依賴
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
# 複製應用程式代碼
COPY . .
# 暴露端口
EXPOSE 5000
# 啟動應用程式
CMD ["python", "app.py"]
FROM python:3.9-slim:指定基礎映像,這裡選擇的是 Python 3.9 的輕量級版本。WORKDIR /app:設置工作目錄 /app,之後的所有操作都會在這個目錄下執行。COPY requirements.txt 會將本地的 requirements.txt 複製到容器中,並透過 pip install 安裝所需的依賴。COPY . . 會將當前目錄的所有檔案複製到容器內。5000 端口運行。CMD 用來啟動 Flask 應用,這裡是執行 app.py。Kubernetes (K8s) 配置檔案用來管理後端、前端和 MySQL 的容器化應用,並進行自動調度與負載均衡。
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 3  # 副本數,會運行3個 Flask 應用實例
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: your-docker-repo/backend:latest  # 從 Docker Hub 或私人註冊表中拉取映像
        ports:
        - containerPort: 5000  # 指定容器內部的 Flask 應用埠
---
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend  # 服務會將流量轉發給具有這個標籤的 Pod
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000  # 服務會將端口 80 的流量轉發到 Flask 應用的 5000 埠
  type: LoadBalancer  # 創建一個負載均衡器來分配流量
Deployment:
replicas: 3 表示會運行 3 個後端實例來保證高可用性。image: your-docker-repo/backend:latest 是要部署的 Docker 映像。Service:
LoadBalancer,會將外部請求通過負載均衡器分配到後端的不同 Pod,並將流量從外部的 80 埠轉發到 Flask 應用的 5000 埠。# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1  # 只需要一個 MySQL 實例
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0  # 使用 MySQL 8.0 的映像
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"  # 設置 MySQL root 密碼
        - name: MYSQL_DATABASE
          value: "agriculture"  # 創建 agriculture 資料庫
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql  # 資料持久化存儲
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc  # 定義持久卷
---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306  # MySQL 的服務端口
      targetPort: 3306
agriculture)。PersistentVolumeClaim 來確保 MySQL 數據不會隨著容器的銷毀而丟失。mysql-service),用來讓其他應用(如後端)連接 MySQL。假設前端使用 React,配置類似於後端的流程。
# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 2  # 部署兩個副本
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: your-docker-repo/frontend:latest  # 前端應用的映像
        ports:
        - containerPort: 80
---
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80  # 將外部 80 埠的流量導向前端應用
      targetPort: 80
  type: LoadBalancer  # 使用負載均衡來分配前端流量
frontend-deployment.yaml 定義了兩個前端實例,確保應用的可用性。frontend-service.yaml 將流量通過 LoadBalancer 分配到前端應用。