今天是第十天我們可以寫一個k8s戶口資料庫管理系統,以下是我的程式碼
在 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
後端 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
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
將後端 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
使用 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;
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
將前端和後端的服務通過 Kubernetes 的 Ingress 或 LoadBalancer 曝露給外部。這樣使用者可以透過瀏覽器訪問該應用。
當然,我將一步步解釋這些程式碼的各個部分,讓你了解它們的功能以及如何相互協作來實現 Kubernetes 上的戶口資料庫管理系統。
mysql-deployment.yaml
)這個 YAML 文件定義了 MySQL 資料庫的 Kubernetes 部署。
這個配置會啟動 MySQL 資料庫,並透過卷將資料存放在集群中的持久存儲卷中。
app.py
)後端 API 是使用 Python 的 Flask 框架來開發,並與 MySQL 資料庫進行交互。
get_db_connection()
:這是用來連接 MySQL 資料庫的函數,使用 pymysql 庫來處理資料庫操作。
host='mysql-service'
指的是 Kubernetes 中的 MySQL 服務,這是 MySQL 的主機名。user='root'
和 password='rootpassword'
則是用於連接資料庫的憑證。/households
路由 (GET 請求):
households
表)。cursor.execute('SELECT * FROM households')
查詢資料庫中的所有資料。/household
路由 (POST 請求):
households
表。cursor.execute('INSERT INTO households (name, address) VALUES (%s, %s)', (new_household['name'], new_household['address']))
將戶口資料寫入資料庫。這個 API 是前端應用的主要數據源,處理戶口資料的增刪查改操作。
這個 Dockerfile 用來打包後端 API 的應用程式,並確保它可以運行在容器中。
requirements.txt
複製到 Docker 映像中,然後執行 pip install
安裝所需的 Python 套件(如 Flask 和 pymysql)。這個 Dockerfile 用來生成一個可以部署在 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 應用運行的端口,服務會將流量轉發到這個端口。這個程式碼用 React 框架來建立一個簡單的前端應用,展示戶口資料。
useEffect()
:當應用加載時,這個鉤子函數會發出一個 GET 請求來獲取所有戶口資料。
fetch('/api/households')
:這裡假設你的後端 API 被設置為 /api/
路徑。它會向這個路徑發出請求,並將回傳的 JSON 資料轉換為前端應用的狀態。households.map()
:遍歷戶口資料,並將它們顯示為列表。
這個 React 應用負責與後端 API 進行交互,讓用戶能夠在網頁上查看戶口資料。
frontend-deployment.yaml
)這個 YAML 文件用來部署 React 應用。
Deployment:定義了如何部署前端應用,這與後端 API 的部署相似。
replicas: 1
:設定一個副本來運行前端應用。image: your-docker-repo/frontend:latest
:這裡需要替換為你自己生成的前端 Docker 映像。Service:這裡定義了如何暴露前端應用,使其能夠被外部訪問。
type: ClusterIP
:這意味著服務在集群內部暴露,讓其他應用可以訪問前端服務。