部署NFS版StorageClass(存储类)
部署NFS版StorageClass存储类
- NFS版PV动态供给StorageClass(存储类)
- 基于NFS实现动态供应
- 下载`NFS存储类资源清单`
- 部署NFS服务器
- 为StorageClass(存储类)创建所需的RBAC
- 部署nfs-client-provisioner的deployment
- 创建StorageClass
- 使用存储类创建PVC
NFS版PV动态供给StorageClass(存储类)
存储类
的好处之一便是支持PV的动态供给
,它甚至可以直接被视作为PV的创建模版,用户用到持久性存储时,需要通过创建PVC
来绑定匹配的PV,此类操作需求较大,或者当管理员手动创建的PV无法满足PVC的所有需求时,系统按PVC的需求标准动态创建适配的PV会为存储管理带来极大的灵活性,不过仅那些属于StorageClass
的PVC
和PV
才能产生绑定关系
,即没有指定StorageClass
的PVC
只能绑定同类的PV
。存储类对象
的名称至关重要
,它是用户调用的标识,创建存储类对象时,除了名称之外,还需要为其定义三个关键字段。provisioner(供应者)
、parameter(参数)
和reclaimPolicy(回收策略)
。- 所以kubernetes提供了一种可以
动态分配
的工作机制,可用自动创建PV
,该机制依赖于StorageClass
的API
,将某个存储节点划分1T给kubernetes使用,当用户申请5Gi的PVC时,会自动从这1T的存储空间去创建一个5Gi的PV,而后自动与之进行关联绑定。 动态PV供给
的启用需要事先创建一个存储类,不同的Provisoner(供应者)
的创建方法各有不同,并非所有的存储卷插件都由Kubernetes内建支持PV动态供给。
基于NFS实现动态供应
参考: https://www.cnblogs.com/xunweidezui/p/16930975.html
由于kubernetes
内部不包含NFS驱动
,所以需要使用外部驱动;
nfs-subdir-external-provisioner
是一个自动供应器
,它使用NFS服务端
来支持动态供应
。
NFS-subdir-external- provisioner
实例负责监视PersistentVolumeClaims(PVC)
请求StorageClass
,并自动为它们创建NFS所支持的PresistentVolumes(PV)
。
下载NFS存储类资源清单
NFS版StorageClass插件
GitHub项目地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
部署NFS Provisioner参考
免积分下载部署yaml
部署NFS服务器
https://blog.csdn.net/omaidb/article/details/120926883
为StorageClass(存储类)创建所需的RBAC
nfs-rbac.yaml
示例
---
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:name: storage
---
# 创建服务账号
kind: ServiceAccount
apiVersion: v1
metadata:# 服务账号名name: nfs-client-provisioner# 替换为deployment的命名空间namespace: storage
---
# 创建集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 集群角色名name: nfs-client-provisioner-runner
# 添加集群角色权限
rules:- apiGroups: [""]# 向该角色增加对PV执行查看,创建,删除 权限resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]# 向该角色增加对PVC执行查看,更新 权限resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]# 向该角色增加对动态存储类执行查看 权限resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]# 向该角色增加对events(集群事件)进行 创建 更新 补丁 权限resources: ["events"]verbs: ["create", "update", "patch"]
---
# 创建集群角色绑定
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 角色绑定的名称name: run-nfs-client-provisioner
subjects:# 绑定服务账号- kind: ServiceAccount# 要绑定的服务账号名--就是第一个yaml创建的saname: nfs-client-provisioner# 绑定到哪个命名空间namespace: storage
roleRef:kind: ClusterRole# 要绑定的集群角色名--就是第2个yaml创建的集群角色name: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
# 创建role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 创建的角色名name: leader-locking-nfs-client-provisioner
rules:- apiGroups: [""]# 向该角色增加对endpoint 查看 创建 更新 补丁 的权限resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
# 创建role绑定
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 该角色绑定的名字name: leader-locking-nfs-client-provisioner
subjects:- kind: ServiceAccount# 要绑定的服务账号名--就是第一个yaml创建的服务账号name: nfs-client-provisioner# 替换为deployment要部署到的命名空间# 绑定到storage命名空间namespace: storage
roleRef:kind: Role# 要绑定的角色名称,就是上一个yaml创建的rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
# 清理rbac授权
kubectl delete -f nfs-rbac.yaml -n kube-system# 执行rbac授权
kubectl apply -f nfs-rbac.yaml
部署nfs-client-provisioner的deployment
apiVersion: apps/v1
kind: Deployment
metadata:# Deployment名name: nfs-client-provisionerlabels:app: nfs-client-provisioner# 部署到哪个命名空间namespace: storage
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:# 使用哪个服务账号serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisioner# image: lizhenliang/nfs-subdir-external-provisioner:v4.0.1image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVER# NFS服务器地址value: 192.168.31.63- name: NFS_PATH# NFS服务器share目录value: /ifs/kubernetesvolumes:- name: nfs-client-rootnfs:# NFS服务器地址server: 192.168.31.63# NFS服务器share目录path: /ifs/kubernetes
创建StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # 或选择其他名称,必须与部署的环境 PROVISIONER_NAME 匹配
parameters:# 启用PV归档模式 true|falsearchiveOnDelete: "false"
使用存储类创建PVC
---
# 创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:# pvc名称name: pv-volume
spec:# 存储类名称storageClassName: nfs-clientaccessModes:- ReadWriteOnceresources:requests:storage: 10Mi # pvc容量