1、定义
发布pvc之后可以生成pv,还可以在共享服务器上直接生成挂载目录
pvc直接绑定和使用pv
2、动态pv依赖两个组件
(1)provisioner卷插件:k8s本身支持的动态pv创建不包括nfs,需要声明和安装一个外部插件provisioner(存储分配器),可以动态创建pv,根据pvc请求自动绑定和使用(根据定义的pv属性创建pv)
(2)StorageClass:定义pv属性(存储类型、大小、回收策略等)
3、nfs实现动态pv
nfs支持NFS-client,provisioner来适配nfs-client
先创建nfs-client-provisioner卷插件
与静态pv相比,少了自定义挂载卷和自定义pv这两步,用StorageClass和provisioner来代替这两步自动生成
创建动态pv实验(默认策略是Delete,一定要设置成Retain)
1、创建共享目录
查看其他节点是否共享目录
2、创建账户Service Account
用来管理 NFS Provisioner 在 k8s 集群中运行的权限
nfs provisioner是一个插件,没有权限是无法在集群中获取k8s的消息.插件要有权限监听apiserver、获取集群的列表资源、create、delete
查看各个yaml文件的格式:
①查看账户kubectl explain ServiceAccount
②查看集群角色kubectl explain ClusterRole
rbac:Role-based Access control基础权限配置,定义角色在集群中可以使用的权限
③查看集群角色和账户绑定kubectl explain ClusterRoleBinding
④查看storageclass插件 kubectl explain storageclass
⑤查看pvc
kubectl explain pvc
verbs表示权限的动作 | |
get | 获取资源 |
list | 获取集群中列表资源 |
watch | 监听 |
create | 创建 |
update | 更新 |
patch | 路径 |
账户名称 | nfs-client-provisioner |
角色名称 | nfs-client-provisioner-clusterrole |
storageclass名称 | nfs-client-storageclass |
3、使用 Deployment 来创建 NFS Provisioner插件
NFS Provisione(即 nfs-client),有两个功能:一个是在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联
①屏蔽selflink功能
由于 1.20 版本启用了 selfLink,所以 k8s 1.20+ 版本通过 nfs provisioner 动态生成pv会报错
feature-gates | 在不破坏现有规则和功能的情况下引入新功能或修改现有功能的机制 |
禁用不影响之前的规则 |
②创建NFS Provisioner插件
创建nfs的provisioner的客户端,以pod的方式运行在集群中,根据刚才赋予的权限监听k8s集群中pv请求,动态创建与nfs服务器相关的pv
容器里使用的配置在provisioner里定义好环境变量传给容器
环境变量:storageclass的名称,nfs服务器的地址,nfs的目录
4、创建 StorageClass
负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联
NAME | storageclass的名称 |
PROVISIONER | 对应创建pv的provisioner插件 |
RECLAIMPOLICY | pv回收策略。这里定义的是retain |
VOLUMEBINDINGMODE | 卷绑定模式,immediate标识pvc请求创建pv时,系统会立即绑定一个可用的pv waitForFirstConsumer第一个使用者而出现之后再绑定pv |
ALLOWVOLUMEEXPANSION | 可以在运行时对pv进行扩容 |
5、创建 PVC 和 Pod 测试
测试挂载卷
6、释放pv资源
将pv资源改为可用状态Available
7、重新定义pv回收策略
①Delete策略
先删除storageclass
再回收pv资源
②Recycle策略
先删除storageclass
再回收pv资源
结论:pv不支持Recycle回收策略