PV是运维人员来创建的,开发操作PVC,可是大规模集群中可能会有很多PV,如果这些PV都需要运维手动来处理这也是一件很繁琐的事情,所以就有了动态供给概念,也就是Dynamic Provisioning。而我们上面的创建的PV都是静态供给方式,也就是Static Provisioning。而动态供给的关键就是StorageClass,它的作用就是创建PV模板。
创建StorageClass里面需要定义PV属性比如存储类型、大小等;另外创建这种PV需要用到存储插件。最终效果是,用户提交PVC,里面指定存储类型,如果符合我们定义的StorageClass,则会为其自动创建PV并进行绑定。
kubernetes本身支持的动态PV创建不包括nfs,所以需要使用额外插件nfs-client和rpcbind
在master节点上安装nfs服务,并启动
yum -y install nfs-utils rpcbind
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs
在node节点上安装nfs(不需要安装rpcbind),并启动
yum -y install nfs-utils
systemctl start nfs
systemctl enable nfs
在node节点上挂载nfs目录
mkdir -p /data2/k8s/storageclass
vim /etc/exports
/data2/k8s/storageclass 192.168.238.0/24(rw,sync,no_root_squash)
需要nfs-client-provisioner这个镜像,我这边放到到dockerhub上了,直接拉去就行
docker pull xingergou/nfs-client-provisioner:latest
apiVersion: v1
kind: Namespace
metadata:
name: storage-class
labels:
name: storage-class
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: storage-class
---
#定义账号拥有哪些资源的哪些权限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-cr
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: ["list","watch","create","update","patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create","delete","get","list","watch","patch","update"]
---
#将角色与账号进行绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: nfs-client-provisioner-crb
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: storage-class
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-cr
apiGroup: rbac.authorization.k8s.io
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
namespace: storage-class
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: 192.168.238.153/nfs/nfs-client-provisioner:latest
env:
- name: PROVISIONER_NAME #给nfs-client-provisioner起个名字
value: nfs-storage-01
- name: NFS_SERVER
value: 192.168.238.153 #nfs server地址
- name: NFS_PATH
value: /data2/k8s/storageclass #nfs共享路径
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes #具体挂载路径
volumes: #定义一个nfs类型的volume,将nfs挂载到容器中
- name: nfs-client-root
nfs:
server: 192.168.238.153
path: /data2/k8s/storageclass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storageclass
provisioner: nfs-storage-01 #指定使用哪个nfs-client-provisioner
allowVolumeExpansion: true #可以动态扩容
reclaimPolicy: Retain #回收策略
这个专栏的redis和mysql都是用strageclass这种模式部署的