- Kubernetes 教程
- Kubernetes - 首页
- Kubernetes - 概览
- Kubernetes - 架构
- Kubernetes - 设置
- Kubernetes - 镜像
- Kubernetes - 作业
- Kubernetes - 标签和选择器
- Kubernetes - 命名空间
- Kubernetes - 节点
- Kubernetes - 服务
- Kubernetes - Pod
- Kubernetes - 复制控制器
- Kubernetes - 副本集
- Kubernetes - 部署
- Kubernetes - 卷
- Kubernetes - 密钥
- Kubernetes - 网络策略
- 高级 Kubernetes
- Kubernetes - API
- Kubernetes - Kubectl
- Kubernetes - Kubectl 命令
- Kubernetes - 创建应用程序
- Kubernetes - 应用程序部署
- Kubernetes - 自动扩展
- Kubernetes - 仪表盘设置
- Kubernetes - 监控
- Kubernetes 有用资源
- Kubernetes - 快速指南
- Kubernetes - 有用资源
- Kubernetes - 讨论
Kubernetes - 卷
在 Kubernetes 中,卷可以被认为是一个目录,Pod 中的容器可以访问该目录。Kubernetes 中有不同类型的卷,并且类型定义了卷是如何创建的以及其内容。
卷的概念在 Docker 中就已经存在,但唯一的问题是卷非常局限于特定的 Pod。一旦 Pod 的生命周期结束,卷也会丢失。
另一方面,通过 Kubernetes 创建的卷不受任何容器的限制。它支持 Pod 内部署的任何或所有容器。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) Elastic Block Store 挂载到 Pod 中。与 gcePersistentDisk 一样,当 Pod 从节点中移除时,awsElasticBlockStore 中的数据保持不变。
nfs - nfs 卷允许将现有的 NFS(网络文件系统)挂载到 Pod 中。当 Pod 从节点中移除时,nfs 卷中的数据不会被擦除。卷仅被卸载。
iscsi - iscsi 卷允许将现有的 iSCSI(IP 上的 SCSI)卷挂载到 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 中。PersistentVolume 是一种允许用户“声明”持久性存储(例如 GCE 持久性磁盘或 iSCSI 卷)而不必了解特定云环境的详细信息的方法。
downwardAPI - downwardAPI 卷用于使下行 API 数据可供应用程序使用。它挂载一个目录并在纯文本文件中写入请求的数据。
azureDiskVolume - AzureDiskVolume 用于将 Microsoft Azure 数据磁盘挂载到 Pod 中。
持久卷和持久卷声明
持久卷 (PV) - 它是由管理员预配的一块网络存储。它是集群中的一个资源,独立于使用 PV 的任何单个 Pod。
持久卷声明 (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 文件用于创建持久卷。
name: pv0001 → 我们要创建的持久卷的名称。
capacity: → 此规范将定义我们尝试创建的 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 → 它指示底层基础架构我们正在尝试声明指定数量的空间。
name: 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
描述 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: → 这是将在其中进行挂载的容器中的路径。
Volume: → 此定义定义了我们将要声明的卷定义。
persistentVolumeClaim: → 在此之下,我们定义了将在定义的 Pod 中使用的卷名称。