Kubernetes
吾八哥学k8s(九):kubernetes里持久化存储
在容器中磁盘文件都是临时的,在容器销毁的时候磁盘文件会丢失,容器始终以最纯净的状态启动,这也是容器一个很重要的特征。但有些场景下却需要一些持久化存储的,例如:程序运行的日志、数据库文件、对象存储文件等,k8s里提供了PersistentVolume(PV)和PersistentVolumeClaim(PVC)两个资源对象来解决这个问题。
持久化存储概念
PV的全称是Persistent Volume(持久化卷),是对底层数据存储的抽象,PV由管理员创建、维护以及配置,它和底层的数据存储实现方法有关,比如Ceph,NFS,ClusterFS等,都是通过插件机制完成和共享存储对接。
PVC的全称是Persistent Volume Claim(持久化卷声明),我们可以将PV比喻为接口,里面封装了我们底层的数据存储,PVC就是调用接口实现数据存储操作,PVC消耗的是PV的资源。
StorageClass是为了满足用于对存储设备的不同需求,比如快速存储,慢速存储等,通过对StorageClass的定义,管理员就可以将存储设备定义为某种资源类型,用户根据StorageClass的描述可以非常直观的知道各种存储资源的具体特性,这样就可以根据应用特性去申请合适的资源了。
PV使用
PV分静态和动态两种,静态PV由管理员提前创建,动态PV无需提前创建,只需要指定PVC的StorageClass即可,这里就以一个具体的例子来学习PV的用法,PV的类型选用NFS,需要提前安装好NFS服务器。
测试创建PV的pv.yaml文件如下:
apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv labels: pv: nfs-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /data/nfs server: 192.16.1.100
相关参数说明
capacity: 容量
accessModes: 访问模式,包括如下三种:
ReadWriteOnce:具有读写权限,只能被单节点读写模式挂载,命令行中可缩写为RWO
ReadOnlyMany:具有只读权限,可以被多个节点只读模式挂载,命令行中可缩写为ROX
ReadWriteMany:具有读写权限,可以被多个节点读写模式挂载,命令行中可缩写为RWX
persistentVolumeReclaimPolicy: 回收策略,也就是释放持久化卷时的策略,有以下几种:
Retain:保留,允许手动回收资源,删除PVC时PV仍存在,管理员可手动回收卷
Delete:删除,如果Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete
Recycle:回收,清除PV中的所有数据,相当于执行rm -rf
storageClassName:PV的类
nfs:nfs服务器配置,path为nfs服务器上的目录,server为nfs服务器的地址
创建PV并查看状态
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl create -f pv.yaml persistentvolume/nfs-pv created 5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs-pv 1Gi RWX Recycle Available nfs 6s
创建PV后,PV会有如下几种状态:
Available(可用):可用状态,还未被任何PVC绑定
Bound(已绑定):已经被PVC绑定
Released(已释放):PVC被删除,但是资源还未被重新使用
Failed(失败): 自动回收失败
删除PV
在删除PV之前,建议先删除绑定在该PV上的PVC,删除PV执行如下命令:
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl delete pv nfs-pv persistentvolume "nfs-pv" deleted
PVC使用
创建PVC使用的资源类型为PersistentVolumeClaim,主要包括存储空间、访问模式、PV选择条件和存储类别等信息的设置。
这里创建PVC的学习例子的pvc.yaml文件如下:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: nfs selector: matchLabels: pv: nfs-pv
这里的一些参数设置条件要符合PV设定的条件才能进行绑定PV,例如accessModes、storageClassName、storage、selector。
创建PVC并查看状态
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl create -f pvc.yaml persistentvolumeclaim/nfs-pvc created 5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs-pv 1Gi RWX Recycle Bound default/nfs-pvc nfs 13m 5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs-pvc Bound nfs-pv 1Gi RWX nfs 10s
执行创建后PV的状态由Available变为Bound,PVC受限于namespace,只有相同namespace下的PVC才能挂载到pod内。
删除PVC
如果该pvc会pod挂载了,删除该pvc的时候pod会受影响的,删除之前请慎重,删除pvc执行如下命令:
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl delete pvc nfs-pvc persistentvolumeclaim "nfs-pvc" deleted
StorageClass
每个StorageClass都包含provisioner、parameters和reclaimPolicy这三个参数,不同的StorageClass对象支持的扩展参数是不一样的。定义一个StorageClass的例子如下:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: test provisioner: kubernetes.io/aws-ebs parameters: type: io1 iopsPerGB: "10" fsType: ext4 reclaimPolicy: Retain allowVolumeExpansion: true mountOptions: - debug volumeBindingMode: Immediate
参数说明:
provisioner:指定配置PV的卷的类型
parameters:描述卷的参数,取决于provisioner来接受不同的参数
reclaimPolicy:回收策略,可以是Delete、Retain,默认为Delete
mountOptions:指定挂载参数,取决于卷插件是否支持,设置前需要进行确认
kubernetes本身支持的动态PV创建不包括nfs,所以需要使用额外插件实现,可参考:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client
关于StorageClass的详细说明可以参考:https://kubernetes.io/zh/docs/tasks/administer-cluster/change-default-storage-class/
使用实例
这里以在pod里挂载pvc为例来体验挂载pvc的使用:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx volumeMounts: - name: nfs-pvc mountPath: /opt volumes: - name: nfs-pvc persistentVolumeClaim: claimName: nfs-pvc
指定volumes为要挂载的PVC即可。
相关文章
- 在Kubernetes里使用openkruise实现服务原地升级功能
- 吾八哥学k8s(十一):kubernetes里Pod的调度机制
- 吾八哥学k8s(十):kubernetes里Service和Ingress
- kubernetes中服务自定义Prometheus的metrics的方法
- k8s集群安装Prometheus监控以及Grafana面板的方法
- kubernetes集群证书过期的解决方法
- kubelet启动失败报failed to find cgroups of kubelet的解决方法
- macOs和Linux环境下kubectl命令自动补齐的方法
- 吾八哥学k8s(八):kubernetes里Secret的用法
- apps/v1版本下使用client-go实现kubernetes回滚的方法