一、emptyDir持久化存储配置

  emptyDir 的一些用途:

  • 缓存空间,例如基于磁盘的归并排序。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

    和上述 volume 不同的是,如果删除 Pod,emptyDir 卷中的数据也将被删除,一般 emptyDir卷用

    于 Pod 中的不同 Container 共享数据。它可以被挂载到相同或不同的路径上。默认情况下,

    emptyDir 卷支持节点上的任何介质,可能是 SSD、磁盘或网络存储,具体取决于自身的环境。可以将

    emptyDir.medium 字段设置为 Memory,让 Kubernetes 使用 tmpfs(内存支持的文件系统),虽然 tmpfs

    非常快,但是 tmpfs 在节点重启时,数据同样会被清除,并且设置的大小会被计入到 Container 的内存限制当中。

  说明:

    当启用 SizeMemoryBackedVolumes 特性门控时, 你可以为基于内存提供的卷指定大小。

     如果未指定大小,则基于内存的卷的大小为 Linux 主机上内存的 50%

  1-1、创建emptyDir yaml文件

vim emptydir-volume.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: emptydir-volume
  name: emptydir-volume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: emptydir-volume
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: emptydir-volume
    spec:
      containers:
      - image: nginx:1.16.1-alpine
        name: nginx
        volumeMounts:                    #容器内挂载参数值
        - mountPath: /mnt               #容器内挂载参数目录路径
          name: emptydir-share        #挂载名字,名称要跟volume. - name 名称一致
      volumes:                               #创建挂载模式参数值
      - name: emptydir-share          #挂载存储名称
        emptyDir: {}                        #设置为emptyDir挂载模式

  1-2、执行创建的emptyDir yaml文件命令

#创建 emptyDir 命令
kubectl create -f emptydir-volume.yaml

#查看创建状态命令
kubectl get pod

  注:emptyDir容器数据共享最好是一个yaml文件实现一个容器两个运气,这样才能实现数据共享。

    上面的emptyDir yaml文件只需在配置文件里containers 下面添加一个镜像配置即可

二、hostPath持久化数据存储

  2-1、创建hostPath yaml文件 

vim hostpath-volume.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hostpath-volume
  name: hostpath-volume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hostpath-volume
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: hostpath-volume
    spec:
      containers:
      - image: nginx:1.16.1-alpine
        name: nginx
        volumeMounts:
        - mountPath: /opt          #挂载容器目录路径
          name: hostpath-share
      volumes:
      - name: hostpath-share
        hostPath:                       #设置为hostPath数据持久化
          path: /data                   #指定宿主机目录,这个目录每个节点需要都存在
          type: Directory              #设置hostPath type类型

  注:hostPath 卷常用的 type(类型)如下:

    1) type 为空字符串:默认选项,意味着挂载 hostPath 卷之前不会执行任何检查。

    2) DirectoryOrCreate:如果给定的 path 不存在任何东西,那么将根据需要

      创建一个权限为0755 的空目录,和 Kubelet 具有相同的组和权限。

    3) Directory:目录必须存在于给定的路径下。

    4) FileOrCreate:如果给定的路径不存储任何内容,则会根据需要创建一个空文件,

      权限设置为 0644,和 Kubelet 具有相同的组和所有权。

    5) File:文件,必须存在于给定路径中。

    6) Socket:UNIX 套接字,必须存在于给定路径中。

    7) CharDevice:字符设备,必须存在于给定路径中。

    8) BlockDevice:块设备,必须存在于给定路径中。

   2-2、创建hostPath 容器命令和查询创建后状态

#创建
kubectl create -f hostpath-volume.yaml

#查询
kubectl get pod

  注:

    在创建使用hostPaht持久化容器的时候,会存在volume.hostpath.path指定的宿主机目录相互节点数据不能同步,

    如果数据不能同步会存在hostpath容器删除重建安装到其它节点上面,原来的数据不能功能想到新的节点上面使用。

    hostPaht不推荐使用

  2-3、挂载/etc/localtime 到容器修改容器里面的时间

vim web-hostpah.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web-hostpath
  name: web-hostpath

spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-hostpath
  template:
    metadata:
      labels:
        app: web-hostpath
    spec:
      containers:
      - image: nginx
        name: web-hostpath
        ports:
        - containerPort: 80
          name: hostpath-svc
        volumeMounts:
        - name: cm-localtime
          mountPath: /etc/localtime
          readOnly: true
      volumes:
        - name: cm-localtime
          hostPath:
            path: /etc/localtime
            type: File

  

