iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Kubernetes

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

day 23 k8s 音樂庫資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是二十三天我們可以寫一個k8s音樂庫資料庫管理系統,以下是我的程式碼

1. 准備環境

  • Kubernetes 集群(我可以使用本地的 Minikube 或雲端的 GKE/EKS/AKS)
  • kubectl 配置並連接到集群
  • Docker 安裝來打包應用程式
  • MySQL 或 PostgreSQL 資料庫來存放音樂元數據

2. 撰寫資料庫的 Deployment 和 Service

k8s 上運行資料庫,你需要建立相應的 DeploymentService,這樣服務可以持久運行並與應用程序通訊。

MySQL 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

PersistentVolume 與 PersistentVolumeClaim:

# 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

3. 撰寫前端應用 Deployment 和 Service

我可以選擇用 Node.js 或 Django 等框架來開發一個簡單的前端應用,與資料庫交互並管理音樂資料庫。

Node.js Application 示例(假設它是與 MySQL 連接的後端服務):

首先,你需要在 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.js Deployment 和 Service:

# 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

4. 部署到 Kubernetes

將這些 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

5. 檢查應用狀態

確保 Pod、Service 正常運行:

kubectl get pods
kubectl get services

此時,我應該能夠通過 LoadBalancer 或 NodePort 訪問你的音樂庫管理應用。

1. 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 關聯

解釋:

  • 這段程式碼部署了一個 MySQL 容器,並指定了 MySQL 的 root 密碼和要創建的資料庫名稱。
  • volumeMountsvolumes 的部分確保了 MySQL 的數據能夠儲存在永久卷(PersistentVolume)中,即使 Pod 重新啟動,數據也不會丟失。

2. 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 直接通訊的情境。

3. mysql-pv.yamlmysql-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 的數據可以保持持久化,無論容器重啟或崩潰。

4. 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 應用服務的埠

解釋:

  • 這段程式碼部署了一個 Node.js 應用,它會通過 port 3000 對外提供服務。該映像可以是你自己製作的 Docker 映像。

5. 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 暴露出來。這樣外部用戶可以通過公網訪問這個服務。
  • 如果在本地使用 Minikube 或 Kind 集群,LoadBalancer 類型可能不適用,可以改用 NodePort

總結

這些程式碼段實現了在 Kubernetes 上部署一個完整的音樂庫管理系統,包括:

  • MySQL 作為資料庫來存放音樂資料。
  • Node.js 應用 提供音樂資料庫的管理介面。
  • PersistentVolume 確保資料庫的數據能夠持久化。
  • Service 創建內部和外部的訪問路徑,允許應用程式和外界與服務通訊。

上一篇
day 22 k8s 選課資料庫管理系統
下一篇
day 24 k8s奧運資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言