k8s的存储(volume卷使用)

1、Volumes
容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个Pod中同时运行多个容器时,常常需要在这些容器之间共享文件。Kubernetes抽象出Volume对象来解决这两个问题。

2、背景
Kubernetes卷具有明确的生命周期——与包裹它的 Pod 相同。 因此,卷比Pod中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。当然,当一个Pod不再存在时,卷也将不再存在。也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录。 特定的卷类型可以决定这个目录如何形成的,并能决定它支持何种介质,以及目录中存放什么内容。使用卷时, Pod声明中需要提供卷的类型 (.spec.volumes字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).容器中的进程能看到由它们的Docker镜像和卷组成的文件系统视图。Docker镜像位于文件系统层次结构的根部,并且任何Volume都挂载在镜像内的指定路径上。卷不能挂载到其他卷,也不能与其他卷有硬链接。Pod 中的每个容器必须独立地指定每个卷的挂载位置。

3、Volume的类型
Kubernetes支持下列类型的卷:
awsElasticBlockStore、azureDisk、azureFile、cephfs、cinder、configMap、csi、downwardAPI、emptyDir、fc (fibre channel)、flexVolume、flockegcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath、iscsi、local、nfs、persistentVolumeClaim、projected、portworxVolume、quobyte、rbd、scaleIO、secret、storageos、vsphereVolume

4、emptyDir
当Pod指定到某个节点上时,首先创建的是一个emptyDir卷,并且只要Pod在该节点上运行,卷就一直存在。就像它的名称表示的那样,卷最初是空的。尽管Pod中的容器挂载emptyDir卷的路径可能相同也可能不同,但是这些容器都可以读写emptyDir卷中相同的文件。当Pod因为某些原因被从节点上删除时,emptyDir卷中的数据也会永久删除。

注意:
容器崩溃并不会导致Pod被从节点上移除,因此容器崩溃时 emptyDir卷中的数据是安全的。

emptyDir的一些用途:
1)缓存空间,例如基于磁盘的归并排序。
2)为耗时较长的计算任务提供检查点,以使任务能从崩溃前状态恢复执。
3)在Web服务器容器服务数据时,保存内容管理器容器获取的文件。

默认情况下,emptyDir卷存储在支持该节点所使用的介质上;这介质可以是磁盘或SSD或网络存储,这取决于环境。 [root@k8smaster test]# more emptydir.yaml   #文件共享,pod消亡后,生成的共享文件也会消亡
apiVersion: v1
kind: Pod
metadata:
  name: emptydir-pod
spec:
  containers:
  - name: emptydir-pod-ctn
    image: 192.168.23.100:5000/tomcat:v2
    volumeMounts:
    - mountPath: /tmp/cache/tomcat
      name: myemptydir
  - name: emptydir-pod-ctn2
    image: 192.168.23.100:5000/nginx:v1
    volumeMounts:
    - mountPath: /tmp/cache/nginx
      name: myemptydir

  volumes:
  - name: myemptydir
    emptyDir: {}
  restartPolicy: Never
[root@k8smaster test]# kubectl create -f emptydir.yaml 
pod/emptydir-pod created
[root@k8smaster test]# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
emptydir-pod   2/2     Running   0          6s
[root@k8smaster test]# 
[root@k8smaster test]# kubectl exec -it emptydir-pod -c emptydir-pod-ctn  /bin/bash
root@emptydir-pod:/usr/local/tomcat# cd /tmp/cache/tomcat/
root@emptydir-pod:/tmp/cache/tomcat# echo "tomcat" >tomcat.log
root@emptydir-pod:/tmp/cache/tomcat# more tomcat.log 
tomcat
root@emptydir-pod:/tmp/cache/tomcat# exit
exit
[root@k8smaster test]# kubectl exec -it emptydir-pod -c emptydir-pod-ctn2  /bin/bash
root@emptydir-pod:/# cd /tmp/cache/nginx/
root@emptydir-pod:/tmp/cache/nginx# ls -lrt
total 4
-rw-r--r-- 1 root root 7 Feb 18 19:40 tomcat.log
root@emptydir-pod:/tmp/cache/nginx# more tomcat.log 
tomcat

