zoukankan      html  css  js  c++  java
  • 10--k8s之数据持久化

    一、emptDir

    emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录。

    不是为了存储数据,是为了实现多个Pod之间的临时数据共享,一般用来共享日志文件,当Pod删除时,emptydir立即删除

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: emptydir
    spec:
      selector:
        matchLabels:
          app: emptydir
      template:
        metadata:
          labels:
            app: emptydir
        spec:
          containers:
            - name: nginx
              image: nginx
              volumeMounts: # 引用存储卷
                - mountPath: /data/
                  name: emptydir-name # 引用的存储卷名称
            - name: php
              image: registry.cn-hangzhou.aliyuncs.com/alivnos/
              volumeMounts: # 引用存储卷
                - mountPath: /opt
                  name: emptydir-name
          volumes: # 定义空的存储卷,与containers同级
            - name: emptydir-name # 存储卷的名称
              emptyDir: {}
    

    二、hostPath

    hostPath 类型则是映射 node 文件系统中的文件或者目录到 pod 里。在使用 hostPath 类型的存储卷时,也可以设置 type 字段,支持的类型有文件、目录、File、Socket、CharDevice 和 BlockDevice。

    hostPath是挂载node 主机上的(当pod运行在那台主机上,hostPtah就相当于docker挂载到当前系统)

    支持的类型:
    DirectoryOrCreate:如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。
    Directory 在给定路径上必须存在的目录。
    FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。
    File 在给定路径上必须存在的文件。
    Socket 在给定路径上必须存在的 UNIX 套接字。
    CharDevice 在给定路径上必须存在的字符设备。
    BlockDevice 在给定路径上必须存在的块设备。
    [root@k8s-m-01 ~]# kubectl explain pod.spec.volumes.hostPath

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: emptydir
    spec:
      selector:
        matchLabels:
          app: emptydir
      template:
        metadata:
          labels:
            app: emptydir
        spec:
          containers:
            - name: nginx
              image: nginx
              volumeMounts:
                - mountPath: /opt
                  name: hostpath-name
          volumes:
            - name: hostpath-name
              hostPath:
                path: /opt  #主机挂载的目录  
                type: DirectoryOrCreate # 没有的话自动创建,权限默认755
                # type: Directory # 目录必须要存在
                # type: FileOrCreate # 文件没有的话自动创建,权限默认644
                # type: File # 文件必须存在
                # type: Socket # 给定路径上必须有套接字文件
    

    三、pv 和 pvc

    PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。

    PersistentVolumeClaim(PVC)是用户存储的请求。PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),定义的时候直接指定大小,pvc必须与对应的pv建立关系,pvc会根据定义去pv申请,而pv是由存储空间创建出来的。pv和pvc是kubernetes抽象出来的一种存储资源。

    pod的生命周期不会影响pv的生命周期,是把磁盘编程kubernetes的资源

    pv是集群级资源,pvc是命名空间级资源-->使用要绑定命名空间

    1.环境准备

    # 每个节点都安装nfs
    yum install nfs-utils -y
    
    # 创建存储目录
    [root@m01 wordpress]# mkdir -p /nfs/v{1..9}
    [root@m01 wordpress]# cd /nfs/
    [root@m01 nfs]# ls
    v1  v2  v3  v4  v5  v6  v7  v8  v9
    
    /vim /etc/exports
    /v1 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v2 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v3 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v4 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v5 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v6 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v7 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v8 192.168.15.0/24(rw,sync,all_squash)
    /nfs/v9 192.168.15.0/24(rw,sync,all_squash)
    
    # 启动nfs
    [root@m01 nfs]# systemctl enable --now rpcbind nfs
    Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
    
    # 验证配置
    [root@m01 nfs]# showmount -e
    Export list for m01:
    /nfs/v9 192.168.15.0/24
    /nfs/v8 192.168.15.0/24
    /nfs/v7 192.168.15.0/24
    /nfs/v6 192.168.15.0/24
    /nfs/v5 192.168.15.0/24
    /nfs/v4 192.168.15.0/24
    /nfs/v3 192.168.15.0/24
    /nfs/v2 192.168.15.0/24
    /nfs/v1 192.168.15.0/24
    
    

    2.创建pv

    详解

    # pv 创建
    # 不需要指定命名空间,pv是集群级资源
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv001
      labels:
        app: pv001
    spec:
      nfs: # 存储类型
        path: /nfs/v1 # 存储的目录
        server: 192.168.15.51 # server的ip
      accessModes: # 访问模式
        - "ReadWriteMany" # RWX,多路可读可写(常用)
        # - "ReadOnlyMany" # ROX,只读,可多节点挂载
        # - "ReadWriteOnce" # RWO,可读可写,只支持单个模式的挂载
      persistentVolumeReclaimPolicy: Retain # 解绑pvc的回收策略-->不清理(常用)
      # persistentVolumeReclaimPolicy: Recycle # 删除,只有NFS,hostPath支持
      # persistentVolumeReclaimPolicy: Delete # 其他模式的清除
      capacity:
        storage: 2Gi # 创建的大小
    

    部署

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv001
    spec:
      nfs:
        path: /nfs/v1
        server: 192.168.15.51
      accessModes:
        - "ReadWriteMany"
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 2Gi
    

    查看

    [root@m01 pv]# kubectl apply -f pv.yaml 
    persistentvolume/pv001 created
    [root@m01 pv]# kubectl get -f pv.yaml 
    NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pv001   2Gi        RWX            Retain           Available                                   7s
    

    3.创建pvc

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc001
      namespace: xxx # pvc是命名空间级别资源,需要定义命名空间
    spec:
      accessModes:
        - "ReadWriteMany" # 访问模式要与创建的pv一致
      resources:
        requests:
          storage: "2Gi"
          
    # 选择适配的pv去进行匹配
    

    4.使用

    # 创建应用使用
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: test-rwo
    spec:
      selector:
        matchLabels:
          app: rwo
      template:
        metadata:
          labels:
            app: rwo
        spec:
          containers:
            - name: nginx
              image: nginx
              volumeMounts:
                - mountPath: /opt
                  name: pvc001 # 使用的volumes
          volumes:
            - name: pvc001
              persistentVolumeClaim: # 定义存储卷的类型是pvc
                claimName: pvc001 # 存储卷的名字
    

    5.综合案例

    使用存储卷部署discuz,实现代码共享存储

    # 创建数据库的命名空间
    apiVersion: v1
    kind: Namespace
    metadata:
      name: mysql
    ---
    # 创建数据库
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
      namespace: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
            - name: mysql
              image: mysql:5.7
              imagePullPolicy: Always
              env:
                - name: MYSQL_ROOT_PASSWORD
                  value: "123456"
                - name: MYSQL_DATABASE
                  value: discuz
    ---
    
    # 创建数据库的Service
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      namespace: mysql
    spec:
      selector:
        app: mysql
      ports:
        - port: 3306
          targetPort: 3306
      type: NodePort
    
    ---
    # 创建discuz命名空间
    apiVersion: v1
    kind: Namespace
    metadata:
      name: discuz
    
    ---
    # 创建discuz的pv
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: discuz
    spec:
      nfs:
        path: /nfs/v1
        server: 192.168.15.51
      accessModes:
        - "ReadWriteMany"
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: "2Gi"
    
    ---
    # 创建discuz的pvc
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: discuz
      namespace: discuz
    spec:
      accessModes:
        - "ReadWriteMany"
      resources:
        requests:
          storage: "2Gi"
    
    ---
    
    # 创建discuz控制器
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: discuz
      namespace: discuz
    spec:
      selector:
        matchLabels:
          app: discuz
      template:
        metadata:
          labels:
            app: discuz
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-php-v1
              name: php
              imagePullPolicy: IfNotPresent
              volumeMounts:
                - mountPath: /usr/share/nginx/html
                  name: discuz
    
            - name: nginx
              image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-v1
              imagePullPolicy: IfNotPresent
              livenessProbe:
                exec:
                  command:
                    - "/bin/bash"
                    - "-c"
                    - "cat /etc/nginx/nginx.conf"
                initialDelaySeconds: 0
                periodSeconds: 3
                timeoutSeconds: 1
                successThreshold: 1
                failureThreshold: 1
              readinessProbe:
                tcpSocket:
                  port: 80
                initialDelaySeconds: 10
                periodSeconds: 1
                timeoutSeconds: 1
                successThreshold: 3
                failureThreshold: 1
              volumeMounts:
                - mountPath: /usr/share/nginx/html
                  name: discuz
    
          volumes:
            - name: discuz
              persistentVolumeClaim:
                claimName: discuz
    
    ---
    # 创建discuz的Service
    apiVersion: v1
    kind: Service
    metadata:
      name: discuz
      namespace: discuz
    spec:
      selector:
        app: discuz
      ports:
        - port: 80
          targetPort: 80
          name: http
      type: ClusterIP
    ---
    kind: Ingress
    apiVersion: extensions/v1beta1
    metadata:
      name: ingress-discuz
      namespace: discuz
    spec:
      rules:
        - host: www.discuz.com
          http:
            paths:
              - path: /
                backend:
                  serviceName: discuz
                  servicePort: 80
    

  • 相关阅读:
    !JS实战之随机像素图
    bgp选路原则【第二部】
    BGP基础【第三部】
    【★】KMP算法完整教程
    ★如何引导客户需求?几个经…
    html标签缺省(自带)样式大全
    Web颜色对照表大全
    PS各个工具的字母快捷键和英…
    色相、明度及饱和度
    用webgl打造自己的3D迷宫游戏
  • 原文地址:https://www.cnblogs.com/caodan01/p/15136217.html
Copyright © 2011-2022 走看看