三、NFS持久化数据存储

  3-1、安装nfs服务(nfs服务只在一台机器安装即可)和每个节点上面安装nfs客户端软件

#找一台机器安装NFS服务端,命令如下
yum install nfs* rpcbind -y

#NFS服务端创建共享目录
mkdir /data/share -p

#NFS服务器创建共享目录
vim /etc/exports
/data/share/ *(rw,sync,no_subtree_check,no_root_squash)

#启动NFS服务端
exportfs -r
systemctl restart nfs rpcbind

#k8s所有节点安装nfs客户端
yum install nfs-utils -y

#挂载测试
mount -t nfs nfs-serverIP:/data/share /mnt/

  3-2、创建NFS yaml文件 vim nfs-volume.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nfs-volume
  name: nfs-volume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-volume
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nfs-volume
    spec:
      containers:
      - image: nginx:1.16.1-alpine
        name: nginx
        volumeMounts:
        - mountPath: /opt           #挂载目录路径
          name: nfs-volume
      volumes:
      - name: nfs-volume
        nfs:                                #指向nfs 持久化存储
          server: 192.168.3.81     #指向NFS服务器IP地址
          path: /data/share          #指向nfs服务器挂载目录

  3-2、创建nfs容器和查看nfs容器创建状态

#创建
kubectl create -f nfs-volume.yaml

#查询
kubectl get pod

  注:

    NFS持久化存储和NAS持久化存储配置一样只需稍作修改既可以使用NAS持久化存储。

    生产环境不推荐使用NFS作为持久化存储

 

 四、PVS配置NFS或NAS

  说明:关于NFS服务架设看上面3-1示例

  4-1、PV回收策略

    ➢ Retain:保留,该策略允许手动回收资源,当删除PVC时,PV仍然存在,PV被视为已释放,管理员可以手动回收卷。

    ➢ Recycle:回收,如果Volume插件支持,Recycle策略会对卷执行rm -rf清理该PV,并使其可用于下一个新的PVC,

     但是本策略将来会被弃用,目前只有NFS和HostPath支持该策略。

    ➢ Delete:删除,如果Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete,目前支持Delete的存储

     后端包括AWS EBS, GCEPD, Azure Disk, or OpenStack Cinder等。

    ➢ 可以通过persistentVolumeReclaimPolicy: Recycle字段配置

 

  4-2、PV访问策略

    ➢ ReadWriteOnce:可以被单节点以读写模式挂载,命令行中可以被缩写为RWO。

    ➢ ReadWriteOncePod :只允许被单个Pod访问,需要K8s 1.22+以上版本,并且是CSI创建的PV才可使用

 

  4-3、存储分类

    ➢ 文件存储:一些数据可能需要被多个节点使用,比如用户的头像、用户上传的文件等,

     实现方式:NFS、NAS、FTP、CephFS等。

    ➢ 块存储:一些数据只能被一个节点使用,或者是需要将一块裸盘整个挂载使用,比如

     数据库、Redis等,实现方式:Ceph、GlusterFS、公有云。

    ➢ 对象存储:由程序代码直接实现的一种存储方式,云原生应用无状态化常用的实现方式,

     实现方式:一般是符合S3协议的云存储,比如AWS的S3存储、Minio、七牛云等。

 

  4-4、创建NFS PV yaml 文件 vim pv-nfs.yaml

#NFS PV yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs-slow
  nfs:
    path: /data/share
    server: 192.168.3.81

#创建
kubectl create -f pv-nfs.yaml

  注:

    ➢ capacity:容量配置

    ➢ volumeMode:卷的模式,目前支持Filesystem文件系统) 和 Block(块),其中Block类型需要后端存储支持,

     默认为文件系统

    ➢ storage: 5Gi :配置容量大小。容量大小限制需要挂载类型支撑。NFS不支持容量大小限制

    ➢ accessModes:该PV的访问模式

    ➢ storageClassName:PV的类,一个特定类型的PV只能绑定到特定类别的PVC;

    ➢ persistentVolumeReclaimPolicy:回收策略

    ➢ mountOptions:非必须,新版本中已弃用

    ➢ nfs:NFS服务配置,包括以下两个选项

      ◼ path:NFS上的共享目录

      ◼ server:NFS的IP地址

 

  4-5、PV状态

