Kubernetes Volume 完整实战:PV/PVC、存储卷类型与持久化存储全解析
- Kubernetes Volume
-
- 环境准备
- Volume 类型
- emptyDir
- hostPath
- NFS 存储
- 持久性存储
-
- PV 和 PVC 架构
- 创建 PV 和 PVC
-
- 创建 PV
- 创建 PVC
- 创建Pod使用PV
- PV accessModes
- PV volumeModes
- PVC与PV匹配规则
- PV 回收策略
-
- Retain(保留)
- Recycle(回收)
- Delete(删除)
- 思考
- PV 卷的类型
- 原始块卷支持
- 环境清理
Kubernetes Volume
摘要: 本文全面介绍了 Kubernetes 中的 Volume(卷)概念与实践。首先概述了 Kubernetes 支持的各种 Volume 类型,包括 emptyDir、hostPath、NFS 等,并通过具体实验演示了它们的使用方法和特性。重点深入讲解了持久性存储架构,详细解析了 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)的工作原理、创建流程、匹配规则以及回收策略(Retain、Recycle、Delete)。文章还涵盖了 PV 的访问模式(accessModes)、卷模式(volumeModes)以及原始块卷支持等高级特性,通过丰富的 YAML 配置示例和命令行操作,帮助读者全面掌握 Kubernetes 存储管理的核心知识。
学习参考:卷
环境准备
root@master30:~# kubectl create ns storage
root@master30:~# kubectl config set-context –current –namespace storage
Volume 类型
Kubernetes支持Volume类型有:
- emptyDir
- hostPath
- gcePersistentDisk
- awsElasticBlockStore
- nfs
- iscsi
- fc (fibre channel)
- flocker
- glusterfs
- rbd
- cephfs
- gitRepo
- secret
- persistentVolumeClaim
- downwardAPI
- projected
- azureFileVolume
- azureDisk
- vsphereVolume
- Quobyte
- PortworxVolume
- ScaleIO
- StorageOS
- local
emptyDir
默认情况下,当Pod分配到Node上时,将会创建emptyDir,只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。
**实验:**准备一个包含2个容器的pod,使用emptyDir。
root@master30:~# vim pod-with-emptyDir.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
volumes:
– name: datavolume
emptyDir: {}
containers:
– name: busybox1
image: hub.laoma.cloud/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
volumeMounts:
– mountPath: /data
name: datavolume
– name: busybox2
image: hub.laoma.cloud/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
volumeMounts:
– mountPath: /data
name: datavolume
配置说明:
-
spec.volumes:定义卷,是默认卷类型。
-
spec.containers.volumeMounts:引用卷
# 创建pod
root@master30:~# kubectl apply -f pod-with-emptyDir.yaml
pod/busybox created
# 获取容器ID
root@master30:~# kubectl describe pod busybox |egrep -o 'Container ID.*//.{12}'
Container ID: containerd://07d189383321
Container ID: containerd://bb02c680ca8a
# 获取容器所在节点
root@master30:~# kubectl describe pod busybox |grep Node:
Node: worker32.laoma.cloud/10.1.8.32
# 登录到node查看容器挂载情况
root@worker32:~# crictl inspect 07d189383321|grep datavolume
"hostPath": "/var/lib/kubelet/pods/8417656f-4b6c-4b2a-a2f3-f4a248c4c043/volumes/kubernetes.io~empty-dir/datavolume",
"host_path": "/var/lib/kubelet/pods/8417656f-4b6c-4b2a-a2f3-f4a248c4c043/volumes/kubernetes.io~empty-dir/datavolume"
"source": "/var/lib/kubelet/pods/8417656f-4b6c-4b2a-a2f3-f4a248c4c043/volumes/kubernetes.io~empty-dir/datavolume",
# 创建数据
root@master30:~# kubectl exec busybox -c busybox1 — touch /data/b1-f1
root@master30:~# kubectl exec busybox -c busybox2 — ls /data
b1-f1
# node上查看数据
root@worker32:~# ls /var/lib/kubelet/pods/8417656f-4b6c-4b2a-a2f3-f4a248c4c043/volumes/kubernetes.io~empty-dir/datavolume
b1-f1
# 删除pod,验证emptyDir
root@master30:~# kubectl delete pod busybox –force
root@worker32:~# ls /var/lib/kubelet/pods/8417656f-4b6c-4b2a-a2f3-f4a248c4c043/volumes/kubernetes.io~empty-dir/datavolume
ls: cannot access '/var/lib/kubelet/pods/8417656f-4b6c-4b2a-a2f3-f4a248c4c043/volumes/kubernetes.io~empty-dir/datavolume': No such file or directory
# 容器删除后,需要等待一些时间,临时卷数据等待才会删除。
hostPath
hostPath允许Pod将Node的文件系统中某个目录挂载到Pod内部。pod删除后,hostPath卷数据保留。
**实验:**准备一个pod,使用hostPath。
root@master30:~# vim pod-with-hostPath.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
volumes:
– name: datavolume
hostPath:
path: /busyboxdir
containers:
– name: busybox1
image: hub.laoma.cloud/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
volumeMounts:
– mountPath: /data
name: datavolume
– name: busybox2
image: hub.laoma.cloud/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
volumeMounts:
– mountPath: /data
name: datavolume
# 设置readOnly,控制读写,默认值是false,也就是读写访问。
readOnly: true
# 创建pod
root@master30:~# kubectl apply -f pod-with-hostPath.yaml
pod/busybox created
# 获取容器ID
root@master30:~# kubectl describe pod busybox |egrep -o 'Container ID.*//.{12}'
Container ID: containerd://318922d0c666
Container ID: containerd://0688146babe5
# 获取容器所在节点
root@master30:~# kubectl describe pod busybox |grep Node:
Node: worker32.laoma.cloud/10.1.8.32
# 登录到worker31查看容器挂载情况
root@worker32:~# crictl inspect 318922d0c666|grep busyboxdir
"hostPath": "/busyboxdir",
"host_path": "/busyboxdir"
"source": "/busyboxdir",
# 创建数据
root@master30:~# kubectl exec busybox -c busybox1 — touch /data/b1-f1
root@master30:~# kubectl exec busybox -c busybox2 — ls /data
b1-f1
root@master30:~# kubectl exec busybox -c busybox2 — touch /data/b2-f2
touch: /data/b2-f2: Read-only file system
# node上查看数据
root@worker32:~# ls /busyboxdir/
b1-f1
# 删除pod,验证hostPath
root@master30:~# kubectl delete pod busybox –force
root@worker32:~# ls /busyboxdir/
b1-f1
# pod删除后,hostPath卷数据保留。
NFS 存储
NFS卷,将数据存储在NFS共享中。
准备NFS共享
# 安装 NFS server
root@master30:~# apt install -y nfs-kernel-server
# 安创建NFS目录 修改创建文件夹的权限
root@master30:~# mkdir -m 777 /nfsshares
root@master30:~# echo hello laoma > /nfsshares/index.html
# 配置共享,允许所有客户端访问
root@master30:~# cat << EOF > /etc/exports
/nfsshares *(rw)
EOF
# 重启 nfs server
root@master30:~# systemctl restart nfs-server.service
# 客户端安装
root@worker31:~# apt install -y nfs-common
root@worker32:~# apt install -y nfs-common
准备 pod
root@master30:~# vim pod-with-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: nginx
name: nginx
spec:
volumes:
– name: nfs
nfs:
server: 10.1.8.30
path: "/nfsshares"
containers:
– image: hub.laoma.cloud/library/nginx
name: nginx
volumeMounts:
– name: nfs
mountPath: "/usr/share/nginx/html"
# 创建pod
root@master30:~# kubectl apply -f pod-with-nfs.yaml
pod/nginx created
# 获取容器ID
root@master30:~# kubectl describe pod nginx |egrep -o 'Container ID.*//.{12}'
Container ID: containerd://c5e734dab9b5
# 获取容器所在节点
root@master30:~# kubectl describe pod nginx |grep Node:
Node: worker32.laoma.cloud/10.1.8.32
# 登录到worker31查看容器挂载情况
root@worker32:~# crictl inspect c5e734dab9b5| grep -e nfs -e html
"containerPath": "/usr/share/nginx/html",
"hostPath": "/var/lib/kubelet/pods/b5bd3f1a-3ef4-4327-95ff-61352268ee41/volumes/kubernetes.io~nfs/nfs",
"container_path": "/usr/share/nginx/html",
"host_path": "/var/lib/kubelet/pods/b5bd3f1a-3ef4-4327-95ff-61352268ee41/volumes/kubernetes.io~nfs/nfs"
"destination": "/usr/share/nginx/html",
"source": "/var/lib/kubelet/pods/b5bd3f1a-3ef4-4327-95ff-61352268ee41/volumes/kubernetes.io~nfs/nfs",
root@worker32:~# df|grep nfsshare
10.1.8.30:/nfsshares 101590016 6659072 89723904 7% /var/lib/kubelet/pods/b5bd3f1a-3ef4-4327-95ff-61352268ee41/volumes/kubernetes.io~nfs/nfs
# 访问容器
root@master30:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 5m19s 10.224.51.171 worker32.laoma.cloud <none> <none>
root@master30:~# curl 10.224.51.171
hello laoma
# 创建数据
root@master30:~# kubectl exec nginx — ls /usr/share/nginx/html
index.html
root@master30:~# kubectl exec nginx — touch /usr/share/nginx/html/test.html
root@master30:~# ls /nfsshares
index.html test.html
# 删除pod,验证nfs卷数据
root@master30:~# kubectl delete pod nginx –force
pod "nginx" deleted
root@master30:~# ls /nfsshares
index.html test.html
# pod删除后,nfs卷数据保留。
持久性存储
学习参考:持久卷
Kubernetes 使用 persistent volume(PV)架构为集群提供永久存储。
PV 和 PVC 架构
开发人员不知道特定云环境的细节的情况下,只需要使用persistentVolumeClaim(PVC)请求PV资源,实现持久化存储。
-
Persistent Volume,由PersistentVolume API对象定义,代表集群中现有存储。PV的生命周期与使用其的pod无关。Persistent Volume 是集群级别资源。
-
Persistent Volume Claim,由PersistentVolumeClaim API对象定义,代表开发人员请求PV。Persistent Volume Claim 是 namespace 级别资源。
创建 PV 和 PVC
创建 PV
集群管理员可以创建任意数量PV,取决于后端存储。
为了方便演示,我们这里使用NFS后端存储。
pv文件示例:
root@master30:~# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
– ReadWriteOnce
nfs:
path: /nfsshares
server: 10.1.8.30
root@master30:~# kubectl apply -f pv.yaml
root@master30:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
web 5Gi RWO Recycle Available 3s
创建 PVC
用户创建PVC,pod使用PVC申请特定容量、特定modes和特定存储类别的存储。master监控PVCs,查找匹配的PV或者等待后端存储创建相应PV,然后绑定PV和PVC。
pvc示例:
root@master30:~# vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webclaim
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 5Gi
root@master30:~# kubectl apply -f pvc.yaml
root@master30:~# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
webclaim Bound web 5Gi RWO 4s
创建Pod使用PV
root@master30:~# vim pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
name: web
spec:
containers:
– image: hub.laoma.cloud/library/nginx
name: web
ports:
– containerPort: 80
name: web–port
volumeMounts:
– name: web–persistent–storage
mountPath: /usr/share/nginx/html
volumes:
– name: web–persistent–storage
persistentVolumeClaim:
claimName: webclaim
root@master30:~# kubectl apply -f pod-with-pvc.yaml
pod/web created
root@master30:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 0 35s 10.224.193.69 worker32.laoma.cloud <none> <none>
# 测试:访问pod web页面
root@master30:~# curl http://10.224.193.69
hello laoma
root@master30:~# echo test > /nfsshares/test.html
root@master30:~# curl http://10.224.193.69/test.html
test
# 删除pod
root@master30:~# kubectl delete pod web –force
PV accessModes
PersistentVolume 卷访问模式有:
-
ReadWriteOnce,卷可以被一个节点以读写方式挂载,也允许同一节点上的多个 Pod 读写访问卷。
-
ReadOnlyMany,卷可以被多个节点以只读方式挂载。
-
ReadWriteMany,卷可以被多个节点以读写方式挂载。
-
ReadWriteOncePod,卷可以被单个 Pod 以读写方式挂载。 如果你想确保整个集群中只有一个 Pod 可以读取或写入该 PVC, 请使用 ReadWriteOncePod 访问模式。这只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本。
这篇博客文章 Introducing Single Pod Access Mode for PersistentVolumes 描述了更详细的内容。
在命令行接口(CLI)中,访问模式也使用以下缩写形式:
- RWO – ReadWriteOnce
- ROX – ReadOnlyMany
- RWX – ReadWriteMany
- RWOP – ReadWriteOncePod
不同存储后端支持不同的模式:
| AzureFile | ✓ | ✓ | ✓ | – |
| CephFS | ✓ | ✓ | ✓ | – |
| CSI | 取决于驱动 | 取决于驱动 | 取决于驱动 | 取决于驱动 |
| FC | ✓ | ✓ | – | – |
| FlexVolume | ✓ | ✓ | 取决于驱动 | – |
| GCEPersistentDisk | ✓ | ✓ | – | – |
| Glusterfs | ✓ | ✓ | ✓ | – |
| HostPath | ✓ | – | – | – |
| iSCSI | ✓ | ✓ | – | – |
| NFS | ✓ | ✓ | ✓ | – |
| RBD | ✓ | ✓ | – | – |
| VsphereVolume | ✓ | – | -(Pod 运行于同一节点上时可行) | – |
| PortworxVolume | ✓ | – | ✓ | – |
重要: 每个卷同一时刻只能以一种访问模式挂载,即使该卷能够支持多种访问模式。 例如,一个 GCEPersistentDisk 卷可以被某节点以 ReadWriteOnce 模式挂载,或者被多个节点以 ReadOnlyMany 模式挂载,但不可以同时以两种模式挂载。
常见的NAS存储都支持三种存储模式:ReadWriteOnce、ReadOnlyMany、ReadWriteMany。
PV volumeModes
特性状态: Kubernetes v1.18 [stable]
针对 PV 持久卷,Kubernetes 支持两种卷模式(volumeModes):Filesystem(文件系统) 和 Block(块)。 volumeMode 是一个可选的 API 参数。 如果该参数被省略,默认的卷模式是 Filesystem。
-
Filesystem 卷,会被 Pod 挂载(Mount) 到某个目录。 如果卷的存储来自某块设备而该设备目前为空,Kuberneretes 会在第一次挂载卷之前在设备上创建文件系统。
-
Block 卷,会被作为原始块设备来使用。 这类卷以块设备的方式交给 Pod 使用,其上没有任何文件系统。 这种模式对于为 Pod 提供一种使用最快可能方式来访问卷而言很有帮助, Pod 和卷之间不存在文件系统层。另外,Pod 中运行的应用必须知道如何处理原始块设备。 关于如何在 Pod 中使用 volumeMode: Block 的卷, 可参阅原始块卷支持。
PVC与PV匹配规则
-
PV的mode必须高于PVC申请的最低要求:mode 优先级,可简单理解为ROX<RWO<RWX。例如,用户请求RWO模式PV,但是目前只有NFS PV(RWO+ROX+RWX),PVC将匹配NFS。
-
容量满足最低要求:具有相同modes卷会被分组,然后根据size分类(由小到大)。
-
pv storage classes:用于对pv进行分类,pvc可以根据storageClassName参数申请特定类型pv。如果pv设置了storageClassName,那么 pvc 申请资源的时候也要指定storageClassName。例如,storageClassName指定为 ns1-storage,ns1中pvc申请也指定storageClassName为ns1-storage。
PV 回收策略
当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除, 从而允许该资源被回收再利用。PersistentVolume 对象的回收策略告诉集群, 当其被从申领中释放时如何处理该数据卷。
PersistentVolume 回收策略支持:Retain(保留)、Recycle(回收)、Delete(删除)。
Retain(保留)
回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim 对象被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为"已释放(released)"。 由于卷上仍然保留上一次关联的pvc信息,清理掉上一次关联的pvc信息才可分配给其他pvc。Retain(保留)策略是默认策略。
示例:
root@master30:~# vim pv-pvc-Retain.yaml
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: web
spec:
capacity:
storage: 5Gi
#persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
accessModes:
– ReadWriteOnce
nfs:
path: /nfsshares
server: 10.1.8.30
—
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webclaim
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 5Gi
root@master30:~# kubectl apply -f pv-pvc-Retain.yaml
root@master30:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
web 5Gi RWO Retain Bound default/webclaim 22s
root@master30:~# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
webclaim Bound web 5Gi RWO 23s
删除 pvc 验证
root@master30:~# kubectl delete pvc webclaim
root@master30:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
web 5Gi RWO Retain Released default/webclaim 3m4s
# 创建新pvc,无法绑定
root@master30:~# vim pvc-db.yaml
—
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dbclaim
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 5Gi
root@master30:~# kubectl apply -f pvc-db.yaml
root@master30:~# kubectl get pvc dbclaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
dbclaim Pending 11s
# 手动清理卷上claimRef信息,删除claimRef部分
root@master30:~# kubectl edit pv web
……
spec:
accessModes:
– ReadWriteOnce
capacity:
storage: 5Gi
# 删除claimRef部分
# claimRef:
# apiVersion: v1
# kind: PersistentVolumeClaim
# name: webclaim
# namespace: test
# resourceVersion: "112157"
# uid: 0839cdc1-81bb-11e9-9ca8-52540000fa0a
# 删除claimRef部分
nfs:
path: /web
server: 10.1.8.30
……
# dbclaim 绑定成功
root@master30:~# kubectl get pvc dbclaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
dbclaim Bound web 5Gi RWO 3m49s
清理环境
root@master30:~# kubectl delete pvc dbclaim
root@master30:~# kubectl delete pv web
root@master30:~# ls /nfsshares/
index.html test.html
**注意:**删除pv,并不会删除后端存储中数据。
Recycle(回收)
**警告:**回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态制备。
Recycle(回收)策略的效果与 Retaine(保留)一致。
Delete(删除)
对于支持 Delete 回收策略的卷插件,删除动作会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会从外部基础设施(如 AWS EBS 或 GCE PD 卷)中移除所关联的存储资产。
示例:
root@master30:~# vim pv-pvc-Delete.yaml
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: web
spec:
capacity:
storage: 5Gi
persistentVolumeReclaimPolicy: Delete
volumeMode: Filesystem
accessModes:
– ReadWriteOnce
nfs:
path: /nfsshares
server: 10.1.8.30
—
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webclaim
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 5Gi
root@master30:~# kubectl apply -f pv-pvc-Delete.yaml
root@master30:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
web 5Gi RWO Retain Bound default/webclaim 22s
root@master30:~# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
webclaim Bound web 5Gi RWO 23s
删除 pvc 验证
root@master30:~# kubectl delete pvc webclaim
root@master30:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
web 5Gi RWO Retain Released default/webclaim 3m4s
# pv
root@master30:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
web 5Gi RWO Delete Failed default/webclaim 33s
root@master30:~# kubectl describe pv web
......
Events:
Type Reason Age From Message
—- —— —- —- ——-
Warning VolumeFailedDelete 50s persistentvolume-controller error getting deleter volume plugin for volume "web": no deletable volume plugin matched
kubernetes提示信息为Error getting deleter volume plugin for volume "web": no deletable volume plugin matched,也就是未找到删除插件,所以无法删除。
此时我们可以手动删除pv,手动删除pv,并不会删除后端存储数据。
思考
问题:如何创建一个只能绑定给特定pvc的pv?
答案:在定义pv的时候,指定claimRef属性。
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: web
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
– ReadWriteOnce
nfs:
path: /nfsshares
server: 10.1.8.30
claimRef:
name: webclaim
namespace: test
PV 卷的类型
PV 持久卷是用插件的形式来实现的。Kubernetes 目前支持以下插件:
- csi – 容器存储接口 (CSI)
- fc – Fibre Channel (FC) 存储
- hostPath – HostPath 卷 (仅供单节点测试使用;不适用于多节点集群;请尝试使用 local 卷作为替代)
- iscsi – iSCSI (SCSI over IP) 存储
- local – 节点上挂载的本地存储设备
- nfs – 网络文件系统 (NFS) 存储
以下的持久卷已被弃用。这意味着当前仍是支持的,但是 Kubernetes 将来的发行版会将其移除。
- azureFile – Azure File (于 v1.21 弃用)
- flexVolume – FlexVolume (于 v1.23 弃用)
- gcePersistentDisk – GCE Persistent Disk (于 v1.17 弃用)
- portworxVolume – Portworx 卷 (于 v1.25 弃用)
- vsphereVolume – vSphere VMDK 卷 (于 v1.19 弃用)
- cephfs – CephFS 卷 (于 v1.28 弃用)
- rbd – Rados Block Device (RBD) 卷 (于 v1.28 弃用)
旧版本的 Kubernetes 仍支持这些“树内(In-Tree)”持久卷类型:
- awsElasticBlockStore – AWS Elastic Block Store (EBS) (v1.27 开始不可用)
- azureDisk – Azure Disk (v1.27 开始不可用)
- cinder – Cinder (OpenStack block storage) (v1.27 开始不可用)
- photonPersistentDisk – Photon 控制器持久化盘。(从 v1.15 版本开始将不可用)
- scaleIO – ScaleIO 卷(v1.21 之后不可用)
- flocker – Flocker 存储 (v1.25 之后不可用)
- quobyte – Quobyte 卷 (v1.25 之后不可用)
- storageos – StorageOS 卷 (v1.25 之后不可用)
原始块卷支持
特性状态: Kubernetes v1.18 [stable]
以下卷插件支持原始块卷,包括其动态制备(如果支持的话)的卷:
- CSI
- FC(光纤通道)
- GCEPersistentDisk(已弃用)
- iSCSI
- Local 卷
- OpenStack Cinder
- RBD(已弃用)
- RBD(Ceph 块设备,已弃用)
- VsphereVolume
pv示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: block–pv
spec:
capacity:
storage: 10Gi
accessModes:
– ReadWriteOnce
volumeMode: Block
persistentVolumeReclaimPolicy: Retain
fc:
targetWWNs: ["50060e801049cfd1"]
lun: 0
readOnly: false
pvc示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: block–pvc
spec:
accessModes:
– ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 10Gi
pod示例
apiVersion: v1
kind: Pod
metadata:
name: pod–with–block–volume
spec:
containers:
– name: fc–container
image: fedora:26
command: ["/bin/sh", "-c"]
args: [ "tail -f /dev/null" ]
volumeDevices:
– name: data
devicePath: /dev/xvda
volumes:
– name: data
persistentVolumeClaim:
claimName: block–pvc
**说明:**向 Pod 中添加原始块设备时,你要在容器内设置设备路径而不是挂载路径。
环境清理
root@master30:~# kubectl delete ns storage
网硕互联帮助中心

评论前必须登录!
注册