Kubernetes 卷
在 Kubernetes 中,卷可以被认为是 pod 中的容器可以访问的目录。我们在 Kubernetes 中有不同类型的卷,类型定义了卷的创建方式及其内容。
体积的概念在 Docker 中出现,但唯一的问题是体积非常受限于特定的 pod。 Pod 的生命周期一结束,音量也随之丢失。
另一方面,通过 Kubernetes 创建的卷不限于任何容器。它支持部署在 Kubernetes 的 pod 内的任何或所有容器。 Kubernetes 卷的一个关键优势是,它支持不同类型的存储,其中 pod 可以同时使用多个存储。
Kubernetes 卷的类型
以下是一些流行的 Kubernetes Volumes 列表-
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 卷挂载到您的 pod 中。
rbd-RBD 代表 Rados 块设备。 rbd 卷允许将 Rados 块设备卷安装到您的 Pod 中。从节点中删除 Pod 后,数据仍会保留。
cephfs-cephfs 卷允许将现有的 CephFS 卷挂载到您的 pod 中。从节点中删除 Pod 后,数据保持不变。
gitRepo-gitRepo 卷挂载一个空目录并将 git 存储库克隆到其中以供 pod 使用。
secret-secret 卷用于将敏感信息(例如密码)传递给 Pod。
persistentVolumeClaim-persistentVolumeClaim 卷用于将 PersistentVolume 挂载到 Pod 中。 PersistentVolumes 是用户在不知道特定云环境的详细信息的情况下"声明"持久存储(例如 GCE PersistentDisk 或 iSCSI 卷)的一种方式。
downwardAPI-downwardAPI 卷用于向应用程序提供向下的 API 数据。它挂载一个目录并将请求的数据写入纯文本文件。
azureDiskVolume-AzureDiskVolume 用于将 Microsoft Azure 数据磁盘装入 Pod。
持久卷和持久卷声明
Persistent Volume (PV)-这是一个由管理员配置的网络存储。它是集群中的一种资源,独立于使用 PV 的任何单个 Pod。
Persistent Volume Claim (PVC)-Kubernetes 为其 Pod 请求的存储称为 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
在上面的代码中,我们定义了-
kind: PersistentVolume → 我们将 kind 定义为 PersistentVolume,它告诉 kubernetes 正在使用的 yaml 文件用于创建 Persistent Volume。
名称:pv0001 → 我们正在创建的 PersistentVolume 的名称。
容量: → 此规范将定义我们尝试创建的 PV 容量。
storage: 10Gi → 这告诉底层基础设施我们正试图在定义的路径上声明 10Gi 空间。
ReadWriteOnce → 这告诉我们正在创建的卷的访问权限。
path: "/tmp/data01" → 这个定义告诉机器我们正试图在底层基础设施上的这个路径下创建卷。
创建 PV
$ kubectl create –f local-01.yaml
persistentvolume "pv0001" created
检查 PV
$ kubectl get pv
NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE
pv0001 10Gi RWO Available 14s
描述PV
$ kubectl describe pv pv0001
创建持久卷声明
kind: PersistentVolumeClaim--------------> 1
apiVersion: v1
metadata:
name: myclaim-1--------------------> 2
spec:
accessModes:
-ReadWriteOnce------------------------> 3
resources:
requests:
storage: 3Gi---------------------> 4
在上面的代码中,我们定义了-
kind:PersistentVolumeClaim → 它指示底层基础架构我们正在尝试申请指定数量的空间。
名称:myclaim-1 → 我们尝试创建的声明的名称。
ReadWriteOnce → 这指定了我们尝试创建的声明的模式。
storage: 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
描述聚氯乙烯
$ kubectl describe pv pv0001
在 POD 中使用 PV 和 PVC
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: → 这是容器中将发生安装的路径。
Volume: → 这个定义定义了我们要声明的体积定义。
persistentVolumeClaim: → 在此之下,我们定义将在定义的 pod 中使用的卷名称。