iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Kubernetes

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

day 21 K8s 微服務客戶喜好資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第二十一天我們可以寫一個K8s微服務資料庫管理系統,這對於我來說是一個新概念,我會以先介紹概念為主,在寫一些範例程式
Kubernetes (K8s) 是一個開源的平台,專門用來自動化部署、擴展和管理容器化應用程式。微服務架構是一種設計方法,將應用程式分解為許多小的、獨立運行的服務,每個服務執行一項特定任務。Kubernetes 與微服務的結合非常普遍,因為 Kubernetes 提供了管理這些獨立服務的強大工具。

什麼是微服務架構?

微服務架構是將一個大型的應用程式拆分成多個小的、單一功能的服務,每個微服務獨立開發、部署和擴展。這些服務通過 API 進行通信(通常是 HTTP REST 或 gRPC)。微服務有以下幾個特點:

  1. 獨立部署:每個微服務可以獨立更新、擴展,不會影響其他服務。
  2. 技術異構性:每個微服務可以使用不同的編程語言、資料庫或其他技術棧,根據需要選擇最佳技術。
  3. 容錯性:單一服務故障不會導致整個應用崩潰。
  4. 按需擴展:根據服務的需求,可以有選擇性地擴展某些微服務,而不是整個應用程式。

Kubernetes 在微服務架構中的角色

Kubernetes 是用來管理容器化應用的理想工具,特別是微服務架構。它提供了一系列功能來支持微服務的開發和運行:

  1. 容器管理:Kubernetes 主要用於管理 Docker 等容器技術。微服務通常使用容器來確保服務可以在任何環境中一致地運行。

  2. 自動化部署:K8s 支援自動部署微服務應用,並能夠通過定義好的配置文件來輕鬆部署、更新和回滾應用程式。

  3. 服務發現和負載均衡:每個微服務都有自己的 IP 地址和名稱,Kubernetes 提供內建的服務發現和負載均衡功能,通過 Service 資源自動路由流量到健康的實例。

  4. 自動擴展:K8s 可以根據服務的負載情況自動擴展或縮減容器的數量,確保應用程式始終能夠根據流量需求進行調整。

  5. 故障自動修復:如果某個微服務實例發生故障,Kubernetes 會自動重新啟動或替換故障實例,確保應用的高可用性。

  6. 持續交付:透過 Kubernetes 的滾動更新(Rolling Update)機制,可以無縫地進行微服務更新,避免中斷服務。

  7. 配置管理和機密管理:Kubernetes 提供了 ConfigMapsSecrets,用來分別管理微服務的配置信息和敏感資料(例如 API 密鑰、憑證)。

  8. 監控與日誌管理:K8s 允許集成各種監控工具(如 Prometheus、Grafana)來監控微服務的健康狀態,並能夠集中收集和管理各個微服務的日誌。

Kubernetes 與微服務架構的運作方式

在 Kubernetes 中,微服務通常以 Pod 的形式運行。Pod 是 K8s 中最小的運行單元,裡面包含一個或多個容器。每個微服務可以部署到一個或多個 Pod 中。透過 Deployment 資源來管理 Pod 的擴展、升級等操作。K8s 會自動處理 Pod 間的通信,並通過 Ingress 資源暴露服務給外部用戶。

使用 Kubernetes 部署微服務的優點

  1. 高可用性:K8s 會自動處理應用的容錯和修復。
  2. 靈活的擴展能力:可以根據流量需求靈活地擴展微服務的容器。
  3. 易於部署和更新:透過定義好的 YAML 配置文件,開發團隊可以快速地將服務部署到 Kubernetes 集群中。
  4. 集中管理和監控:所有微服務的狀態、資源使用情況都可以通過 Kubernetes 的控制面板和第三方工具集中管理和監控。

由於理解客戶的喜好能夠提升雙方的合作意願,因此公司如果有這項服務,我認為使用k8s微服務客戶喜好資料庫管理系統是相當重要的

1. 微服務架構規劃

此系統包含以下微服務:

  • API Gateway:接收客戶請求並將其路由到適當的微服務。
  • 客戶資料服務:處理客戶的基本資料(例如姓名、聯絡方式)。
  • 客戶喜好服務:管理與存取客戶的偏好資料。
  • 資料庫服務:儲存客戶資料與喜好(例如 MySQL、PostgreSQL)。
  • 身份驗證與授權服務:管理客戶身份驗證(OAuth、JWT)。

2. Docker化微服務

首先,每個微服務需要一個 Docker 映像。以下是「客戶資料服務」的一個簡單範例:

Dockerfile

Dockerfile
# 使用 Python 為例
FROM python:3.9-slim

# 設置工作目錄
WORKDIR /app

# 複製當前目錄內容到容器中
COPY . .

# 安裝依賴項
RUN pip install -r requirements.txt

# 暴露服務端口
EXPOSE 5000

# 運行 Flask 應用
CMD ["python", "app.py"]

app.py

from flask import Flask, jsonify, request

app = Flask(__name__)

# 假設我們有一個客戶資料庫,這裡用字典作為示例
customers = {
    1: {"name": "Alice", "email": "alice@example.com"},
    2: {"name": "Bob", "email": "bob@example.com"}
}

@app.route('/customers', methods=['GET'])
def get_customers():
    return jsonify(customers)

@app.route('/customers/<int:customer_id>', methods=['GET'])
def get_customer(customer_id):
    customer = customers.get(customer_id)
    if customer:
        return jsonify(customer)
    else:
        return jsonify({"error": "Customer not found"}), 404

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

requirements.txt

Flask==2.1.1

3. Kubernetes Deployment

接著,我們可以編寫 Kubernetes 的 YAML 文件來部署這些服務。

customer-service-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: customer-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: customer-service
  template:
    metadata:
      labels:
        app: customer-service
    spec:
      containers:
      - name: customer-service
        image: your-dockerhub-username/customer-service:latest
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: customer-service
spec:
  selector:
    app: customer-service
  ports:
  - protocol: TCP
    port: 80
    targetPort: 5000
  type: ClusterIP

preference-service-deployment.yaml

(可以類似上面的 customer-service 設定,這裡假設你會有另一個微服務來處理客戶喜好)

4. 數據庫服務

我們可以使用 Kubernetes 來啟動 MySQL 資料庫。

mysql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "yourpassword"
        - name: MYSQL_DATABASE
          value: "customer_db"
        ports:
        - containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql

5. API Gateway

API Gateway 將負責接收客戶的請求,並將其路由到適當的微服務。可以使用 KongNGINX 作為 API Gateway。

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    events { worker_connections 1024; }
    http {
        server {
            listen 80;
            location /customers {
                proxy_pass http://customer-service;
            }
            location /preferences {
                proxy_pass http://preference-service;
            }
        }
    }
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80

6. 部署到 Kubernetes

當微服務和資源文件都準備好後,使用以下命令將其部署到 Kubernetes:

kubectl apply -f customer-service-deployment.yaml
kubectl apply -f preference-service-deployment.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f nginx-deployment.yaml

7. 測試與擴展

部署後,可以通過 LoadBalancer 的外部 IP 測試 API。若系統擴展需求增加,可以通過修改 replicas 來動態擴展每個服務的副本數。


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

尚未有邦友留言

立即登入留言