(六)k8s实战-存储管理

一、Volumes

1、HostPath

【使用场景:容器目录 挂载到 主机目录】
【可以持久化到主机上】
将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失

配置文件

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: nginxname: nginx-volumevolumeMounts: # 挂载数据卷- mountPath: /test-pd # 挂载到容器的哪个目录name: test-volume # 挂载哪个 volumevolumes: # 定义数据卷- name: test-volume # 数据卷名称hostPath: # 与主机共享目录,加载主机中的指定目录到容器中path: /data # 节点中的目录type: DirectoryOrCreate # 检查类型,在挂载前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查
#最终效果:容器的/test-pd目录 挂载到 主机的/data目录

type类型:
空字符串:默认类型,不做任何检查
DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录
Directory:这个目录必须存在
FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644
File:这个文件必须存在
Socket:UNIX 套接字,必须存在
CharDevice:字符设备,必须存在
BlockDevice:块设备,必须存在

2、EmptyDir

【使用场景:pod中多个容器需要共享目录,多个容器目录 挂载到 pod目录】
【不可以持久化,pod删除,数据就丢失了】
EmptyDir 主要用于一个 Pod 中不同的 Container 共享数据使用的,由于只是在 Pod 内部使用,因此与其他 volume 比较大的区别是,当 Pod 如果被删除了,那么 emptyDir 也会被删除。

存储介质可以是任意类型,如 SSD、磁盘或网络存储。可以将 emptyDir.medium 设置为 Memory 让 k8s 使用 tmpfs(内存支持文件系统),速度比较快,但是重启 tmpfs 节点时,数据会被清除,且设置的大小会计入到 Container 的内存限制中。

配置文件

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: nginxname: nginx-emptydirvolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}

二、NFS 挂载

【使用场景:共享目录,持久化数据】
nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

1)安装 nfs

# 安装 nfs
yum install nfs-utils -y# 启动 nfs
systemctl start nfs-server# 查看 nfs 版本
cat /proc/fs/nfsd/versions# 创建共享目录
mkdir -p /data/nfs
cd /data/nfs
mkdir rw
mkdir ro# 设置共享目录 export
vi /etc/exports
/data/nfs/rw 192.168.100.0/24(rw,sync,no_subtree_check,no_root_squash)
/data/nfs/ro 192.168.100.0/24(ro,sync,no_subtree_check,no_root_squash)# 重新加载
exportfs -f
systemctl reload nfs-server# 到其他测试节点安装 nfs-utils 并加载测试
mkdir -p /mnt/nfs/rw
mount -t nfs 192.168.100.101:/data/nfs/rw /mnt/nfs/rw

配置文件:

apiVersion: v1
kind: Pod
metadata:name: ngs-test-pd1
spec:containers:- image: arm64v8/nginxname: test-containervolumeMounts:- mountPath: /my-nfs-dataname: test-volumevolumes:- name: test-volumenfs:server: 192.168.100.101 # 网络存储服务地址                                           path: /data/nfs/rw/www/wolfcode # 网络存储路径           readOnly: false # 是否只读

三、PV 与 PVC

在这里插入图片描述

1、 生命周期

1)构建

  • 静态构建:
    集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息, 并且对集群用户可用(可见)。PV 卷对象存在于 Kubernetes API 中,可供用户消费(使用)。

  • 动态构建:
    如果集群中已经有的 PV 无法满足 PVC 的需求,那么集群会根据 PVC 自动构建一个 PV,该操作是通过 StorageClass 实现的。
    想要实现这个操作,前提是 PVC 必须设置 StorageClass,否则会无法动态构建该 PV,可以通过启用 DefaultStorageClass 来实现 PV 的构建。

2)绑定
当用户创建一个 PVC 对象后,主节点会监测新的 PVC 对象,并且寻找与之匹配的 PV 卷,找到 PV 卷后将二者绑定在一起。

如果找不到对应的 PV,则需要看 PVC 是否设置 StorageClass 来决定是否动态创建 PV,若没有配置,PVC 就会一致处于未绑定状态,直到有与之匹配的 PV 后才会申领绑定关系。

3)使用
Pod 将 PVC 当作存储卷来使用,集群会通过 PVC 找到绑定的 PV,并为 Pod 挂载该卷。

Pod 一旦使用 PVC 绑定 PV 后,为了保护数据,避免数据丢失问题,PV 对象会受到保护,在系统中无法被删除。

4)回收策略

保留(Retain)
回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim 对象被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为"已释放(released)"。 由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。 管理员可以通过下面的步骤来手动回收该卷:

  1. 删除 PersistentVolume 对象。与之相关的、位于外部基础设施中的存储资产 (例如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)在 PV 删除之后仍然存在。
  2. 根据情况,手动清除所关联的存储资产上的数据。
  3. 手动删除所关联的存储资产。
  4. 如果你希望重用该存储资产,可以基于存储资产的定义创建新的 PersistentVolume 卷对象。

