> 文章列表 > k8s 存储类:storageclass

k8s 存储类:storageclass

k8s 存储类:storageclass

上面介绍的 PV 和 和 PVC 模式都是需要先创建好PV,然后定义好 PVC 和 和 pv 进行一对一的 Bond ,但是如果 PVC 请求成千上万,那么就需要创建成千上万的 PV ,对于运维人员来说维护成本很高,Kubernetes 提供一种自动创建 PV 的机制,叫StorageClass** ,它的作用就是创建 PV 的模板。k8s 集群管理员通过创建storageclass 可以动态生成一个存储卷 pv 供 k8s pvc 使用。**

每个 StorageClass 都包含字段 provisioner ,parameters 和 reclaimPolic

具体来说,StorageClass 会定义以下两部分:
1 、PV 的属性 ,比如存储的大小、类型等;
2 、创建这种 PV 需要使用到的存储插件,比如 Ceph 、NFS 等

有了这两部分信息, Kubernetes 就能够根据用户提交的 PVC ,找到对应的 StorageClass ,然后
Kubernetes 就会调用 StorageClass 声明的存储插件,创建出需要的 PV

以 NFS 为例 , 要想使用 NFS ,我们需要一个 nfs-t client 的自动装载程序, 称之为 provisioner , 这个程序会使用我们已经配置好的NFS 服务器自动创建持久卷,也就是自动帮我们创建 PV.
.
K8S集群搭建NFS,请参考K8S持久化存储— nfs 卷的存储第2和第3部分

1. 安装 nfs provisioner ,用于 配合 存储类动态生成 pv

1.1 、创建 运行 nfs- -r provisioner 需要的 sa 账号

cat > serviceaccount.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
EOFkubectl apply -f serviceaccount.yaml
kubectl get sa 

什么是 sa ?
sa 的全称是 serviceaccount 。
serviceaccount 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的 。
指定了serviceaccount 之后,我们把pod 创建出来了,我们在使用这个pod 时,这个pod 就有了
我们指定的账户的权限了 。

1.2 、对 sa 授权

kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

1.3 、安装 nfs-provisioner 程序

mkdir /data/nfs_pro -p #把data/nfs_pro变成nfs共享的目录
cat >> /etc/exports << EOF
/data/nfs_pro *(rw,no_root_squash)
EOFexportfs -arv #使NFS配置生效
cat > nfs-deployment.yaml << EOF
kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-provisioner
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisionercontainers:- name: nfs-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP- name: NFS_PATHvalue: /data/nfs_pro/volumes:- name: nfs-client-rootnfs:server: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IPpath: /data/nfs_pro/
EOFkubectl apply -f nfs-deployment.yaml
kubectl get pods |grep nfs #过滤看到pod运行正常

2. 创建 storageclass ,动态供给 pv

cat > nfs-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs
provisioner: example.com/nfs
EOFkubectl apply -f nfs-storageclass.yaml 
kubectl get storageclass
[root@k8s-master nfs]# kubectl get storageclass
NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs    example.com/nfs   Delete          Immediate           false                  118s
[root@k8s-master nfs]# 

3. 创建 pvc , 通过 storageclass 动态 生成 pv

cat > claim.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1
spec:accessModes:  ["ReadWriteMany"]resources:requests:storage: 1GistorageClassName:  nfs
EOFkubectl apply -f claim.yaml 
[root@k8s-master nfs]# kubectl get storageclass
NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs    example.com/nfs   Delete          Immediate           false                  6m55s
[root@k8s-master nfs]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
pvc-78f20f02-755d-47f3-9a79-7772f0c7ccbb   1Gi        RWX            Delete           Bound    default/test-claim1   nfs                     2m15s
[root@k8s-master nfs]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim1   Bound    pvc-78f20f02-755d-47f3-9a79-7772f0c7ccbb   1Gi        RWX            nfs            2m18s
# 通过上面可以看到 test-claim1 的 pvc 已经成功创建了,绑定的 pv 是 pvc-78f20f02-755d-47f3-9a79-7772f0c7ccbb,这个 pv 是由storageclass 调用 nfs provisioner 自动生成的.

步骤总结:
1 、供应商:创建一个 nfs provisioner
2 、创建 storageclass ,storageclass 指定刚才创建的供应商
3 、创建 pvc ,这个 pvc 指定 storageclass

4. 创建 pod ,挂载 storageclass 动态生成的 pvc :test-claim1

cat > read.yaml << EOF
kind: Pod
apiVersion: v1
metadata:name: read-pod
spec:containers:- name: read-podimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
EOFkubectl apply -f read.yaml
[root@k8s-master nfs]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nfs-provisioner-54f4c55759-gg8rg   1/1     Running   0          17m
read-pod                           1/1     Running   0          9m1s
[root@k8s-master nfs]# 

5. 验证

5.1 查询pod是否自动获取到目录

#master服务器上也就是nfs共享服务器上
[root@k8s-master nfs]# cat /etc/exports
/data/nfs  *(rw,no_root_squash)
/data/nfs_pro *(rw,no_root_squash)
[root@k8s-master nfs]# cd /data/nfs_pro/
[root@k8s-master nfs_pro]# ls #看到了pod的挂在目录
default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-master nfs_pro]# 
#node1上查询挂载目录下
[root@k8s-node1 mnt]# cd /nfs/
[root@k8s-node1 nfs]# ll
total 0
drwxr-xr-x 2 root root 16 Apr 22 12:44 nfs
drwxr-xr-x 3 root root 74 Apr 22 13:48 nfs_pro
[root@k8s-node1 nfs]# cd nfs_pro/
[root@k8s-node1 nfs_pro]# ls
default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-node1 nfs_pro]# 
#node2上查询挂载目录下
[root@k8s-node2 mnt]# cd /nfs/
[root@k8s-node2 nfs]# ls
nfs  nfs_pro
[root@k8s-node2 nfs]# cd nfs_pro/
[root@k8s-node2 nfs_pro]# ls
default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-node2 nfs_pro]# 

5.2 pod删除后容器目录依然存在

[root@k8s-master nfs_pro]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nfs-provisioner-54f4c55759-gg8rg   1/1     Running   0          24m
read-pod                           1/1     Running   0          15m
[root@k8s-master nfs_pro]# kubectl delete pods read-pod #删除pod
pod "read-pod" deleted
[root@k8s-master nfs_pro]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nfs-provisioner-54f4c55759-gg8rg   1/1     Running   0          24m
[root@k8s-master nfs_pro]# pwd
/data/nfs_pro
[root@k8s-master nfs_pro]# ll #pod删除后目录依然存在就OK
total 0
drwxrwxrwx 2 root root 6 Apr 22 13:46 default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-master nfs_pro]#