iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Kubernetes

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

day 28 k8s 電力分配資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第二十八天我們可以寫一個k8s電力分配資料庫管理系統,以下是我的程式碼

系統設計

  1. 資料庫選擇:可以使用 MySQL、PostgreSQL 或任何適合的關聯式資料庫來儲存電力分配的相關資料。
  2. 前端應用:使用 Python 或 Node.js 等語言搭建一個 REST API 來進行電力分配的管理,並展示資料庫中儲存的內容。
  3. Kubernetes 部署:使用 Kubernetes 來管理資料庫、應用程式的容器化以及自動擴展、監控等功能。

主要組成部分

  1. 資料庫:使用 StatefulSet 來部署資料庫以保證持久性。
  2. 應用後端:使用 Deployment 管理應用服務。
  3. 持久存儲 (Persistent Storage):為資料庫提供穩定的持久存儲。
  4. 服務 (Service):確保應用程式能夠訪問資料庫,並使用 k8s 服務將應用公開給外部網路。
  5. 水平自動擴展 (Horizontal Pod Autoscaler):依據 CPU 或記憶體使用率動態調整應用程式的 Pod 數量。

Kubernetes YAML 設定範例

1. 資料庫部署 (MySQL)

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
        ports:
        - containerPort: 3306
          name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root_password"
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

2. 應用服務 (REST API)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: power-management-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: power-management-api
  template:
    metadata:
      labels:
        app: power-management-api
    spec:
      containers:
      - name: api
        image: your-docker-image:latest
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          value: "mysql"
        - name: DB_PASSWORD
          value: "root_password"

3. 應用服務的外部公開 (Service)

apiVersion: v1
kind: Service
metadata:
  name: power-management-service
spec:
  selector:
    app: power-management-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

4. 水平自動擴展 (Horizontal Pod Autoscaler)

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: power-management-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: power-management-api
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

1. 資料庫部署 (MySQL) - StatefulSet

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
        ports:
        - containerPort: 3306
          name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root_password"
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

解釋:

  1. apiVersion: apps/v1:指定應用程式的 API 版本。apps/v1 是 StatefulSet 這種控制器所使用的 API 版本。
  2. kind: StatefulSet:StatefulSet 是 Kubernetes 的控制器,適合管理需要持久化狀態的應用程式(例如資料庫)。它會確保每個 Pod 都有固定的網路 ID 和持久化存儲。
  3. metadata: 定義資源的元數據,例如 name: mysql 為這個 StatefulSet 資源命名為 mysql
  4. replicas: 1:設置有 1 個副本 Pod 運行這個資料庫。因為是資料庫,通常使用單一副本避免數據同步的複雜性。
  5. template: 定義每個 Pod 的配置內容:
    • containers:
      • name: mysql:定義容器的名稱。
      • image: mysql:5.7:告訴 Kubernetes 使用 MySQL 5.7 版本的映像檔來創建容器。
      • ports: 開放 3306 端口,這是 MySQL 的默認連接端口。
      • env: 設置環境變量,這裡設置 MySQL 的 root 密碼為 "root_password"
      • volumeMounts: 定義容器內 MySQL 資料儲存的位置,/var/lib/mysql 是 MySQL 的資料庫目錄,將其與 PersistentVolumeClaim (PVC) 連接,保證儲存持久化。
  6. volumeClaimTemplates: 創建持久化存儲卷(PVC),確保 MySQL 的數據即使 Pod 重新啟動也不會丟失。
    • storage: 1Gi:請求 1 GB 的存儲空間。

2. 應用服務 (REST API) - Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: power-management-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: power-management-api
  template:
    metadata:
      labels:
        app: power-management-api
    spec:
      containers:
      - name: api
        image: your-docker-image:latest
        ports:
        - containerPort: 8080
        env:
        - name: DB_HOST
          value: "mysql"
        - name: DB_PASSWORD
          value: "root_password"

解釋:

  1. apiVersion: apps/v1:使用 Kubernetes 的 Deployment 版本。
  2. kind: Deployment:Deployment 是一種 Kubernetes 控制器,用於管理無狀態應用程式,它能夠負責應用的擴展和滾動更新。
  3. metadata:資源的基本描述,包括名稱 power-management-api
  4. replicas: 3:定義啟動 3 個 API 應用服務的副本來處理流量負載,這是水平擴展的基礎。
  5. selector: 用來指定哪些 Pod 屬於這個 Deployment,這裡匹配 app: power-management-api 的標籤。
  6. template: 定義這個 Deployment 中的 Pod 內容:
    • containers:
      • name: api:容器名稱為 api
      • image: your-docker-image:latest:這是你的應用程式 Docker 映像檔,該映像檔應包含 REST API 服務。
      • ports: 開啟 8080 端口,供應用程式使用。
      • env: 環境變量,用於告訴應用程式連接到的資料庫位址 (DB_HOST: mysql) 和 root 密碼 (DB_PASSWORD: root_password)。

3. 應用服務的外部公開 (Service)

apiVersion: v1
kind: Service
metadata:
  name: power-management-service
spec:
  selector:
    app: power-management-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

解釋:

  1. apiVersion: v1:這是 Kubernetes Service 使用的 API 版本。
  2. kind: Service:Kubernetes 中的 Service 用於將內部 Pod 的網絡流量暴露出來,並且會自動負載平衡多個 Pod。
  3. metadata:為 Service 命名為 power-management-service
  4. selector:根據 app: power-management-api 的標籤找到對應的 Pod。
  5. ports
    • port: 80:Service 暴露的端口為 80(這是外部用戶訪問的端口)。
    • targetPort: 8080:將流量從 80 端口轉發到 Pod 的 8080 端口(應用程式運行的端口)。
  6. type: LoadBalancer:這會告訴 Kubernetes 建立一個負載均衡器來暴露這個服務給外部網路(在雲端服務商上會建立外部 IP 地址)。

4. 水平自動擴展 (Horizontal Pod Autoscaler)

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: power-management-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: power-management-api
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

解釋:

  1. apiVersion: autoscaling/v2beta2:使用 Kubernetes 自動擴展 API 的版本。
  2. kind: HorizontalPodAutoscaler:這是一種 Kubernetes 控制器,用來自動調整應用程式的 Pod 副本數量,根據 Pod 的 CPU 或記憶體使用率來擴展或縮減 Pod。
  3. metadata:為這個 HPA 命名為 power-management-hpa
  4. scaleTargetRef
    • apiVersionkind:指定這個自動擴展目標是一個 Deployment 資源。
    • name: power-management-api:目標為 power-management-api 這個 Deployment。
  5. minReplicas: 1:最小 Pod 副本數為 1。
  6. maxReplicas: 10:最大 Pod 副本數為 10。
  7. metrics
    • type: Resource:這是基於資源的自動擴展(CPU)。
    • resource.name: cpu:擴展的根據是 CPU 使用率。
    • target.averageUtilization: 80:當 CPU 使用率超過 80% 時,自動擴展會觸發。

總結:

這些 Kubernetes 部署文件涵蓋了建立一個包含 MySQL 資料庫和應用服務的基本架構。使用 StatefulSet 來管理持久化的 MySQL,Deployment 來管理 API 應用,並通過 Service 將應用公開給外部網絡。最後,Horizontal Pod Autoscaler 確保應用在高流量下能夠自動擴展,保障系統的彈性與穩定性。


上一篇
day 27 k8s海關資料庫管理系統
下一篇
day 29 K8s串接line bot分析颱風影響資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會

尚未有邦友留言

立即登入留言