今天是二十三天我們可以寫一個k8s音樂庫資料庫管理系統,以下是我的程式碼
在 k8s
上運行資料庫,你需要建立相應的 Deployment
和 Service
,這樣服務可以持久運行並與應用程序通訊。
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
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: "rootpassword" # 設置root密碼
- name: MYSQL_DATABASE
value: "musicdb" # 設置資料庫名稱
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
# mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data" # 存放資料庫數據的本地路徑
---
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
我可以選擇用 Node.js 或 Django 等框架來開發一個簡單的前端應用,與資料庫交互並管理音樂資料庫。
首先,你需要在 Node.js 應用中配置 MySQL 連接:
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'mysql', // 這裡的 host 名稱應該與 mysql-service.yaml 中的服務名稱一致
user: 'root',
password: 'rootpassword',
database: 'musicdb'
});
connection.connect((err) => {
if (err) throw err;
console.log('Connected to MySQL!');
});
然後,將這個應用包裝為 Docker 容器,並推送到 Docker Registry。
# node-app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: music-app
spec:
replicas: 1
selector:
matchLabels:
app: music-app
template:
metadata:
labels:
app: music-app
spec:
containers:
- name: music-app
image: <your-docker-image> # 你的 Node.js 應用容器鏡像
ports:
- containerPort: 3000
---
# node-app-service.yaml
apiVersion: v1
kind: Service
metadata:
name: music-app-service
spec:
ports:
- port: 3000
selector:
app: music-app
type: LoadBalancer
將這些 YAML 檔案應用到 Kubernetes 集群中:
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml
kubectl apply -f node-app-deployment.yaml
kubectl apply -f node-app-service.yaml
確保 Pod、Service 正常運行:
kubectl get pods
kubectl get services
此時,我應該能夠通過 LoadBalancer 或 NodePort 訪問你的音樂庫管理應用。
mysql-deployment.yaml
這個檔案定義了如何在 Kubernetes 上部署 MySQL 容器,並將它與儲存空間(PersistentVolume)連接。
apiVersion: apps/v1 # 定義此 YAML 檔案所使用的 API 版本
kind: Deployment # 此資源的類型是 Deployment,用於管理應用的部署
metadata:
name: mysql # Deployment 的名稱為 'mysql'
spec:
selector:
matchLabels:
app: mysql # 標籤選擇器,用於標識該 Deployment 管理的 Pod
replicas: 1 # 部署的 Pod 副本數,這裡只需一個 MySQL 實例
template:
metadata:
labels:
app: mysql # MySQL Pod 的標籤,確保與 selector 匹配
spec:
containers:
- name: mysql # 容器名稱
image: mysql:8.0 # 使用官方的 MySQL 8.0 容器映像
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpassword" # 設定 MySQL root 帳號的密碼
- name: MYSQL_DATABASE
value: "musicdb" # 自動建立一個名為 'musicdb' 的資料庫
ports:
- containerPort: 3306 # MySQL 的服務埠號是 3306
volumeMounts:
- name: mysql-persistent-storage # 將一個卷掛載到容器內,保證數據持久化
mountPath: /var/lib/mysql # MySQL 的數據存儲路徑
volumes:
- name: mysql-persistent-storage # 定義一個持久存儲卷
persistentVolumeClaim:
claimName: mysql-pv-claim # 持久卷的名稱,會和 PersistentVolumeClaim 關聯
解釋:
volumeMounts
和 volumes
的部分確保了 MySQL 的數據能夠儲存在永久卷(PersistentVolume)中,即使 Pod 重新啟動,數據也不會丟失。mysql-service.yaml
這個檔案定義了 MySQL 的服務,讓其他應用可以通過該服務與 MySQL 通訊。
apiVersion: v1
kind: Service # 資源類型是 Service,用於讓其他應用程式訪問 MySQL
metadata:
name: mysql # 服務名稱
spec:
ports:
- port: 3306 # 開放 MySQL 的服務埠 3306
selector:
app: mysql # 此服務將指向所有有 'app: mysql' 標籤的 Pod
clusterIP: None # 使用 ClusterIP 設置為 None,這將創建一個 Headless 服務
解釋:
Service
會將流量指向標籤為 app: mysql
的 Pod。clusterIP: None
創建一個 Headless 服務,讓應用程序直接與 Pod 連接,適合 StatefulSet 或需要 Pod 直接通訊的情境。mysql-pv.yaml
和 mysql-pvc.yaml
這兩個檔案分別定義了持久卷(PersistentVolume, PV)和持久卷申請(PersistentVolumeClaim, PVC),用來為 MySQL 儲存數據。
# mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume # 定義一個持久卷
metadata:
name: mysql-pv # 持久卷的名稱
spec:
capacity:
storage: 10Gi # 卷大小為 10GiB
accessModes:
- ReadWriteOnce # 允許一個節點讀寫該卷
hostPath:
path: "/mnt/data" # 這個例子使用了本地路徑來存儲數據
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim # 定義持久卷的申請
metadata:
name: mysql-pv-claim # 持久卷申請的名稱
spec:
accessModes:
- ReadWriteOnce # 允許一個節點讀寫
resources:
requests:
storage: 10Gi # 申請大小為 10GiB 的持久卷
解釋:
PersistentVolume
是實際儲存空間的定義,並且設置了大小和本地存儲路徑。PersistentVolumeClaim
是一個應用可以使用的請求,它請求特定大小和模式的持久存儲。這樣,MySQL 的數據可以保持持久化,無論容器重啟或崩潰。node-app-deployment.yaml
這個檔案用於部署一個 Node.js 應用,該應用會與 MySQL 通訊來管理音樂庫數據。
apiVersion: apps/v1
kind: Deployment
metadata:
name: music-app # 部署名稱為 music-app
spec:
replicas: 1 # 啟動一個副本
selector:
matchLabels:
app: music-app # 用於選擇標籤為 'app: music-app' 的 Pod
template:
metadata:
labels:
app: music-app # Pod 的標籤
spec:
containers:
- name: music-app # 容器名稱
image: <your-docker-image> # Node.js 應用的 Docker 容器映像
ports:
- containerPort: 3000 # Node.js 應用服務的埠
解釋:
3000
對外提供服務。該映像可以是你自己製作的 Docker 映像。node-app-service.yaml
這個檔案定義了 Node.js 應用的 Service,讓外界能夠通過此服務訪問應用。
apiVersion: v1
kind: Service
metadata:
name: music-app-service # 服務名稱
spec:
ports:
- port: 3000 # 將服務開放的埠號為 3000,對應應用的端口
selector:
app: music-app # 將流量路由到標籤為 'app: music-app' 的 Pod
type: LoadBalancer # 定義 Service 類型為 LoadBalancer,以便集群外部的用戶能訪問
解釋:
Service
將流量指向 Node.js 應用並通過 LoadBalancer
暴露出來。這樣外部用戶可以通過公網訪問這個服務。LoadBalancer
類型可能不適用,可以改用 NodePort
。這些程式碼段實現了在 Kubernetes 上部署一個完整的音樂庫管理系統,包括: