Kubernetes中的存储卷配置管理方式
一、Volume 概述
在 Kubernetes 中,Volume 是一种可被 Pod 中的一个或多个容器访问的共享目录。Volume 与 Pod 的生命周期解耦,这意味着即使 Pod 被删除,Volume 中的数据也不会丢失。Volume 可以用于持久化数据存储、共享数据等场景。
二、Volume 的生命周期
Volume 的生命周期可以独立于 Pod 的生命周期,这取决于 Volume 的类型:
- 非持久化 Volume(如 emptyDir):当 Pod 被删除时,emptyDir 类型的 Volume 也会被删除,其中的数据也会丢失。但是,如果 Pod 被重启(容器在同一个 Pod 内重新启动),emptyDir 中的数据会保留。
- 持久化 Volume(如 PersistentVolumeClaim,PVC):即使 Pod 被删除,如果使用了 PVC 并且关联了 PV,那么 PV 不会被自动删除(除非设置了相应的回收策略)。因此,即使 Pod 被删除,关联的 PV 中的数据仍然存在,可以在新的 Pod 中通过 PVC 重新访问这些数据。
Volume 的生命周期不会受到容器重启的影响,这使得 Volume 成为持久化数据存储的理想选择。
三、支持的卷类型
Kubernetes 支持多种类型的 Volume,每种类型适用于不同的场景:
- emptyDir:在 Pod 被分配到节点时创建,只要 Pod 在该节点上运行,卷就存在。当 Pod 被从节点上删除时,emptyDir 中的数据也会被永久删除。
- hostPath:将宿主机上的文件或目录挂载到 Pod 中。适用于需要访问宿主机文件系统的场景。
- NFS:允许将现有的 NFS 服务器上的目录挂载到 Kubernetes 中的 Pod 中。适用于需要在多个 Pod 之间共享数据的场景。
- PersistentVolumeClaim (PVC):用户对持久存储的请求,可以动态或静态地绑定到 PersistentVolume (PV) 上。
四、每种卷类型的使用场景和示例
4.1 emptyDir 卷
使用场景:
- 临时存储,例如缓存或会话数据。
- 多个容器需要共享数据时。
示例:
创建一个使用 emptyDir 的 Pod:
apiVersion: v1 # 指定 Kubernetes API 的版本
kind: Pod # 定义资源类型为 Pod
metadata: # Pod 的元数据部分
name: test-pod # 为这个 Pod 指定一个名称
spec: # Pod 的具体规格和配置
containers: # 定义 Pod 中的容器列表
- name: test-container # 为容器指定一个名称
image: busybox # 指定容器使用的镜像为 busybox
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"] # 指定容器启动后执行的命令
volumeMounts: # 定义容器需要挂载的卷
- name: data-volume # 引用在 volumes 中定义的卷名称
mountPath: /data # 指定容器内部的挂载路径
volumes: # 定义 Pod 可以使用的卷列表
- name: data-volume # 为卷指定一个名称
emptyDir: {} # 使用 emptyDir 类型的卷,它将在 Pod 所在的节点上创建一个临时目录操作步骤:
保存上述 YAML 到 test-pod.yaml 文件。
应用 YAML 文件创建 Pod:
kubectl apply -f test-pod.yaml
查看 Pod 的日志,验证 emptyDir 是否工作:
kubectl logs test-pod
预期输出:
Hello

4.2 hostPath 卷
使用场景:
需要访问宿主机上的文件或目录,例如日志文件、配置文件等。
示例:
创建一个使用 hostPath 的 Pod:
apiVersion: v1 # 指定 Kubernetes API 的版本
kind: Pod # 定义资源类型为 Pod
metadata: # Pod 的元数据
name: test-pod-hostpath # 为 Pod 指定一个名称
spec: # Pod 的具体配置
containers: # 定义 Pod 中的容器列表
- name: test-container # 为容器指定一个名称
image: busybox # 指定容器使用的镜像
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"] # 指定容器启动后执行的命令
volumeMounts: # 定义容器需要挂载的卷
- name: data-volume # 引用在 volumes 中定义的卷名称
mountPath: /data # 指定容器内部的挂载入路径
volumes: # 定义 Pod 级别的卷
- name: data-volume # 为卷指定一个名称
hostPath: # 指定卷的类型为 hostPath
path: /data # 指定宿主机上的路径,容器会将此路径挂载到 mountPath 指定的位置
type: DirectoryOrCreate # 如果指定的路径不存在,则创建目录操作步骤:
保存上述 YAML 到 test-pod-hostpath.yaml 文件。
应用 YAML 文件创建 Pod:
kubectl apply -f test-pod-hostpath.yaml
验证宿主机上的 /data 目录,查看是否创建了 hello 文件:
kubectl exec -it test-pod-hostpath -- /bin/sh cat /data/hello
预期输出:
Hello

4.3 NFS 卷
使用场景:
- 需要在多个 Pod 之间共享数据。
- 数据需要持久化存储。
示例:
假设您已经有一个 NFS 服务器,其路径为 /nfsdata。
创建一个使用 NFS 的 Pod:
apiVersion: v1
kind: Pod
metadata:
name: test-pod-nfs
spec:
containers:
- name: test-container
image: busybox
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
nfs:
server: <NFS_SERVER_IP> # NFS 服务器 IP 地址
path: /nfsdata # NFS 服务器路径操作步骤:
- 替换
<NFS_SERVER_IP>为实际的 NFS 服务器 IP 地址。 - 保存上述 YAML 到
test-pod-nfs.yaml文件。 - 应用 YAML 文件创建 Pod:
kubectl apply -f test-pod-nfs.yaml
验证 NFS 服务器上的 /nfsdata 目录,查看是否创建了 hello 文件:
kubectl exec -it test-pod-nfs -- /bin/sh cat /data/hello
预期输出:
Hello

4.4 PersistentVolumeClaim (PVC)
使用场景:
- 需要持久化存储数据。
- 数据需要在多个 Pod 之间共享。
示例:
首先,创建一个 PersistentVolume (PV):
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfsdata
server: <NFS_SERVER_IP>操作步骤:
- 替换
<NFS_SERVER_IP>为实际的 NFS 服务器 IP 地址。 - 保存上述 YAML 到
pv-nfs.yaml文件。 - 应用 YAML 文件创建 PV:
kubectl apply -f pv-nfs.yaml
接下来,创建一个 PersistentVolumeClaim (PVC):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
storageClassName: nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi操作步骤:
- 保存上述 YAML 到
pvc-nfs.yaml文件。 - 应用 YAML 文件创建 PVC:
kubectl apply -f vc-nfs.yaml
最后,创建一个使用 PVC 的 Pod:
apiVersion: v1
kind: Pod
metadata:
name: test-pod-pvc
spec:
containers:
- name: test-container
image: busybox
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: pvc-nfs操作步骤:
- 保存上述 YAML 到
test-pod-pvc.yaml文件。 - 应用 YAML 文件创建 Pod:
kubectl apply -f test-pod-pvc.yaml
- 验证 NFS 服务器上的
/nfsdata目录,查看是否创建了hello文件:
kubectl exec -it test-pod-pvc -- /bin/sh cat /data/hello
预期输出:
Hello
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
K8s准入控制Admission Controller深入介绍
本篇我们将聚焦于 kube-apiserver 请求处理过程中一个很重要的部分 -- 准入控制器(Admission Controller)深入讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪2022-04-04


最新评论