k8s pv pvc持久化数据使用

324 阅读1分钟

主要用于pod的数据持久化使用,下面先介绍本地文件夹挂载方式,集群推荐使用NFS进行文件挂载

一、本地文件夹挂载方式

PV和PVC两者需要相互绑定才可以,matchExpressions.values指定了在哪个节点生效使用 创建PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /home/data/mysql
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - minikube

创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  volumeName: mysql-pv
  resources:
    requests:
      storage: 1Gi

创建StorageClass

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

mysql使用pvc

mysql的其他配置使用了ConfigMap进行统一管理,可以理解为就是配置文件

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  ports:
    - name: mysqlport
      protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 30106
  selector:
    app: mysql-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-app
  labels:
    app: mysql-app
spec:
  selector:
    matchLabels:
      app: mysql-app
  template:
    metadata:
      labels:
        app: mysql-app
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          imagePullPolicy: IfNotPresent
          args:
            - --default_authentication_plugin=mysql_native_password
            - --character-set-server=utf8mb4
            - --collation-server=utf8mb4_unicode_ci
          ports:
            - containerPort: 3306
              name: dbport
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: root@123
          volumeMounts:
            - name: mysql-pvc
              mountPath: /var/lib/mysql
            - name: mysql-config
              mountPath: /etc/mysql/conf.d/
      volumes:
        - name: mysql-pvc
          persistentVolumeClaim:
            claimName: mysql-pvc
        - name: mysql-config
          configMap:
            name: mysql-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
data:
  mysqld.cnf: |
    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    log-error      = /var/log/mysql/error.log
    bind-address   = 0.0.0.0
    symbolic-links=0
    max_connections=1000
    default_storage_engine=innodb
    skip_external_locking
    lower_case_table_names=1
    skip_host_cache
    skip_name_resolve
    character_set_server=utf8
    sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

到此就可以使用 30106这个端口进行访问mysql了,但是为了方便管理建议使用ingress进行端口转发

二、使用NFS网络文件系统进行文件挂载

创建NFS

创建PV

创建PVC

pod使用PVC