我們在日常開發中經常會用到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!