每天一点基础K8S--K8S中的存储类storage Class
存储类storageClass
1、官网链接
https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/
2、storageClass资源
# 在前面持久卷的实验中看到,对于静态绑定的pv,完成流程是1、创建PV;2、创建PVC;3、POD进行volumeMounts。
# 如果每次手动创建PV有点麻烦,那么可以利用storageClass实现动态PV创建,就不用每次都手动创建PV了。
# 每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态制备 PersistentVolume 时会使用到。
# StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。
provisioner: AzureFile、AzureDisk、CephFS、Cinder、FC、NFS、GlusterFS、iSCSI、RBD、Local等等
parameters:对接不同存储时,使用到的参数不一样,可以根据官网查看示例。
3、使用storageClass的大致步骤
pod通过volume Mounts挂载一个数据库volume,该volume类型为PVC。但是PV并没有提前创建,而是通过storageClass完成PV的动态创建。storageClass中指定了提供者provisioner,provisioner可以关联相应类型的存储资源,如NFS。
4、利用storageClass动态创建存储卷
4.1、创建serviceaccount nfs-provisioner
[root@master-worker-node-1 storage]# kubectl create serviceaccount nfs-provisioner
serviceaccount/nfs-provisioner created
4.2、为sa nfs-provisioner授权
[root@master-worker-node-1 storage]# kubectl create clusterrolebinding nfs-provisioner-cluster-role-binding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-cluster-role-binding created
4.3、安装provisioner程序
# 此处以POD运行一个provisioner
[root@master-worker-node-1 storage]# cat nfs-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-provisioner
spec:
replicas: 1
selector:
matchLabels:
func: nfs-provisioner
template:
metadata:
labels:
func: nfs-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-provisioner
image: groundhog2k/nfs-subdir-external-provisioner:v3.2.0
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: test.com/nfs
- name: NFS_SERVER
value: 192.168.122.106
- name: NFS_PATH
value: /mnt/dir-6
volumes:
- name: nfs
nfs:
server: 192.168.122.106
path: /mnt/dir-6
[root@master-worker-node-1 storage]# kubectl apply -f nfs-provisioner.yaml
deployment.apps/nfs-provisioner created
[root@master-worker-node-1 storage]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-provisioner-9f679b579-mxjrl 1/1 Running 0 86s 10.244.31.19 only-worker-node-3 <none> <none>
[root@master-worker-node-1 storage]# kubectl exec -it nfs-provisioner-9f679b579-mxjrl -- bash
[root@nfs-provisioner-9f679b579-mxjrl /]#
[root@nfs-provisioner-9f679b579-mxjrl /]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
overlay overlay 20G 6.5G 14G 33% /
tmpfs tmpfs 64M 0 64M 0% /dev
tmpfs tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
192.168.122.106:/mnt/dir-6 nfs4 20G 6.1G 14G 31% /persistentvolumes
4.4 创建storageClass以实现动态创建PV
# 创建storageClass
[root@master-worker-node-1 storage]# cat storageclass-1.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: from-nfs
volumeBindingMode: Immediate # 默认immediate,表示创建PVC立即进行绑定。只有azuredisk和AWSelasticblockstore支持其他值,具体可以查看官网。
provisioner: test.com/nfs # 此处与nfs-provisioner环境变量中的PROVISIONER_NAME保持一致。
#parameters: # 在nfs-provisioner中指定了,这里就不写了。
# server: 192.168.122.106
# path: /mnt/dir-6
# readOnly: "true"
# 查看创建的storageclass
[root@master-worker-node-1 storage]# kubectl apply -f storageClass-1.yaml
storageclass.storage.k8s.io/from-nfs created
[root@master-worker-node-1 storage]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
from-nfs test.com/nfs Delete Immediate false 8s
4.5 创建PVC,并通过storageClass自动创建PV
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-auto
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 300Mi
storageClassName: from-nfs
# PVC创建成功,并完成了关联。
[root@master-worker-node-1 storage]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-auto Bound pvc-42142c11-20e7-44ac-b210-0a520f2fc766 300Mi RWO from-nfs 5s
[root@master-worker-node-1 storage]#
# 自动创建了一个PV
[root@master-worker-node-1 storage]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-42142c11-20e7-44ac-b210-0a520f2fc766 300Mi RWO Delete Bound default/test-auto from-nfs 37s
4.6 Pod卷挂载(略)
5、小结
1、可以利用storageClass进行动态创建PV,而不是手动创建;
2、使用StorageClass动态创建PV的步骤:1、先完成provisioner配置;2、完成storageclass配置;3、创建PVC;4、Pod挂载数据卷