iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
Kubernetes

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

day 10 k8s 戶口資料資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第十天我們可以寫一個k8s戶口資料庫管理系統,以下是我的程式碼

  1. 資料庫(例如 MySQL)作為持久層:存儲戶口資料。
  2. 後端 API(例如 Python Flask 或 Node.js):提供與資料庫交互的 API。
  3. 前端介面(例如 React 或 Vue.js):讓用戶可以透過瀏覽器查看和管理戶口資料。
  4. Kubernetes 部署配置:包括部署資料庫、後端服務和前端應用。

1. 部署 MySQL 資料庫

在 Kubernetes 中,你可以用一個 StatefulSet 來部署 MySQL。以下是 mysql-deployment.yaml 的配置範例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "rootpassword"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

2. 後端 API

後端 API 可以使用 Python Flask 實現,並與 MySQL 交互。以下是 app.py 的簡單範例:

from flask import Flask, request, jsonify
import pymysql

app = Flask(__name__)

# 連接 MySQL
def get_db_connection():
    return pymysql.connect(host='mysql-service', user='root', password='rootpassword', db='household_db')

@app.route('/households', methods=['GET'])
def get_households():
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM households')
    rows = cursor.fetchall()
    conn.close()

    return jsonify(rows)

@app.route('/household', methods=['POST'])
def add_household():
    new_household = request.json
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute('INSERT INTO households (name, address) VALUES (%s, %s)', (new_household['name'], new_household['address']))
    conn.commit()
    conn.close()

    return 'New household added', 201

if __name__ == "__main__":
    app.run(host='0.0.0.0')

Dockerfile:

dockerfile
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

requirements.txt 文件:

Flask
pymysql

3. Kubernetes 部署後端 API

將後端 API 部署到 K8s:

backend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: your-docker-repo/backend:latest
        ports:
        - containerPort: 5000

apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
  type: ClusterIP

4. 前端應用

使用 React 或 Vue.js 實現前端。這裡簡單展示一個用 Fetch API 呼叫後端的 React 範例。

import React, { useEffect, useState } from 'react';

function App() {
  const [households, setHouseholds] = useState([]);

  useEffect(() => {
    fetch('/api/households')
      .then(response => response.json())
      .then(data => setHouseholds(data));
  }, []);

  return (
    <div>
      <h1>Household List</h1>
      <ul>
        {households.map((household, index) => (
          <li key={index}>{household.name} - {household.address}</li>
        ))}
      </ul>
    </div>
  );
}

export default App;

前端部署到 K8s

frontend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: your-docker-repo/frontend:latest
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: ClusterIP

5. 整合服務

將前端和後端的服務通過 Kubernetes 的 Ingress 或 LoadBalancer 曝露給外部。這樣使用者可以透過瀏覽器訪問該應用。
當然,我將一步步解釋這些程式碼的各個部分,讓你了解它們的功能以及如何相互協作來實現 Kubernetes 上的戶口資料庫管理系統。

1. MySQL 部署 (mysql-deployment.yaml)

這個 YAML 文件定義了 MySQL 資料庫的 Kubernetes 部署。

  • StatefulSet:這是一個用來管理有狀態應用的 Kubernetes 物件,它適合像 MySQL 這樣的應用,因為資料需要持久化並保持一致性。
  • replicas: 這裡設定副本數為 1,表示只有一個 MySQL 實例運行。
  • MYSQL_ROOT_PASSWORD:環境變數用來設定 MySQL 的 root 密碼。
  • volumeClaimTemplates: 定義持久化存儲卷,確保 MySQL 資料在 Pod 重啟時依然存在。

這個配置會啟動 MySQL 資料庫,並透過卷將資料存放在集群中的持久存儲卷中。

2. 後端 API (app.py)

