k8s部署mysql數據持久化時,pv非空問題

我們在日常開發中經常會用到MySQL數據庫,最簡單的辦法是通過k8s去部署,依賴k8s集羣保持高可用,依賴pv/pvc持久化數據。

在一切配好後,啓動MySQL的過程中,可能會出錯:
[ERROR] --initialize specified but the data directory has files in it. Aborting.

原因是MySQL的初始化需要一個非空的文件夾,但是創建PV的時候默認會有lost+found文件夾,所以導致初始化失敗。解決的辦法有:

  • 通過掛載subPath子路徑

  • 添加args: ["--ignore-db-dir=lost+found"]

這裏附上一個我在本地測試的demo供參考,由於自己電腦搭nfs有問題,所以PV選擇的是本地。

一、創建pv/pvc
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-hostpath
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /Users/guoxingyu/Documents/data
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-hostpath
  labels:
    app: mysql
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

二、創建StatefulSet

核心就是通過subPath錯開原路徑中的文件夾

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1
  serviceName: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:latest
        env:
        - name: MYSQL_ROOT_PASSWORD    # 這裏設置root的密碼
          value: root
        resources:
          requests:
            cpu: "50m"
            memory: 1Gi
          limits:
            cpu: "1"
            memory: 2Gi
        volumeMounts:
        - name: mysql-store
          mountPath: /var/lib/mysql  # MySQL容器的數據默認都是存在這個目錄
          subPath: mysqldata  # 這裏通過subPath掛載到子目錄,就可以避免出錯
      volumes:
      - name: mysql-store
        persistentVolumeClaim:
          claimName: pvc-hostpath

三、創建Service

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 31000
  selector:
    statefulset.kubernetes.io/pod-name: mysql-0

Done!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章