今天是第十七天我們可以寫一個k8s民調資料庫管理系統,以下是我的程式碼
設定資料庫容器 (以 MySQL 為例):
建立 Web 應用 (以 Flask 為例):
Kubernetes 部署配置 (YAML 檔案):
在 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
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
# 使用 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
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
確保 MySQL 資料庫內有 polls
資料表,存放投票問題。
CREATE TABLE polls (
id INT AUTO_INCREMENT PRIMARY KEY,
question VARCHAR(255) NOT NULL
);
首先,透過 kubectl apply -f
指令部署 MySQL 和 Flask 應用:
kubectl apply -f mysql-deployment.yaml
kubectl apply -f flask-deployment.yaml
這將會在 Kubernetes 集群中運行 MySQL 資料庫與 Flask Web 應用,並且可以透過服務對外提供 API 來進行民調管理。
mysql-deployment.yaml
這個 YAML 文件定義了 MySQL 資料庫容器在 Kubernetes 中的部署。
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
這段定義了一個名為 mysql
的 Deployment。Deployment
是 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
部署)。
這部分是 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 用於查詢所有的民調資料。流程如下:
get_db_connection()
函數建立與 MySQL 的連接。cursor.execute('SELECT * FROM polls')
查詢 polls
資料表中的所有資料。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
請求時,程式會執行以下步驟:
data['question']
。polls
資料表中。201
,表示創建成功。這是用來打包 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"]
COPY requirements.txt
和 RUN pip install
會安裝 Flask 以及其他所需的 Python 套件。CMD ["python", "app.py"]
指示容器啟動時運行 Flask 應用。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 進行管理。流程如下: