iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Kubernetes

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

day 17 k8s 民調資料庫管理系統

  • 分享至 

  • xImage
  •  

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

  1. 資料庫 (如 MySQL、PostgreSQL):用來存儲民調數據。
  2. Web 應用 (如 Flask、Django):作為管理介面,用來處理民調數據的增刪改查。
  3. Kubernetes 部署:將應用和資料庫容器化,並透過 Kubernetes 進行管理和伸縮。

步驟:

  1. 設定資料庫容器 (以 MySQL 為例)

    • 建立一個 MySQL 資料庫容器,用於存儲民調資料。
  2. 建立 Web 應用 (以 Flask 為例)

    • Web 應用將作為資料庫的管理介面,處理用戶的請求來進行投票、查詢民調結果。
  3. Kubernetes 部署配置 (YAML 檔案)

    • 定義 Deployment、Service、ConfigMap 等來管理應用。

1. 建立 MySQL 資料庫容器

在 Kubernetes 中,我們可以使用 YAML 文件來描述 MySQL 的部署,並透過 PersistentVolume 來持久化資料庫數據。

mysql-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: rootpassword  # 設置 MySQL root 密碼
        - name: MYSQL_DATABASE
          value: poll_db  # 初始化資料庫
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql

2. 建立 Web 應用 (Flask)

建立 Flask 應用程式

from flask import Flask, request, jsonify
import mysql.connector

app = Flask(__name__)

# 連接 MySQL 資料庫
def get_db_connection():
    connection = mysql.connector.connect(
        host='mysql',
        user='root',
        password='rootpassword',
        database='poll_db'
    )
    return connection

@app.route('/polls', methods=['GET'])
def get_polls():
    conn = get_db_connection()
    cursor = conn.cursor(dictionary=True)
    cursor.execute('SELECT * FROM polls')
    polls = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(polls)

@app.route('/polls', methods=['POST'])
def create_poll():
    data = request.json
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute('INSERT INTO polls (question) VALUES (%s)', (data['question'],))
    conn.commit()
    cursor.close()
    conn.close()
    return '', 201

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Dockerfile

Dockerfile
# 使用 Python 基礎鏡像
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 安裝所需的 Python 套件
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

# 複製應用程式檔案
COPY . .

# 開放應用運行端口
EXPOSE 5000

# 運行 Flask 應用
CMD ["python", "app.py"]

requirements.txt:

flask
mysql-connector-python

3. Kubernetes Web 應用部署

flask-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask-app
  template:
    metadata:
      labels:
        app: flask-app
    spec:
      containers:
      - name: flask-app
        image: flask-app:latest
        ports:
        - containerPort: 5000
        env:
        - name: MYSQL_HOST
          value: mysql
        - name: MYSQL_USER
          value: root
        - name: MYSQL_PASSWORD
          value: rootpassword
        - name: MYSQL_DB
          value: poll_db
---
apiVersion: v1
kind: Service
metadata:
  name: flask-app
spec:
  ports:
    - port: 5000
  selector:
    app: flask-app

4. 建立 Polls 資料表

確保 MySQL 資料庫內有 polls 資料表,存放投票問題。

CREATE TABLE polls (
    id INT AUTO_INCREMENT PRIMARY KEY,
    question VARCHAR(255) NOT NULL
);

5. 部署到 Kubernetes

首先,透過 kubectl apply -f 指令部署 MySQL 和 Flask 應用:

kubectl apply -f mysql-deployment.yaml
kubectl apply -f flask-deployment.yaml

這將會在 Kubernetes 集群中運行 MySQL 資料庫與 Flask Web 應用,並且可以透過服務對外提供 API 來進行民調管理。

1. mysql-deployment.yaml

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

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql

這段定義了一個名為 mysqlDeploymentDeployment 是 Kubernetes 用來管理應用的控制器,確保有指定數量的容器(在這裡是 MySQL 容器)在集群中運行。

spec:
  replicas: 1

replicas 定義了應用容器的副本數。這裡設置為 1,意味著只運行一個 MySQL 容器。

env:
  - name: MYSQL_ROOT_PASSWORD
    value: rootpassword
  - name: MYSQL_DATABASE
    value: poll_db

這裡設置了 MySQL 容器所需的環境變數:

  • MYSQL_ROOT_PASSWORD: MySQL 的 root 用戶密碼。
  • MYSQL_DATABASE: 初始化一個名為 poll_db 的資料庫,用來存放民調數據。
volumeMounts:
  - name: mysql-persistent-storage
    mountPath: /var/lib/mysql

volumeMounts 將資料庫的數據目錄 /var/lib/mysql 綁定到 mysql-persistent-storage。這樣做是為了持久化資料,確保重啟容器時資料不會丟失。

PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim

