欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kubernetes中的Volumes

程序员文章站 2022-05-11 17:03:56
...

为什么引入Volume

1.当container crash的时候,kubelet将会重启它,里面之前运行的数据将会丢失, 容器将以一个clean state的状态来启动.
2.运行在pod中的containers通常会共享数据. volumes的概念就是为了解决这些问题.

现状

kubernetes中的volume有完整的lifetime.在pod中可以脱离container而存在.container重启的时候, volume中的pod会被保存. pod消失的时候, volume也会消失. kubernetes支持多种volumes的类型.pod可以使用同时使用多个volume.类型如下

emptyDir 
hostPath 
gcePersistentDisk 
awsElasticBlockStore 
nfs 
iscsi 
flocker 
glusterfs 
rbd 
cephfs 
gitRepo 
secret 
persistentVolumeClaim 
downwardAPI 
projected 
azureFileVolume 
azureDisk 
vsphereVolume 
Quobyte 
PortworxVolume 
ScaleIO 

常用的存储类型

emptyDir

emptyDir卷当pod分配给Node的时候会被创建, 伴随这pod在该Node上运行整个过程. 开始的时候为空的. pod中的containers可以读写emptyDir volume中的同一个文件, 这个volume可以被挂载到容器相同或者不同的目录. 但是如果pod在该node上被removed, 那么emptyDir中的数据将会被永远的删除. 注意:如果容器crashing pod没有从node上remove. emptyDir中的volume数据是safe的.
emptyDir的使用用途

暂存空间,如基于磁盘的合并排序
检查一个长时间的计算以恢复崩溃
持有内容管理器容器在Web服务器容器提供数据时提取的文件

默认情况下,根据您的环境,emptyDir卷存储在任何介质中,可能是磁盘或SSD或网络存储。 但是,您可以将emptyDir.medium字段设置为“Memory”,以告诉Kubernetes为您安装tmpfs(RAM支持的文件系统)。 虽然tmpfs非常快,但请注意,与磁盘不同,tmpfs在机器重新启动时被清除,您写入的任何文件都会计入您的容器的内存限制
Pod的例子

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

Hostpath

hostPath卷将文件或目录从主机节点的文件系统挂载到您的pod中。 这不是大多数Pods需要的,但它为某些应用提供了强大的逃生舱。
比如, 一些使用hostPath的例子

运行需要访问Docker内部的容器; 使用/ var / lib / docker的hostPath
在容器中运行cAdvisor; 使用/ dev / cgroups的hostPath

使用的时候需要注意的
1. 具有相同配置的pod(例如从podTemplate创建的)可能因节点上的不同文件在不同节点上的行为不同
2. 当Kubernetes按计划添加资源感知调度时,它将无法解决hostPath使用的资源
3. 在底层主机上创建的目录只能由root写入。 您需要以特权容器的身份运行您的进程,或修改主机上的文件权限,以便能够写入hostPath卷

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data

gcePersistentDisk

awsElasticBlockStore

Nfs

nfs卷允许现有的NFS(网络文件系统)共享挂载到您的pod中。 不同于在删除Pod时被清除的emptyDir,nfs卷的内容将被保留,并且卷仅被卸载。 这意味着NFS卷可以预先填充数据,并且该数据可以在pod之间“切换”。 NFS可以同时由多个写入器安装。
nfs例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/nfs

iSCSI

iscsi卷允许将现有iSCSI(基于IP的SCSI)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,将保留iscsi卷的内容,并且该卷仅被卸载。 这意味着可以使用数据预先填充一个iscsi卷,并且该数据可以在pod之间“切换”。

iSCSI的一个特点是它可以同时由多个消费者以只读方式安装。 这意味着您可以使用数据集预先填充卷,然后根据需要从多个pod中并行提供。 不幸的是,iSCSI卷只能由读写模式的单个消费者进行装载 – 不允许同时写入
iSCSI例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/iscsi

flocker

Flocker是一个开源的集群容器数据卷管理器。 它提供由各种存储后端支持的数据卷的管理和编排。

Flocker卷允许将Flocker数据集挂载到pod中。 如果Flocker中尚未存在数据集,则需要首先使用Flocker CLI或使用Flocker API创建数据集。 如果数据集已经存在,它将被Flocker重新连接到调度盒的节点。 这意味着数据可以根据需要在pod之间“切换”。
flocker例子

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/flocker

glusterfs

glusterfs卷允许将Glusterfs(开源网络文件系统)卷安装到您的pod中。 不同于在删除Pod时被清除的emptyDir,保留了一个glusterfs卷的内容,并且该卷只是被卸载。 这意味着可以使用数据预先填充一个glusterfs卷,并且该数据可以在pod之间“切换”。 GlusterFS可以同时由多个写入器安装。

Rbd

cephfs

gitRepo

secret

秘密卷用于将敏感信息(如密码)传递给pod。 您可以将秘密存储在Kubernetes API中,并将其作为文件安装在pod上,而不直接与Kubernetes连接。 秘密卷由tmpfs(RAM支持的文件系统)支持,因此它们永远不会写入非易失性存储。

PersistentVolumeClaim

persistentVolumeClaim卷用于将PersistentVolume安装到pod中。 PersistentVolumes是用户在不知道特定云环境的细节的情况下“声称”持久存储(如GCE PersistentDisk或iSCSI卷)的一种方式

downwardAPI

一个向下的API卷被用于使向下的API数据可用于应用程序。 它安装一个目录,并将所请求的数据写入纯文本文件。

https://kubernetes.io/docs/tasks/configure-pod-container/downward-api-volume-expose-pod-information/

projected

A projected volume可以映射很多volume源到相同的目录下, 当前, 下面类型的volume sources支持的有

secret
downwardAPI
configMap

例子

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: my-group/my-username
      - downwardAPI:
          items:
            - path: "labels"
              fieldRef:
                fieldPath: metadata.labels
            - path: "cpu_limit"
              resourceFieldRef:
                containerName: container-test
                resource: limits.cpu
      - configMap:
          name: myconfigmap
          items:
            - key: config
              path: my-group/my-config

SubPath

有时,在一个pod*享一个卷用于多个用途是有用的。 volumeMounts.subPath属性可用于指定引用卷而不是根的子路径。
例子-下面是一个LAMP stack的例子,Html内容映射到html文件目录下, databases存储在mysql文件目录下:

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data
相关标签: kubernetes cloud