删除(Delete):
对于支持 Delete 回收策略的卷插件,删除动作会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会从外部基础设施(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中移除所关联的存储资产。 动态制备的卷会继承其 StorageClass 中设置的回收策略, 该策略默认为 Delete。管理员需要根据用户的期望来配置 StorageClass; 否则 PV 卷被创建之后必须要被编辑或者修补。

回收(Recycle):
警告: 回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态制备。

如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的擦除 (rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领。

2、 PV

配置文件:

apiVersion: v1
kind: PersistentVolume
metadata:name: pv0001
spec:capacity:storage: 5Gi # pv 的容量volumeMode: Filesystem # 存储类型为文件系统accessModes: # 访问模式:ReadWriteOnce、ReadWriteMany、ReadOnlyMany- ReadWriteOnce # 可被单节点独写persistentVolumeReclaimPolicy: Recycle # 回收策略storageClassName: slow # 创建 PV 的存储类名,需要与 pvc 的相同mountOptions: # 加载配置- hard- nfsvers=4.1nfs: # 连接到 nfspath: /data/nfs/rw/test-pv # 存储路径server: 192.168.100.101 # nfs 服务地址

在这里插入图片描述

STATUS:
Available:空闲,未被绑定
Bound:已经被 PVC 绑定
Released:PVC 被删除,资源已回收,但是 PV 未被重新使用
Failed:自动回收失败

3、 PVC

PVC配置文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteOnce # 权限需要与对应的 pv 相同volumeMode: Filesystemresources:requests:storage: 5Gi # 资源可以小于 pv 的,但是不能大于,如果大于就会匹配不到 pvstorageClassName: slow # 名字需要与对应的 pv 相同
#  selector: # 使用选择器精确选择对应的 pv
#    matchLabels:
#      release: "stable"
#    matchExpressions:
#      - {key: environment, operator: In, values: [dev]}

在这里插入图片描述

Pod 绑定 PVC

# 在 pod 的挂载容器配置中,增加 pvc 挂载
containers:......volumeMounts:- mountPath: /tmp/pvc # 挂载到容器的目标目录name: nfs-pvc-test # 挂载到哪个存储卷
volumes:- name: nfs-pvc-test # 存储卷名称persistentVolumeClaim: # 关联pvcclaimName: nfs-pvc # pvc的名称

4、 StorageClass

在这里插入图片描述

制备器(Provisioner)

每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。

NFS 动态制备案例

Kubernetes集群中NFS类型的存储没有内置 Provisioner。但是你可以在集群中为NFS手动配置外部Provisioner。
1)Provisioner制备器配置(NFS类型)
nfs-provisioner-deploment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionernamespace: kube-systemlabels:app: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisioner# 官方不支持SelfLink了,导致一直Pending#image: quay.io/external_storage/nfs-client-provisioner:latest# 用这个国内镜像image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs- name: NFS_SERVERvalue: 192.168.100.101- name: NFS_PATHvalue: /data/nfs/rwvolumes:- name: nfs-client-rootnfs:server: 192.168.100.101path: /data/nfs/rw

2)StorageClass 存储类配置
nfs-storage-class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storagenamespace: kube-system
provisioner: fuseim.pri/ifs # 外部制备器提供者,编写为提供者的名称
parameters:archiveOnDelete: "false" # 是否存档,false 表示不存档,会删除 oldPath 下面的数据,true 表示存档,会重命名路径
reclaimPolicy: Retain # 回收策略,默认为 Delete 可以配置为 Retain
volumeBindingMode: Immediate # 默认为 Immediate,表示创建 PVC 立即进行绑定,只有 azuredisk 和 AWSelasticblockstore 支持其他值

3)RBAC 配置
nfs-provisioner-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runnernamespace: kube-system
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisionernamespace: kube-system
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: kube-system
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: kube-system
subjects:- kind: ServiceAccountname: nfs-client-provisioner
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

4)使用 pvc模板, 创建应用测试动态添加PV

---
apiVersion: v1
kind: Service
metadata:name: nginx-sclabels:app: nginx-sc
spec:type: NodePortports:- name: webport: 80protocol: TCPselector:app: nginx-sc
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx-sc
spec:replicas: 1serviceName: "nginx-sc"selector:matchLabels:app: nginx-sctemplate:metadata:labels:app: nginx-scspec:containers:- image: arm64v8/nginxname: nginx-scimagePullPolicy: IfNotPresentvolumeMounts:- mountPath:  /usr/share/nginx/html # 挂载到容器到哪个目录name: nginx-sc-test-pvc # 挂载哪个volumevolumeClaimTemplates: # PVC模板:帮你创建出pvc和pv- metadata:name: nginx-sc-test-pvcspec:storageClassName: managed-nfs-storage # sc存储类名字accessModes:- ReadWriteManyresources:requests:storage: 1Gi # 声明至少需要1G资源

