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
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言