k8s 存储
存储资源实现pod间数据的共享和持久化
emptyDir
emptyDir,容器启动时在/var/lib/kubelet数据目录下生成,跟随pod的结束而消失
【位置】pod.spec 下声明
volumes: - name: log emptydir: {} #emptydir: {medium: Memroy,sizeLimit: 256Mi}
【位置】pod.spec.containers 下使用
volumeMounts: - name: log mountPath: /var/logs
hostPath
数据持久化在单个node上,pod再次调度时无法保障数据的共享
【位置】pod.spec 下声明
volumes: - name: sys hostPath: path: /sys type: "" #Directory,DirectoryOrCreate,File,FileOrCreate,Socket,CharDevice ,BlockDevice
【位置】pod.spec.containers 下使用
volumeMounts: - name: sys mountPath: /sys
nfs
【位置】pod.spec 下声明
volumes: - name: data nfs: path: /data/nfs-volume/ #nfs 实际对外共享的路径 readOnly: true server: 10.4.7.200
【位置】pod.spec.containers 下使用
volumeMounts: - name: data mountPath: /data
pv 和 pvc
持久卷(PersistentVolume,PV):是集群中的一块存储,可以由管理员事先供应,或者 使用存储类(Storage Class)来动态供应
持久卷申请(PersistentVolumeClaim,PVC):是用户对存储的请求,PVC 申领会耗用 PV 资源
k8s既然已经提供了如此多的存储接口(诸如:emptyDir/hostPaht/nfs/rdb/cephfs),为什么还需要pv和pvc呢?
大体上有两个原因:
-
pv 和 pvc 提供了存储资源统一的访问接口,对于使用者来说不需要关心他是nfs 还是rdb。
-
pv 和 pvc 提供了资源大小控制能力。例如: 持久卷的大小、持久卷的挂载方式。
-
手工创建pv
apiVersion: v1 kind: PersistentVolume metadata: name: pv0003 labels: type: slow spec: accessModes: - ReadWriteOnce #the volume can be mounted as read-write by a single node capacity: storage: 5Gi volumeMode: Filesystem # 默认是Filesystem persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: /nfs server: 10.4.7.31 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 2Gi storageClassName: slow selector: matchLabels: type: slow --- apiVersion: v1 kind: Pod metadata: name: test-pvc spec: volumes: - name: mypvc persistentVolumeClaim: claimName: myclaim containers: - name: test image: alpine:3.5 volumeMounts: - name: mypvc mountPath: /tmp/test command: ["sleep","1000"]
[root@ceph-mon2 ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv0003 5Gi RWO Recycle Available slow 11s
每个卷会处于以下阶段(Phase)之一: Available(可用)-- 卷是一个空闲资源,尚未绑定到任何申领; Bound(已绑定)-- 该卷已经绑定到某申领; Released(已释放)-- 所绑定的申领已被删除,但是资源尚未被集群回收; Failed(失败)-- 卷的自动回收操作失败。 命令行接口能够显示绑定到某 PV 卷的 PVC 对象。
ReadWriteOnce 卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式也允许运行在同一节点上的多个 Pod 访问卷。 ReadOnlyMany 卷可以被多个节点以只读方式挂载。 ReadWriteMany 卷可以被多个节点以读写方式挂载。 ReadWriteOncePod 卷可以被单个 Pod 以读写方式挂载。 如果你想确保整个集群中只有一个 Pod 可以读取或写入该 PVC, 请使用ReadWriteOncePod 访问模式。这只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本。
在命令行接口(CLI)中,访问模式也使用以下缩写形式: RWO - ReadWriteOnce ROX - ReadOnlyMany RWX - ReadWriteMany RWOP - ReadWriteOncePod
目前的回收策略有: Retain -- 手动回收 Recycle -- 基本擦除 (rm -rf /thevolume/*) Delete -- 诸如 AWS EBS、GCE PD、Azure Disk 或 OpenStack Cinder 卷这类关联存储资产也被删除 目前,仅 NFS 和 HostPath 支持回收(Recycle)。 AWS EBS、GCE PD、Azure Disk 和 Cinder 卷都支持删除(Delete)。
- 动态创建pv
StorageClass
有时,在单个 Pod 中共享卷以供多方使用是很有用的。 volumeMounts.subPath
属性可用于指定所引用的卷内的子路径,而不是其根路径。
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: app: testvolume name: test spec: containers: - args: - sleep - "1000" image: busybox name: test1 volumeMounts: - name: test mountPath: /mount subPath: "log" # 仅仅挂载了 /tmp/log - args: - sleep - "1000" image: busybox name: test volumeMounts: - name: test mountPath: /mount subPath: "a" # 仅仅挂载了 /tmp/data dnsPolicy: ClusterFirst restartPolicy: OnFailure volumes: - name: test hostPath: path: /tmp # 存在 /tmp/log 和 /tmp/data 目录。如果不存在则系统自动创建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