问题:PVC 处于 Pending 状态
原因:在 k8s 1.20 之后,出于对性能和统一 apiserver 调用方式的初衷,移除了对 SelfLink 的支持,而默认上面指定的 provisioner 版本需要 SelfLink 功能,因此 PVC 无法进行自动制备。

解决方案:
1)配置 SelfLink修改 apiserver 配置文件
vim /etc/kubernetes/manifests/kube-apiserver.yamlspec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false # 新增该行......修改后重新应用该配置
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml2)不需要 SelfLink 的 provisioner 【推荐】
将 provisioner 修改为如下镜像之一即可
官方镜像:gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
国内镜像:registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0

Kubernetes 动态分配存储卷之 NFS-Subdir-External-Provisioner

PVC 测试配置

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: auto-pv-test-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 300MistorageClassName: managed-nfs-storage

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88119.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款轻量级开发者工具,提高开发效率

Devkits Devkits 是一款轻量级桌面端应用,提供了一系列开发者工具,提高开发效率。 离线。类似的在线工具已经不少了,但是大多数都是在线的,网络不好的时候就很难用了。Devkits 提供了离线使用的功能,可以在没有网络的…

自动化测试工具Selenium的语法续.

OK,那么上篇博客我们介绍了如何搭建基于Javaselenium的环境,并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例,那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法,感谢关注,期待三连~ 目…

新KG视点 | Jeff Pan、陈矫彦等——大语言模型与知识图谱的机遇与挑战

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力,知识图谱则丰富了表示知识的方式,两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下,OpenKG组织…

移动端h5项目的兼容和适配问题

解决兼容性问题的关键在于对移动端产品的生存环境进行梳理,在此基础之上制定应对策略。 所谓生存环境主要分为三个维度: 硬件环境,细分为品牌和机型,决定了屏幕大小、性能等硬件限制 操作系统,比如iOS6和iOS7&#xf…

华为数通方向HCIP-DataCom H12-821题库(单选题:101-120)

第101题 可用于多种路由协议,由 ​​if-match​​​和 ​​apply​​子句组成的路由选择工具是 A、​​route-policy​​ B、​​IP-Prefix​​ C、​​commnityfilter​​ D、​​as-path-filter​​ 答案:A 解析: Route-policy(路由策…

理虚实一体化全栈全场景云计算应用实训室解决方案

一、 云计算应用统概述 云计算应用系统是指基于云计算技术构建的应用系统,它将软件、数据、计算和存储资源部署在云服务器上,通过网络根据应用按照一定策略为用户提供相关服务。云计算应用系统广泛应用于各个领域,包括但不限于金融、教育、政…

Android Gradle 同步优化

作者:究极逮虾户 很多人听到方法论三个字,就觉得我要开始pua,说我阿里味,但是我觉得这个查问题的方式可能会对大家有点帮助。 很多人都会有这样的困扰,给你的一个工作内容是一个你完全陌生的东西,第一选择…

vue中解决ajax跨域问题(no “access-control-allow-origin”)

文章目录 跨域报错信息产生原因举例解决方法方式一优缺点方式二优缺点 跨域报错信息 产生原因 跨域是是因为浏览器的同源策略限制,是浏览器的一种安全机制,服务端之间是不存在跨域的。 所谓同源指的是两个页面具有相同的协议、主机和端口,三…

【Qt学习】05:自定义封装界面类

OVERVIEW 自定义封装界面类1.QListWidget2.QTreeWidget3.QTableWidget4.StackedWidget5.Others6.自定义封装界面类-显示效果(1)添加设计师界面类(2)在ui中设计自定义界面(3)在需要使用的界面中添加&#xf…

深入分析负载均衡情景

本文出现的内核代码来自Linux5.4.28,为了减少篇幅,我们尽量不引用代码,如果有兴趣,读者可以配合代码阅读本文。 一、有几种负载均衡的方式? 整个Linux的负载均衡器有下面的几个类型: 实际上内核的负载均衡…

激活潜能:探索职场中的自我效能感之道

引言:自我效能感的定义与重要性 自我效能感,简而言之,是个体对自己能够成功完成某项任务的信心。这种信心不仅影响我们的思考方式和情感,还影响我们的行为和动机。在职场中,高自我效能感的人往往更有动力,…

智能工厂移动式作业轻薄加固三防平板数据采集终端

在这个高度自动化和数字化的环境中,数据采集变得尤为重要。为了满足这个需求,工业三防平板数据采集终端应运而生。工业三防平板数据采集终端采用了轻量级高强度镁合金材质,这使得它在保持轻薄的同时具有更强的坚固性。这种材质还具有耐磨防损…