iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Kubernetes

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

day 16 k8s情緒分析資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第十六天我們可以寫一個k8s情緒分析資料庫管理系統,以下是我的程式碼

  1. 資料收集層:例如使用 API 或資料流來獲取用戶的情緒數據(如社交媒體帖子、文本等)。
  2. 分析層:使用情緒分析模型(例如 LSTM 或 NLP 模型)來對資料進行分析。
  3. 資料庫層:存儲處理過的數據,如分析結果、歷史情緒記錄等。
  4. API 層:與前端或其他系統交互,提供查詢和管理情緒分析結果的介面。

這個系統可以使用 Kubernetes 來自動化部署、擴展和管理整個情緒分析應用。Kubernetes 的資源(如 Pod、Deployment、Service 和 PersistentVolume)將幫助系統實現高可用性和容錯能力。

以下是如何設計和部署情緒分析資料庫管理系統的簡要步驟:

1. 準備 Kubernetes 叢集

如果我已經有一個 Kubernetes 叢集,你可以直接在上面部署應用。如果沒有,可以使用 Minikube 本地測試,或在雲服務(如 GKE、EKS、AKS)上部署 Kubernetes 叢集。

# 安裝 Minikube(用於本地測試)
minikube start

2. 建立情緒分析應用容器

將你的情緒分析模型(如 LSTM)打包到 Docker 容器中。這可以包含預處理、模型推論和資料庫管理的邏輯。

Dockerfile 範例:

dockerfile
FROM python:3.9-slim

# 安裝必要的套件
RUN pip install flask pandas scikit-learn tensorflow

# 複製你的應用程式
COPY app/ /app

# 設定工作目錄
WORKDIR /app

# 執行應用程式
CMD ["python", "app.py"]

3. 部署資料庫(例如 MySQL 或 PostgreSQL)

我可以在 Kubernetes 中部署資料庫來存儲情緒分析結果。這裡使用 MySQL 作為示範:

