【问题标题】:How to create a mysql kubernetes service with a locally mounted data volume?如何使用本地挂载的数据卷创建 mysql kubernetes 服务?
【发布时间】:2019-01-28 16:14:43
【问题描述】:

我应该能够将本地目录挂载为在 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

deployment.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> 

【问题讨论】:

  • 您是否创建了持久卷?
  • @MauroBaraldi 。请参考上面的部分:在mac上创建一个目录作为持久卷存储和deployment.yml共享。如果您觉得缺少其他步骤,请告诉我。

标签: mysql docker kubernetes docker-for-mac persistent-volumes


【解决方案1】:

您必须创建一个Persistent Volume,定义Storage Class as Local,然后将其映射到本地路径。

创建存储类

storage-class.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 的帖子可能对您有所帮助。

【讨论】:

  • 对不起@slashdottir,我错过了一些步骤。创建持久卷 Clain。刚刚更新了答案。
  • 感谢 Mauro 提供此信息,但是,当我应用您的解决方案时,我仍然遇到同样的问题,即数据不会持续存在,也没有任何内容写入本地卷:pastebin.com/f9C9anD5
  • volume_mounts 中,是 pod 路径。在您的 pv-local.yaml 文件中,您没有定义 local > path: /path/from/you/machine 准则。
  • 谢谢 Mauro,我更正了该信息,但仍然出现错误:pastebin.com/CRrURGin
  • 当副本缩放器在本地存储不可用的不同节点上配置 pod 时,您将如何解决问题?根据我的理解,您应该使用 Node Affinity 来确保在所需节点上启动 pod。
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 2023-03-18
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2020-03-17
相关资源
最近更新 更多