HostPath 是一种持久化存储,但 HostPath 内容是存储在节点上,导致只适合读取。
如果要求 Pod 重新调度后仍然能使用之前读写过的数据,就只能使用网络存储了,网络存储种类非常多,且有不同的使用方法,常见公有云提供商有块存储、文件存储、对象存储三种。
K8s 解决这个问题的方式是抽象了PV 和 PVC 来解耦这个问题,从而让使用者不用关心具体的基础设施,当需要存储资源的时候,只要像 CPU 和内存一样,声明要多少即可。
-
PV:描述是持久化存储卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个 NFS 的挂载目录。
-
PVC:描述是 Pod 所希望使用的持久化存储的属性,比如,Volume 存储的大小、可读写权限等等。
CSI
$ kubectl get po --namespace=kube-system
NAME READY STATUS RESTARTS AGE
everest-csi-controller-6d796fb9c5-v22df 2/2 Running 0 9m11s
everest-csi-driver-snzrr 1/1 Running 0 12m
everest-csi-driver-ttj28 1/1 Running 0 12m
everest-csi-driver-wtrk6 1/1 Running 0 12m
PV
来看一下 PV 如何描述持久化存储,如创建了一个文件存储,这个文件存储 ID 为 68e4a4fd-d759-444b-8265-20dc66c8c502,挂载地址为 nas01-mycloud.com:/share-96314776。如果想在k8s中使用这个文件存储,则需要先创建一个PV来描述这个存储,如下所示。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
accessModes:
- ReadWriteMany # 读写模式
capacity:
storage: 10Gi # 定义PV的大小
csi:
driver: nas.csi.everest.io # 声明使用的驱动
fsType: nfs # 存储类型
volumeAttributes:
everest.io/share-export-location: nas01-mycloud.com:/share-96314776 # 挂载地址
volumeHandle: 68e4a4fd-d759-444b-8265-20dc66c8c502
这里 csi 下面的内容是特定的字段,在其他地方无法使用。 下面创建这个PV并查看。 $ kubectl create -f pv.yaml
persistentvolume/pv-example created
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-example 10Gi RWX Retain Available
RECLAIM POLICY 是指 PV 的回收策略,Retain 表示 PVC 被释放后 PV 继续保留。STATUS 值为 Available,表示 PV 处于可用的状态。 PVC
PVC 可以绑定一个 PV,示例如下。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi # 声明存储的大小
volumeName: pv-example # PV的名称
创建PVC并查看。
$ kubectl create -f pvc.yaml
persistentvolumeclaim/pvc-example created
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-example Bound pv-example 10Gi RWX
这里可以看到状态是Bound,VOLUME是pv-example,表示PVC已经绑定了PV。 再来看下PV。 $ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-example 10Gi RWX Retain Bound default/pvc-
可以看到状态也变成了 Bound,CLAIM 是 default/pvc-example,表示这个 PV 绑定了 default 命名空间下的 pvc-example 这个 PVC。 这里一个比较有意思的地方是 CLAIM 是 default/pvc-example,为什么要显示 default 呢,这是因为 PV 是集群级别的资源,并不属于某个命名空间,而 PVC 是命名空间级别的资源,PV 可以与任何命名空间的 PVC 资源绑定。 来源:本文转自“运维小白之路”。
还不过瘾?10月下旬,GOPS 全球运维大会 2023 · 上海站,早鸟票火热预售中~
联系我们
商务赞助及合作:
周静:130 7118 2180(微信同号)
任怡:132 6958 7068(微信同号)
门票咨询:
李伟:130 2108 2989(微信同号)
张娜:132 6188 5689(微信同号)
渠道合作:
刘欣:158 0111 5386(微信同号)
王子翰:185 4893 3915(微信同号)
议题申报:
刘杰:156 5212 7323(微信同号)
高婉莹:185 1087 3635(微信同号)
近期好文: 救火分享:记一次 K8s 管理节点故障排查经历,太深入了
“高效运维”公众号诚邀广大技术人员投稿
投稿邮箱:jiachen@greatops.net,或添加联系人微信:greatops1118。
点个“在看”,一年不宕机