MySQL 部署檔案 (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:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root_password"
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

這將在 Kubernetes 中創建一個 MySQL 資料庫,你可以透過 mysql-service 來進行連接。

4. 部署情緒分析應用

接下來,將情緒分析應用部署到 Kubernetes 中,並連接到 MySQL 資料庫。

情緒分析應用部署檔案 (app-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: emotion-analysis-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: emotion-analysis
  template:
    metadata:
      labels:
        app: emotion-analysis
    spec:
      containers:
      - name: emotion-analysis
        image: your-docker-image:latest
        ports:
        - containerPort: 5000
        env:
        - name: MYSQL_HOST
          value: "mysql-service"
        - name: MYSQL_USER
          value: "root"
        - name: MYSQL_PASSWORD
          value: "root_password"
---
apiVersion: v1
kind: Service
metadata:
  name: emotion-analysis-service
spec:
  selector:
    app: emotion-analysis
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000

這會將你的情緒分析應用暴露在 Kubernetes 內的 emotion-analysis-service 服務上。

5. 建立 Persistent Volume 來存儲數據

為了確保資料庫的資料在 Pod 重啟或應用升級時不會丟失,我可以使用 Kubernetes 的 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)。

PersistentVolumeClaim 配置範例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

在 MySQL 的 mysql-deployment.yaml 中,將 PVC 綁定到 MySQL 容器的資料存儲目錄:

      volumeMounts:
      - mountPath: /var/lib/mysql
        name: mysql-persistent-storage
    volumes:
    - name: mysql-persistent-storage
      persistentVolumeClaim:
        claimName: mysql-pvc

6. 整合與自動擴展

最後,為了實現高可用性和自動擴展,我可以使用 Horizontal Pod Autoscaler 來根據應用負載自動擴展 Pod 數量。

# 為應用設定自動擴展
kubectl autoscale deployment emotion-analysis-app --cpu-percent=50 --min=1 --max=10

1. MySQL 部署檔案 (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:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root_password"
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

解釋:

  • apiVersion: apps/v1kind: Deployment: 這是 Kubernetes 中用來定義如何部署一個應用的 API 版本和類型。Deployment 用於管理應用的部署,包括自動化升級、擴展和重啟等。

  • metadata: 定義了部署的元數據。這裡,name 是部署的名稱(mysql)。

  • spec: 描述了部署的具體配置。replicas: 1 表示要部署 1 個副本。selector 則用來選擇符合標籤 app: mysql 的 Pod。

  • containers: 定義了要運行的容器。這裡使用了官方的 MySQL 容器映像 mysql:5.7,並設置了環境變數 MYSQL_ROOT_PASSWORD,這是 MySQL 的 root 用戶密碼。

  • ports: 將容器的 MySQL 服務暴露在 3306 端口,這是 MySQL 的默認端口。

  • Service 部分: Service 用來將內部或外部的流量路由到運行中的 MySQL 容器,通過 mysql-service 名稱來訪問 MySQL,且暴露的端口是 3306。

2. 情緒分析應用部署檔案 (app-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: emotion-analysis-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: emotion-analysis
  template:
    metadata:
      labels:
        app: emotion-analysis
    spec:
      containers:
      - name: emotion-analysis
        image: your-docker-image:latest
        ports:
        - containerPort: 5000
        env:
        - name: MYSQL_HOST
          value: "mysql-service"
        - name: MYSQL_USER
          value: "root"
        - name: MYSQL_PASSWORD
          value: "root_password"
---
apiVersion: v1
kind: Service
metadata:
  name: emotion-analysis-service
spec:
  selector:
    app: emotion-analysis
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000

解釋:

  • apiVersionkind: 與 MySQL 部署一樣,這裡使用 Deployment 來定義應用程式的部署邏輯。這個檔案用於部署情緒分析應用。

  • metadata: name 是這個情緒分析應用的部署名稱,稱為 emotion-analysis-app

  • replicas: 2: 這裡設置了兩個應用的副本(Pod)。這樣做的目的是為了確保高可用性和負載均衡。

  • containers: containers 塊定義了這個部署中的容器。使用的是 your-docker-image:latest,你需要替換成你的情緒分析應用的 Docker 映像名稱。這個容器會在 5000 端口上運行 Flask 或其他 Web 伺服器。

  • 環境變數 (env):

    • MYSQL_HOST: 設置 MySQL 的主機為 mysql-service,這是我們在 MySQL 部署中設置的 Service 名稱。
    • MYSQL_USERMYSQL_PASSWORD: 設置了訪問 MySQL 的用戶和密碼。
  • Service 部分: 與 MySQL 部署相似,這裡也定義了一個 Service 來暴露應用程式的 5000 端口(預設 Flask 應用的端口),用於內部或外部的訪問。

3. Persistent Volume(PV)和 Persistent Volume Claim(PVC)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

解釋:

  • PersistentVolume (PV): PV 是 Kubernetes 中用來定義持久化存儲的資源。在這個例子中,PersistentVolume 允許 MySQL 服務的資料在系統重啟或應用升級時保留下來。

    • capacity: 1Gi: 定義這個存儲卷的大小為 1GB。
    • hostPath: "/mnt/data": 這是本地機器上用於存儲資料的路徑(僅用於本地或開發環境)。
  • PersistentVolumeClaim (PVC): PVC 是應用對持久性存儲的請求。MySQL 容器會通過 PVC 將數據存儲到 PV 定義的路徑中。

    • resources: 這裡請求了 1GB 的存儲空間。

4. 自動擴展

# 為應用設定自動擴展
kubectl autoscale deployment emotion-analysis-app --cpu-percent=50 --min=1 --max=10

解釋:

  • 這條命令使用 Kubernetes 的 Horizontal Pod Autoscaler (HPA) 來自動擴展情緒分析應用的 Pod 數量。當 CPU 使用率達到 50% 以上時,會自動擴展 Pod 的數量,最多可擴展到 10 個 Pod。這確保了應用在負載增加時能夠提供足夠的處理能力。

系統架構總結:

  • MySQL 部署:用於存儲情緒分析結果的資料庫,具有一個 PersistentVolume 來確保資料的持久性。
  • 情緒分析應用:一個處理情緒分析的應用,接收文本輸入、執行情緒分析並將結果存儲到 MySQL 資料庫中。該應用程式可以擴展並具有自動擴展能力。
  • Kubernetes 資源:使用 Deployment 來確保應用的可用性,並通過 PV 和 PVC 確保資料持久化,最後用 HPA 進行自動擴展。

這個架構可以根據具體需求進行擴展,例如添加 Redis 進行緩存,或使用其他資料庫服務(如 PostgreSQL)。


上一篇
day 12 K8s租車公司資料庫管理系統
下一篇
day 17 k8s 民調資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言