這部分定義了一個 PersistentVolumeClaim (PVC),用來請求集群中的持久性存儲。MySQL 容器會把資料存放到這個 PVC 中,並確保資料不會因為容器重啟或刪除而丟失。

Service

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql

Service 對外暴露了 MySQL 應用的端口(3306)。這允許其他應用透過這個服務來訪問 MySQL 資料庫。selector 用來匹配這個 Service 應該連接到的 Deployment(在這裡是 mysql 部署)。


2. Flask Web 應用程式

這部分是 Flask 應用,它提供了 API 來管理民調資料。

app.py

from flask import Flask, request, jsonify
import mysql.connector

app = Flask(__name__)

這段程式碼初始化了 Flask 應用和 MySQL 連接模組。Flask 是一個輕量級的 Web 應用框架,mysql.connector 用來連接 MySQL 資料庫。

連接資料庫

def get_db_connection():
    connection = mysql.connector.connect(
        host='mysql',
        user='root',
        password='rootpassword',
        database='poll_db'
    )
    return connection

這是用來建立 MySQL 連接的函數。它使用了 Kubernetes 中部署的 MySQL 資料庫:

  • host='mysql': 這裡的 mysql 是 Kubernetes 中 MySQL Service 的名稱,通過內部 DNS 可以連接到資料庫。
  • user, password, database: 這些用來連接資料庫的認證信息。

查詢民調數據

@app.route('/polls', methods=['GET'])
def get_polls():
    conn = get_db_connection()
    cursor = conn.cursor(dictionary=True)
    cursor.execute('SELECT * FROM polls')
    polls = cursor.fetchall()
    cursor.close()
    conn.close()
    return jsonify(polls)

這個 API 用於查詢所有的民調資料。流程如下:

  1. get_db_connection() 函數建立與 MySQL 的連接。
  2. cursor.execute('SELECT * FROM polls') 查詢 polls 資料表中的所有資料。
  3. cursor.fetchall() 取得查詢結果,並將其轉換成 JSON 格式返回給客戶端。

創建新民調

@app.route('/polls', methods=['POST'])
def create_poll():
    data = request.json
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute('INSERT INTO polls (question) VALUES (%s)', (data['question'],))
    conn.commit()
    cursor.close()
    conn.close()
    return '', 201

這個 API 用於創建新民調。當客戶端發送一個包含問題的 POST 請求時,程式會執行以下步驟:

  1. 從請求中提取 JSON 資料 data['question']
  2. 插入到 polls 資料表中。
  3. 返回 HTTP 狀態碼 201,表示創建成功。

3. Dockerfile

這是用來打包 Flask 應用的 Docker 文件。

Dockerfile
# 使用 Python 基礎鏡像
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 安裝所需的 Python 套件
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

# 複製應用程式檔案
COPY . .

# 開放應用運行端口
EXPOSE 5000

# 運行 Flask 應用
CMD ["python", "app.py"]
  1. 基礎鏡像:使用了 Python 3.9 slim 版本作為基礎。
  2. 安裝依賴COPY requirements.txtRUN pip install 會安裝 Flask 以及其他所需的 Python 套件。
  3. 運行應用CMD ["python", "app.py"] 指示容器啟動時運行 Flask 應用。

4. Flask Kubernetes 部署

flask-deployment.yaml

這個文件負責部署 Flask 應用並將它與 MySQL 資料庫連接。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask-app
  template:
    metadata:
      labels:
        app: flask-app
    spec:
      containers:
      - name: flask-app
        image: flask-app:latest
        ports:
        - containerPort: 5000
        env:
        - name: MYSQL_HOST
          value: mysql
        - name: MYSQL_USER
          value: root
        - name: MYSQL_PASSWORD
          value: rootpassword
        - name: MYSQL_DB
          value: poll_db

這段定義了 Flask 應用的 Kubernetes 部署,並設定了環境變數來連接 MySQL 資料庫。

  • MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB: 用來將 Flask 應用與 MySQL 資料庫連接。

Service

apiVersion: v1
kind: Service
metadata:
  name: flask-app
spec:
  ports:
    - port: 5000
  selector:
    app: flask-app

這段暴露了 Flask 應用的端口 5000,允許外部流量進入應用。


總結

這個系統結合了 MySQL 資料庫和 Flask Web 應用,並透過 Kubernetes 進行管理。流程如下:

  1. MySQL 資料庫:負責存儲民調數據。
  2. Flask Web 應用:提供 API 來進行民調管理,包括查詢和創建民調。
  3. Kubernetes 部署:使用 Deployment 管理應用的副本,並透過 Service 對外提供訪問接口。

上一篇
day 16 k8s情緒分析資料庫管理系統
下一篇
day 18 K8s 考古題資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言