後端 API 是使用 Python 的 Flask 框架來開發,並與 MySQL 資料庫進行交互。

  • get_db_connection():這是用來連接 MySQL 資料庫的函數,使用 pymysql 庫來處理資料庫操作。

    • host='mysql-service' 指的是 Kubernetes 中的 MySQL 服務,這是 MySQL 的主機名。
    • user='root'password='rootpassword' 則是用於連接資料庫的憑證。
  • /households 路由 (GET 請求)

    • 當用戶訪問這個端點時,程式碼會從 MySQL 資料庫中取得所有戶口資料(households 表)。
    • cursor.execute('SELECT * FROM households') 查詢資料庫中的所有資料。
    • 取得的結果會轉換為 JSON,並返回給用戶。
  • /household 路由 (POST 請求)

    • 用於新增戶口資料。接收來自請求體的 JSON 資料,將資料寫入 MySQL 資料庫的 households 表。
    • cursor.execute('INSERT INTO households (name, address) VALUES (%s, %s)', (new_household['name'], new_household['address'])) 將戶口資料寫入資料庫。

這個 API 是前端應用的主要數據源,處理戶口資料的增刪查改操作。

3. Dockerfile

這個 Dockerfile 用來打包後端 API 的應用程式,並確保它可以運行在容器中。

  • FROM python:3.8-slim:基於 Python 3.8 的精簡版本來建立基礎映像。
  • COPY requirements.txt .:將依賴文件 requirements.txt 複製到 Docker 映像中,然後執行 pip install 安裝所需的 Python 套件(如 Flask 和 pymysql)。
  • CMD ["python", "app.py"]:啟動 Flask 應用程式並讓其在容器中運行。

這個 Dockerfile 用來生成一個可以部署在 Kubernetes 上的後端 API 容器。


4. Kubernetes 後端 API 部署 (backend-deployment.yaml)

這個 YAML 文件定義了後端 API 如何部署在 Kubernetes 集群上。

  • Deployment:定義如何在 Kubernetes 中部署後端應用,包括副本數量和運行的容器映像。

    • replicas: 1:部署一個副本。
    • image: your-docker-repo/backend:latest:這裡指定了後端應用的 Docker 映像,你需要將它替換成你自己的映像名稱。
  • Service:用來暴露後端服務,使其能夠在集群內被其他應用訪問。

    • type: ClusterIP:這是一個集群內部的服務,只有集群內的應用可以訪問它。
    • targetPort: 5000:這是 Flask 應用運行的端口,服務會將流量轉發到這個端口。

5. 前端應用 (React)

這個程式碼用 React 框架來建立一個簡單的前端應用,展示戶口資料。

  • useEffect():當應用加載時,這個鉤子函數會發出一個 GET 請求來獲取所有戶口資料。

    • fetch('/api/households'):這裡假設你的後端 API 被設置為 /api/ 路徑。它會向這個路徑發出請求,並將回傳的 JSON 資料轉換為前端應用的狀態。
  • households.map():遍歷戶口資料,並將它們顯示為列表。

這個 React 應用負責與後端 API 進行交互,讓用戶能夠在網頁上查看戶口資料。

6. Kubernetes 前端部署 (frontend-deployment.yaml)

這個 YAML 文件用來部署 React 應用。

  • Deployment:定義了如何部署前端應用,這與後端 API 的部署相似。

    • replicas: 1:設定一個副本來運行前端應用。
    • image: your-docker-repo/frontend:latest:這裡需要替換為你自己生成的前端 Docker 映像。
  • Service:這裡定義了如何暴露前端應用,使其能夠被外部訪問。

    • type: ClusterIP:這意味著服務在集群內部暴露,讓其他應用可以訪問前端服務。

7. 總結與整合

  • MySQL 提供資料存儲層,用來存儲戶口資料。
  • 後端 API(Flask)負責處理與 MySQL 資料庫的交互,實現資料的增刪查改。
  • 前端應用(React)提供使用者介面,讓用戶可以查看和管理戶口資料。
  • Kubernetes 部署 用來管理應用的容器化部署,確保應用在集群中穩定運行並保持可擴展性。

上一篇
Day 9 K8s公車資料庫管理系統
下一篇
day 11 k8s 學校ESG資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言