如何创建本地挂载数据卷的mysql kubernetes服务?

2024-04-18

我应该能够将本地目录挂载为在 minikube/kubernetes 下运行的 mysql docker 容器的持久卷数据文件夹。

我直接使用 Docker 运行共享卷没有任何问题,但在 kubernetes 下运行它,我无法

osx 10.13.6
Docker Desktop Community version 2.0.0.2 (30215)
Channel: stable
0b030e17ca
Engine 18.09.1
Compose: 1.23.2
Machine 0.16.1
Kubernetes v1.10.11
minikube version: v0.33.1

重现行为的步骤

install docker-for-mac and enable kubernetes

在 Mac 上创建一个目录作为持久卷存储共享,例如

sudo mkdir -m 777 -p /Users/foo/mysql

部署.yml

# For use on docker for mac
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: localstorage
provisioner: docker.io/hostpath
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: mysql
  name: mysql-pvc
spec:
  storageClassName: localstorage
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    type: local
spec:
  storageClassName: localstorage
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
    - ReadOnlyMany
  hostPath:
    # this is the path on laptop? 
    path: "/Users/foo/mysql"
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  selector:
    app: mysql-service
  ports:
    - port: 3306
      targetPort: 3306
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-server
  labels:
    app: mysql-server
spec:
  selector:
    matchLabels:
      app: mysql-server
  template:
    metadata:
      labels:
        app: mysql-server
    spec:
      containers:
      - name: mysql-server
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: ""
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-pvc
          # this is the path on the pod container?
          mountPath: "/mnt/data"
      volumes:
      - name: mysql-pvc
        persistentVolumeClaim:
          claimName: mysql-pvc

我可以启动 pod,通过 mysql 客户端连接,创建数据库,但是当 pod 关闭时,数据不会持久,并且没有任何内容写入已安装的数据文件夹

kubectl create -f deployment.yml
kubectl port-forward mysql-server-6b64c4545f-kp7h9 3306:3306
mysql -h 127.0.0.1 -P 3306 -u root
    mysql> create database foo;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| foo                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

....

删除部署:

kubectl delete sc "localstorage" 
kubectl delete persistentvolume "mysql-pv" 
kubectl delete persistentvolumeclaim "mysql-pvc" 
kubectl delete service "mysql-service" 
kubectl delete deployment.apps "mysql-server" 
kubectl delete events --all 

如上所述重新创建并再次连接

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> 

您必须创建一个持久量 https://kubernetes.io/docs/concepts/storage/persistent-volumes/,定义存储类别为本地 https://kubernetes.io/docs/concepts/storage/storage-classes/#local,然后将其映射到本地路径。

创建存储类

存储类.yml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

然后运行kubectl create -f storage-class.yml

创造持久价值

pv-local.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - cka

创建持久卷运行kubectl create -f pv-sdc.yml

最后,创建持久卷声明

pvc1.yml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 10Gi

创建正在运行的持久卷声明kubectl create -f pvc1.yml

要列出持久值,请运行kubectl get pv。您应该看到一些输出,例如

NAME           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS    REASON    AGE
local-pv       10Gi      RWO            Retain           Available             local-storage             10s

一旦节点使用持久卷,它就可用。

This https://serverascode.com/2018/09/19/persistent-local-volumes-kubernetes.html帖子可能会对您有更多帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建本地挂载数据卷的mysql kubernetes服务? 的相关文章

随机推荐