root@emptydir-pod:/tmp/cache/nginx# 

5、hostPath
hostPath卷能将主机节点文件系统上的文件或目录挂载到Pod中。虽然这不是大多数Pod需要的,但是它为一些应用程序提供了强大的逃生舱。

除了必需的path属性之外,用户可以选择性地为hostPath 卷指定type。

支持的 type 值如下:

当使用这种类型的卷时要小心,因为:
1)具有相同配置(例如从podTemplate创建)的多个Pod会由于节点上文件的不同而在不同节点上有不同的行为。
2)当Kubernetes按照计划添加资源感知的调度时,这类调度机制将无法考虑由hostPath使用的资源。
3)基础主机上创建的文件或目录只能由root用户写入。您需要在特权容器中以root身份运行进程,或者修改主机上的文件权限以便容器能够写入hostPath卷。

本地目录存在会报错:hostPath type check failed: /home/zhaiky/cache is not a directory
[root@k8smaster test]# more hostpath.yaml  #文件共享到本地盘,pod消失后,文件保存到本地
apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
  - name: hostpath-pod-ctn
    image: 192.168.23.100:5000/tomcat:v2
    volumeMounts:
    - mountPath: /tmp/cache/tomcat
      name: myhostpath
  - name: hostpath-pod-ctn2
    image: 192.168.23.100:5000/nginx:v1
    volumeMounts:
    - mountPath: /tmp/cache/nginx
      name: myhostpath
  volumes:
  - name: myhostpath
    hostPath:
      path: /home/zhaiky/cache
      type: Directory
  restartPolicy: Never
[root@k8smaster test]# kubectl create -f hostpath.yaml 
pod/hostpath-pod created
[root@k8smaster test]# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
hostpath-pod   2/2     Running   0          8s
[root@k8smaster test]# kubectl exec -it hostpath-pod -c hostpath-pod-ctn /bin/bash
root@hostpath-pod:/usr/local/tomcat# cd /tmp/cache/tomcat/
root@hostpath-pod:/tmp/cache/tomcat# ls -lrt
total 0
root@hostpath-pod:/tmp/cache/tomcat# echo "tomcat" >tomcat.log
root@hostpath-pod:/tmp/cache/tomcat# more tomcat.log 
tomcat
root@hostpath-pod:/tmp/cache/tomcat# exit
exit
[root@k8smaster test]# kubectl exec -it hostpath-pod -c hostpath-pod-ctn2 /bin/bash
root@hostpath-pod:/# cd /tmp/cache/nginx/
root@hostpath-pod:/tmp/cache/nginx# ls -lrt
total 4
-rw-r--r-- 1 root root 7 Feb 18 19:58 tomcat.log
root@hostpath-pod:/tmp/cache/nginx# echo "nginx" >nginx.log
root@hostpath-pod:/tmp/cache/nginx# ls -lrt
total 8
-rw-r--r-- 1 root root 7 Feb 18 19:58 tomcat.log
-rw-r--r-- 1 root root 6 Feb 18 19:59 nginx.log
root@hostpath-pod:/tmp/cache/nginx# exit
exit
[root@k8smaster test]# kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
hostpath-pod   2/2     Running   0          114s   10.244.2.26   k8snode02   <none>           <none>
[root@k8smaster test]# 

[root@k8snode02 cache]# ls -lrt
total 8
-rw-r--r-- 1 root root 7 Feb 19 03:58 tomcat.log
-rw-r--r-- 1 root root 6 Feb 19 03:59 nginx.log

[root@k8snode02 cache]# more tomcat.log 
tomcat
[root@k8snode02 cache]# more nginx.log 
nginx
[root@k8snode02 cache]# 

发布了60 篇原创文章 · 获赞 20 · 访问量 4605

猜你喜欢

转载自blog.csdn.net/zhaikaiyun/article/details/104479547