部署NFS版StorageClass存储类
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服务器
https://blog.youkuaiyun.com/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创建的sa
name: nfs-client-provisioner
# 绑定到哪个命名空间
namespace: storage
roleRef:
kind: ClusterRole
# 要绑定的集群角色名--就是第2个yaml创建的集群角色
name: nfs-client-provisioner-runner
apiGroup: 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创建的role
name: leader-locking-nfs-client-provisioner
apiGroup: 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-provisioner
labels:
app: nfs-client-provisioner
# 部署到哪个命名空间
namespace: storage
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
# 使用哪个服务账号
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
# image: lizhenliang/nfs-subdir-external-provisioner:v4.0.1
image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
# NFS服务器地址
value: 192.168.31.63
- name: NFS_PATH
# NFS服务器share目录
value: /ifs/kubernetes
volumes:
- name: nfs-client-root
nfs:
# 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|false
archiveOnDelete: "false"
使用存储类创建PVC
---
# 创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
# pvc名称
name: pv-volume
spec:
# 存储类名称
storageClassName: nfs-client
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi # pvc容量