Kubernetes - Volumes

在Kubernetes中,卷可以被认为是pod中容器可以访问的目录.我们在Kubernetes中有不同类型的卷,类型定义了卷的创建方式及其内容.

卷的概念与Docker一起出现,但唯一的问题是卷非常局限于特定的吊舱.一旦pod的生命周期结束,音量也会丢失.

另一方面,通过Kubernetes创建的卷不仅限于任何容器.它支持部署在Kubernetes容器内的任何或所有容器. Kubernetes卷的一个关键优势是,它支持不同类型的存储,其中pod可以同时使用多个存储.

Kubernetes卷的类型

以下是一些流行的Kubernetes音量和减号的列表;

  • emptyDir : 它是首次将Pod分配给节点时创建的卷类型.只要Pod在该节点上运行,它就会保持活动状态.卷最初为空,并且pod中的容器可以读取和写入emptyDir卷中的文件.从节点中删除Pod后,emptyDir中的数据将被删除.

  • hostPath : 这种类型的卷将文件或目录从主机节点的文件系统安装到您的pod中.

  • gcePersistentDisk : 此类型的卷将Google Compute Engine(GCE)永久磁盘装入您的Pod.从节点中删除Pod时, gcePersistentDisk 中的数据保持不变.

  • awsElasticBlockStore :  ;此类卷将Amazon Web Services(AWS)弹性块存储装入Pod.就像 gcePersistentDisk 一样,当从节点中删除Pod时, awsElasticBlockStore 中的数据保持不变.

  • nfs :   nfs 卷允许将现有NFS(网络文件系统)安装到您的pod中.从节点中删除Pod时,不会删除 nfs 卷中的数据.该音量仅是未安装的.

  • iscsi :   iscsi 卷允许将现有的iSCSI(SCSI over IP)卷安装到您的pod中.

  • flocker : 它是一个开源的集群容器数据卷管理器.它用于管理数据卷. flocker 卷允许将Flocker数据集安装到pod中.如果Flocker中不存在数据集,那么首先需要使用Flocker API创建它.

  • glusterfs :  Glusterfs是一个开源的网络文件系统. glusterfs音量允许将glusterfs音量安装到您的吊舱中.

  • rbd :  RBD代表Rados Block Device. rbd 卷允许将Rados Block Device卷安装到您的pod中.从节点中删除Pod后,数据仍保留.

  • cephfs :   cephfs 卷允许将现有的CephFS卷安装到您的pod中.从节点中删除Pod后数据保持不变.

  • gitRepo :   gitRepo 卷安装一个空目录,并将 git 存储库克隆到其中,供您使用.

  • 秘密 :  秘密卷用于将敏感信息(如密码)传递到广告连播.

  • persistentVolumeClaim  : 去; persistentVolumeClaim 卷用于将PersistentVolume挂载到pod中. PersistentVolumes是用户在不知道特定云环境的详细信息的情况下"声称"持久存储(例如GCE PersistentDisk或iSCSI卷)的方式.

  • 向下API :  向下API 卷用于向应用程序提供向下的API数据.它挂载一个目录并以纯文本文件写入请求的数据.

  • azureDiskVolume :   AzureDiskVolume 用于将Microsoft Azure数据磁盘装入Pod.

持久卷和持久卷索赔

持续交易量(PV) : 它是管理员配置的网络存储.它是群集中的资源,独立于使用PV的任何单个pod.

持久性卷声明(PVC) :  Kubernetes要求其存储容器的存储称为PVC.用户不需要知道底层配置.声明必须在创建pod的同一命名空间中创建.

创建持久卷

kind: PersistentVolume ---------> 1
apiVersion: v1
metadata:
   name: pv0001 ------------------> 2
   labels:
      type: local
spec:
   capacity: -----------------------> 3
      storage: 10Gi ----------------------> 4
   accessModes:
      - ReadWriteOnce -------------------> 5
      hostPath:
         path: "/tmp/data01" --------------------------> 6

在上面的代码中,我们定义了 :

  • 种类:PersistentVolume → 我们已经将类型定义为PersistentVolume,它告诉kubernetes正在使用的yaml文件是创建持久卷.

  • name:pv0001 → 我们正在创建的PersistentVolume的名称.

  • 容量: → 此规范将定义我们正在尝试创建的PV容量.

  • 存储:10Gi → 这告诉底层基础设施我们试图在定义的路径上声明10Gi空间.

  • ReadWriteOnce → 这告诉我们正在创建的卷的访问权限.

  • 路径:"/tmp/data01" → 该定义告诉机器我们正在尝试在底层基础架构上的此路径下创建卷.

创建PV

 
 $ kubectl create -f local-01.yaml 
 persistentvolume"pv0001"created

检查PV

$ kubectl create –f local-01.yaml
persistentvolume "pv0001" created

描述PV

 
 $ kubectl describe pv pv0001

创建持久性卷索赔

kind: PersistentVolumeClaim --------------> 1
apiVersion: v1
metadata:
   name: myclaim-1 --------------------> 2
spec:
   accessModes:
      - ReadWriteOnce ------------------------> 3
   resources:
      requests:
         storage: 3Gi ---------------------> 4

在上面的代码中,我们定义了 :

  • 种类:PersistentVolumeClaim → 它指示我们试图声明指定空间量的底层基础架构.

  • name:myclaim-1 → 我们正在尝试创建的声明的名称.

  • ReadWriteOnce → 这指定了我们尝试创建的声明模式.

  • 存储:3Gi → 这将告诉kubernetes我们要申请的空间数量.

创建PVC

$ kubectl create –f myclaim-1
persistentvolumeclaim "myclaim-1" created

获取详细信息关于PVC

$ kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESSMODES   AGE
myclaim-1   Bound    pv0001     10Gi         RWO       7s

描述PVC

 
 $ kubectl describe pv pv0001

将PV和PVC与POD一起使用

kind: Pod
apiVersion: v1
metadata:
   name: mypod
   labels:
      name: frontendhttp
spec:
   containers:
   - name: myfrontend
      image: nginx
      ports:
      - containerPort: 80
         name: "http-server"
      volumeMounts: ----------------------------> 1
      - mountPath: "/usr/share/tomcat/html"
         name: mypd
   volumes: -----------------------> 2
      - name: mypd
         persistentVolumeClaim: ------------------------->3
         claimName: myclaim-1

在在上面的代码中,我们定义了 :

  • volumeMounts: → 这是安装将要进行安装的容器中的路径.

  • 卷: → 该定义定义了我们要声明的卷定义.

  • persistentVolumeClaim: → 在此下,我们定义将在定义的pod中使用的卷名.