[root@k8s-master1 pvc]# kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-hostpath   5Gi        RWO            Recycle          Available           hostpath                8s
pv-nfs        5Gi        RWO            Recycle          Available           nfs-slow                12h

    ➢ Available:可用,没有被PVC绑定的空闲资源。

    ➢ Bound:已绑定,已经被PVC绑定。

    ➢ Released:已释放,PVC被删除,但是资源还未被重新使用。

    ➢ Failed:失败,自动回收失败。

 

  4-6、创建hostPath PV yaml 文件

#hostPath PV yaml
vim pv-hostpath.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-hostpath
  labels:
    type: local
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: hostpath
  hostPath:
    path: "/mnt/data"

#创建
kubectl create -f pv-hostpath.yaml

  4-7、创建PVC绑定NFS PV yaml文件 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-claim
spec:
  storageClassName: nfs-slow   #这里指定是创建PV里面的storageClassName这个名称,进行PV绑定
  accessModes:
    - ReadWriteOnce            #这里访问策略和PV里面的策略保持一致
  resources:
    requests:
      storage: 3Gi             #这里要小于或等于PV storage 大小

  注:pvc 没有指定命名空间因为需要跟pod在一个命名空间。如果需要指定命名空间自己在指向命名空间

  4-7-1、创建PVC 绑定NFS和查看创建后状态

#创建
[root@k8s-master1 pvc]# kubectl create -f pvc-nfs-claim.yaml 
persistentvolumeclaim/pvc-nfs-claim created

#查看pvc绑定状态
[root@k8s-master1 pvc]# kubectl get pvc
NAME            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs-claim   Bound    pv-nfs   5Gi        RWO            nfs-slow       8s

[root@k8s-master1 pvc]# kubectl get pv pv-nfs
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs   5Gi        RWO            Recycle          Bound    default/pvc-nfs-claim   nfs-slow                12h

  注:通过查看绑定状态,status 信息显示了Bound 以绑定状态,查看nfs pv的时候也显示Bound状态。说明NFS pv 已经更PVC绑定成功

  4-8、挂载pvc

    4-8-1、创建挂载yaml文件。把pvc挂载到Deployment nginx上面

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pvc-nfs
  name: nginx-pvc-nfs
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pvc-nfs
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-pvc-nfs
    spec:
      containers:
      - image: nginx:1.16.1-alpine
        name: nginx
        volumeMounts:
        - mountPath: /usr/share/nginx/html    #挂载目录路径
          name: pvc-nfs-storage               #这里的名称要跟volumes. -name 名称一致
      volumes:
      - name: pvc-nfs-storage
        persistentVolumeClaim:
          claimName: pvc-nfs-claim            #这里的pvc-nfs-claim名称是pvc里面命名的名称需要跟pvc里面的名称一致,忘记需要进行查看

  4-8-2、创建绑定和查看创建状态

#创建nginx和pvc绑定命令

[root@k8s-master1 pvc]# kubectl create -f nginx-pvc-nfs.yaml 
deployment.apps/nginx-pvc-nfs created


#查看状态
[root@k8s-master1 pvc]# kubectl get pod
NAME                               READY   STATUS    RESTARTS      AGE
emptydir-volume-5c5f5f99cb-9nptl   1/1     Running   2 (98m ago)   21h
hostpath-volume-6896d5b675-mm467   1/1     Running   2 (97m ago)   21h
nfs-volume-76df7d5f7f-r24jm        1/1     Running   2 (97m ago)   21h
nginx-7f56bb9bdc-qgmvb             1/1     Running   4 (97m ago)   47h
nginx-pvc-nfs-69ccf559d6-9g8jm     1/1     Running   0             13s
nginx-pvc-nfs-69ccf559d6-v7kqj     1/1     Running   0             13s
web-5675698566-qlpl7               1/1     Running   4 (97m ago)   47h

  4-8-3、登录容器查看nfs容器直接数据是否互相共享

deployment kubernetes 标签 kubernetes emptydir_nginx

 

 4-9、PVC创建和挂载失败的原因

  ➢ PVC一直Pending的原因:

    1)PVC的空间申请大小大于PV的大小

    2)PVC的StorageClassName没有和PV的一致

    3)PVC的accessModes和PV的不一致

  

  ➢ 挂载PVC的Pod一直处于Pending:

    1)PVC没有创建成功/PVC不存在

    2)PVC和Pod不在同一个Namespace