当前位置:   article > 正文

k8s存储 emptyDir hostPath PvPvc_pvc使用hostpath

pvc使用hostpath

背景

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的volume抽象就很好的解决了这些问题。

Kubernetes 中的卷有明确的寿命 —— 与封装它的 Pod 相同。所以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes支持多种类型的卷,Pod 可以同时使用任意数量的卷

本次操作的环境

主机节点cpu内存硬盘
192.168.233.140master124g30g
192.168.233.141node124g30g
192.168.233.142node224g30g
192.168.233.143harbor仓库24g30g

卷的类型

emptyDir

当 Pod 被分配给节点时,首先创建emptyDir卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除

emptyDir的用法有:

  • 暂存空间,例如用于基于磁盘的合并排序
  • 用作长时间计算崩溃恢复时的检查点
  • Web服务器容器提供数据时,保存内容管理器容器提取的文件

创建pod
nginx-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-volume
spec:
  containers:
  - name: volume
    image: hub.bushro.com/public/nginx:1.16.1
    volumeMounts:
    - mountPath: /mymount
      name: mount-volume
  volumes:
  - name: mount-volume
    emptyDir: {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

mountPath是容器中的目录
启动

[root@k8s-master1 ~]# kubectl apply -f nginx-volume.yaml --record
pod/nginx-volume created
[root@k8s-master1 ~]# kubectl get pod|grep nginx-volume
nginx-volume                        1/1     Running   0          5m33s
[root@k8s-master1 ~]# kubectl exec nginx-volume mount|grep mymount
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
/dev/mapper/centos-root on /mymount type xfs (rw,relatime,attr2,inode64,noquota)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果说这个pod有多个容器,并且挂载的目录都一样。那么就可以共享这个目录了。

hostPath

hostPath:卷将主机节点的文件系统中的文件或目录挂载到集群中
当pod停止或者被删除是hostPath文件还是会在宿主机中

hostPath的用途如下:

  • 运行需要访问 Docker 内部的容器;使用/var/lib/docker的hostPath
  • 在容器中运行 cAdvisor;使用/dev/cgroups的hostPath
  • 允许 pod 指定给定的 hostPath 是否应该在 pod 运行之前存在,是否应该创建,以及它应该以什么形式存在

使用案例

apiVersion: v1
kind: Pod
metadata:
  name: nginx-host
spec:
  containers:
  - name: host
    image: hub.bushro.com/public/nginx:1.16.1
    volumeMounts:
    - mountPath: /mymount
      name: mount-volume
  volumes:
  - name: mount-volume
    hostPath:
      path: /mymount
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

使用这种卷类型是请注意,因为:

  • 由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为可能会有所不同
  • 当 Kubernetes 按照计划添加资源感知调度时,将无法考虑 hostPath 使用的资源
  • 在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机上的文件权限以便写入hostPath卷

PV->PVC

由于使用本地的Volume会有一些限制,比如Pod必须要与Volume在同一台宿主机,宿主机挂了数据就会丢失。所以K8S还提供了真正的持久化存储的技术,将数据挂载到其他专门用于存储数据的服务器上,这样即使宿主机挂了,数据还在。

PersistentVolume是为用户和管理员提供了一个API抽象的细节如何提供如何使用存储。 K8S引入了两个新的API资源:PersistentVolume(PV)、PersistentVolumeClaim(PVC)。

PersistentVolume:是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV在K8S中也是一种资源,但生命周期独立于Pod。封装了底层存储卷实现的细节。它是用来定义或配置存储的资源,市面上有很多可以作为文件服务器的工具,比如NFS、RBD、Cinder等,PV就是帮我们打通了与这些服务器的对接。

PersistentVolumeClaim:PVC是给用户申请存储空间的。 当开发者需要通过PVC去申请存储空间,可以请求特定的空间大小和访问模式,比如他们可以申请是一次读/写或多次只读等。

简单来说,PV定义了一块存储空间,Pod想要申请存储空间,就要通过PVC去申请,PVC通过访问模式与申请的空间大小去匹配PV。

使用方法

以简单的NFS共享服务器说明

  • 准备一台NFS共享服务器,配置共享的目录
  • 保证node节点可以访问到共享服务器
nfs安装

在141节点上安装NFS

[root@k8s-node1 ~]# yum -y install nfs-utils
[root@k8s-node1 ~]# systemctl restart rpcbind
[root@k8s-node1 ~]# systemctl restart nfs-server
[root@k8s-node1 ~]# ifconfig|grep 192
        inet 192.168.233.141  netmask 255.255.255.0  broadcast 192.168.233.255
[root@k8s-node1 ~]# vim /etc/exports
写入 /mnt 192.168.233.0/24(rw,sync,no_root_squash)
[root@k8s-node1 ~]# more /etc/exports
/mnt 192.168.233.0/24(rw,sync,no_root_squash)
[root@k8s-node1 ~]# systemctl restart nfs-server
[root@k8s-node1 ~]# showmount -e
Export list for k8s-node1:
/mnt 192.168.233.0/24

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
创建一个pv

mypv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /mnt
    server: 192.168.233.141
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
[root@k8s-master1 ~]# kubectl apply -f mypv.yaml 
persistentvolume/mypv created
[root@k8s-master1 ~]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mypv   1Gi        RWO            Recycle          Available           nfs                     8s
  • 1
  • 2
  • 3
  • 4
  • 5
创建一个pvc

mypvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
[root@k8s-master1 ~]# kubectl apply -f mypvc.yaml --record
persistentvolumeclaim/mypvc created
[root@k8s-master1 ~]# kubectl get pvc
NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc   Bound    mypv     1Gi        RWO            nfs            5s
  • 1
  • 2
  • 3
  • 4
  • 5
创建pod使用pvc

nginx-pvc.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-host
spec:
  containers:
  - name: host
    image: hub.bushro.com/public/nginx:1.16.1
    volumeMounts:
    - mountPath: /mymount
      name: mount-volume
  volumes:
  - name: mount-volume
    persistentVolumeClaim:
      claimName: mypvc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

验证

在141的nfs的挂载目录/mnt上面创建一个文件hello
在这里插入图片描述
在140里面进去到容器中去查看,发现容器中的/mymount目录下也有了hello这个文件。在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/364814
推荐阅读
相关标签
  

闽ICP备14008679号