K8S学习之PV&&PVC

部署mysql之前我们需要先了解一个概念有状态服务。这是一种特殊的服务,简单的归纳下就是会产生需要持久化的数据,并且有很强的I/O需求,且重启需要依赖上次存储到磁盘的数据。如典型的mysql,kafka,zookeeper等等。
在我们有比较优秀的商业存储的前提下,非常推荐使用有状态服务进行部署,计算和存储分离那是相当的爽的。在实际生产中如果没有这种存储,localPV也是不错的选择,当然local pv其实和hostPath是一样的。当然我们在开发测试环境也是可以自己搭建一套简单的如NFS服务,来享受存储和计算分离的爽快感。
kubernetes中定义一种了资源类型Stateful Service即有状态服务,有状态服务需要的持久化数据动态绑定我们可以利用存储的API PersistentVolume(PV)和PersistentVolumeClaim(PVC)来进行需要的相关数据的绑定和存储。

PV概念

persistentVolume:是由管理员设置的存储,它是集群的一部分。就像节点时集群中的资源一样,PV也是集群中的资源。PV是Volumes之类的卷插件,但具有独立于使用PV的pod的生命周期。此API对象包含存储实现的细节,即NFS、iSCSI或者特定于云供应商的存储系统

PVC概念

peresistentVolumeClaim是用户存储的请求。它与pod相似,pod消耗节点资源,PVC消耗PV资源。pod可以请求特定级别的资源(CPU和内存)。盛名可以请求特定的大小和访问模式。例如:可以以读/写一次或者 只读多次模式挂载。

PV & PVC

PV就好比是一个仓库,我们需要先购买一个仓库,即定义一个PV存储服务,例如CEPH,NFS,Local Hostpath等等。
PVC就好比租户,pv和pvc是一对一绑定的,挂载到POD中,一个pvc可以被多个pod挂载。

全部资源文件清单

pv
apiVersion: v1 
kind: PersistentVolume 
metadata: 
  labels: 
    app: mariadb-pv 
  name: data-mariadb-pv 
spec: 
  accessModes: 
    - ReadWriteOnce 
  capacity: 
    storage: 10Gi 
  hostPath: 
    path: /data/mariadb 
    type: DirectoryOrCreate 
  persistentVolumeReclaimPolicy: Retain 
  storageClassName: standard 
  volumeMode: Filesystem
pvc

pvandpvchostpath/mariadbpvc.yml

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
  name: k8sdemo-mariadb-pvclaim 
  labels: 
    app: k8sdemo-mariadb-pvc 
spec: 
  accessModes: 
    - ReadWriteOnce 
  storageClassName: standard 
  resources: 
    requests: 
      storage: 1Gi
service
volumes: 
  - name: mysqlvolume 
    persistentVolumeClaim: 
      claimName: k8sdemo-mariadb-pvclaim

完整文件信息
pvandpvchostpath/mariadb.yml

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: mariadb-deploy 
  labels: 
    app: mariadb-deploy 
spec: 
  replicas: 1 
  template: 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      nodeSelector: 
        mariadb: mariadb 
      imagePullSecrets: 
        - name: lagouharbor 
      containers: 
        - name: mariadb-deploy 
          image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
          imagePullPolicy: 
          IfNotPresent 
          ports: 
            - containerPort: 3307 
          env:
            - name: MYSQL_ROOT_PASSWORD 
              #这是mysqlroot用户的密码 
              valueFrom: 
                secretKeyRef: 
                  key: password 
                  name: mariadbsecret 
            - name: TZ 
              value: Asia/Shanghai 
          args: 
            - "--character-set-server=utf8mb4" 
            - "--collation-server=utf8mb4_unicode_ci" 
          volumeMounts: 
            - mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录 
              name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
            - mountPath: /var/lib/mysql #容器内的挂载目录 
              name: volume-mariadb 
      restartPolicy: Always 
      volumes: 
        - name: lagoumariadb 
          configMap: 
            name: mariadbconfigmap
        - name: volume-mariadb 
          persistentVolumeClaim: 
            claimName: mariadb-pvc 
  selector: 
    matchLabels: 
      app: mariadb-deploy 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: mariadb-svc 
spec: 
  selector: 
    app: mariadb-deploy 
  ports: 
    - port: 3307 
      targetPort: 3307 
      nodePort: 30036 
  type: NodePort
secret

pvandpvchostpath/mariadbsecret.yml

apiVersion: v1 
kind: Secret 
metadata: 
  name: mariadbsecret 
type: Opaque 
data: 
  password: YWRtaW4=
configmap

pvandpvchostpath/mariadb.yml

apiVersion: v1 
data: 
  my.cnf: "省略中间数据部分,请各位同学前面章节" 
kind: ConfigMap 
metadata: 
  name: mariadbconfigmap

客户端测试

IP:192.168.198.157 
username:root 
password:admin 
prot: 30036

你可能感兴趣的:(K8S学习之PV&&PVC)