如何使用本地安装的数据卷创建mysql kubernetes服务? [英] How to create a mysql kubernetes service with a locally mounted data volume?

查看:63
本文介绍了如何使用本地安装的数据卷创建mysql kubernetes服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I should be able to mount a local directory as a persistent volume data folder for a mysql docker container running under minikube/kubernetes.

实现与Docker直接运行共享卷没有任何问题,但是在kubernetes下运行,我无法

I don't have any problem achieving a shared volume running it with Docker directly, but running it under kubernetes, I'm not able to

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上创建一个目录以共享作为持久卷存储,例如

create a directory on the mac to be shared as the persistent volume storage, e.g.

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

deployment.yml

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关闭时,数据不会持久存在,并且没有任何内容写入已装载的数据文件夹

I can start up the pod, connect through mysql client, create a database, but when pod shuts down, the data does not persist and there is nothing written to the mounted data folder

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 

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

re-create and connect again as above

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

mysql> 

推荐答案

您必须创建 存储类为本地 ,然后将其映射到本地路径.

You must create a Persistent Volume, defining the Storage Class as Local, then map it to local path.

创建存储类

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

最后,创建持久的批量声明

A last, create persistent volume claim

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 .您应该会看到类似

To list persistent values run kubectl get pv. You should see some output like

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

持久卷将在节点使用后立即可用.

The persistent volume will be available as soon as a node uses it.

帖子可能对您有所帮助更多.

This post may help you little bit more.

这篇关于如何使用本地安装的数据卷创建mysql kubernetes服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