您现在的位置是:首页 >技术交流 >k8s 存储类:storageclass网站首页技术交流

k8s 存储类:storageclass

qq759035366 2023-04-23 22:30:02
简介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
EOF

kubectl 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)
EOF

exportfs -arv #使NFS配置生效
cat > nfs-deployment.yaml << EOF
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
       app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP
            - name: NFS_PATH
              value: /data/nfs_pro/
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP
            path: /data/nfs_pro/
EOF

kubectl 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
EOF

kubectl 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: 1Gi
  storageClassName:  nfs
EOF

kubectl 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-pod
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - name: nfs-pvc
        mountPath: /usr/share/nginx/html
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim1
EOF

kubectl 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]# 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。