k8s:StorageClass

StorageClass

PV 和 PVC 的使用方法,但是PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上并不能满足我们的需求,比如有一个应用需要对存储的并发度要求比较高,而另外一个应用对读写速度又要求比较高,特别是对于 StatefulSet 类型的应用简单的来使用静态的 PV 就很不合适了,这种情况下我们就需要用到动态 PV,也就是我们今天要讲解的StorageClass。

创建

要使用 StorageClass,我们就得安装对应的自动配置程序,比如我们这里存储后端使用的是 nfs,那么我们就需要使用到一个 nfs-client 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置好的 nfs 服务器,来自动创建持久卷,也就是自动帮我们创建 PV。

  1. 自动创建的 PV 以{namespace}-{pvcName}-{pvName} 这样的命名
    格式创建在 NFS 服务器上的共享数据目录中
  2. 而当这个 PV 被回收后会以archieved-{namespace}-{pvcName}-{pvName} 这样的命名格式存在 NFS 服务器上。

当然在部署nfs-client 之前,我们需要先成功安装上 nfs 服务器,我们已经安装过了,共享数据目录是/data/k8s/,部署 nfs-client 即可,也可以直接参考 nfs-client 的文档:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client,进行安装。
第一步:配置 Deployment,将里面的对应的参数替换成我们自己的 nfs 配置(nfs-client.yaml)

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
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: quay.io/external_storage/nfs-clientprovisioner:latest
        volumeMounts:
        - name: nfs-client-root
          mountPath: /persistentvolumes
      env:
      - name: PROVISIONER_NAME
        value: fuseim.pri/ifs
      - name: NFS_SERVER
        value: 192.168.11.11
      - name: NFS_PATH
        value: /data/k8s
      volumes:
      - name: nfs-client-root
        nfs:
          server: 192.168.11.11
          path: /data/k8s

第二步:将环境变量 NFS_SERVER 和 NFS_PATH 替换,当然也包括下面的nfs 配置,我们可以看到我们这里使用了一个名为 nfs-client-provisioner的serviceAccount,所以我们也需要创建一个 sa,然后绑定上对应的权限:(nfs-client-sa.yaml)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

新建的一个名为 nfs-client-provisioner 的ServiceAccount,然后绑定了一个名为 nfs-client-provisioner-runner 的ClusterRole,而该ClusterRole声明了一些权限,其中就包括对persistentvolumes 的增、删、改、查等权限,所以我们可以利用该ServiceAccount来自动创建PV。

第三步:nfs-client 的 Deployment 声明完成后,就可以来创建一个StorageClass 对象了:(nfs-client-class.yaml)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: course-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name,must match deployment's env PROVISIONER_NAME'

声明了一个名为 course-nfs-storage 的StorageClass 对象,注意下面的provisioner对应的值一定要和上面的Deployment 下面的PROVISIONER_NAME 这个环境变量的值一样。

创建这些资源对象:

kubectl create -f nfs-client.yaml
kubectl create -f nfs-client-sa.yaml
kubectl create -f nfs-client-class.yaml

查看资源状态:

[root@master prometheus]# kubectl  get pods
NAME                                      READY   STATUS      RESTARTS   AGE
nfs-client-provisioner-58b95b9f7f-9kpcp   1/1     Running     5          9d

新建

我们这里有两种方法可以来利用上面创建的 StorageClass 对象来自动帮我们创建一个合适的 PV:

  1. 第一种方法:在这个 PVC 对象中添加一个声明 StorageClass 对象的标识,这里我们可以利用一个 annotations 属性来标识,如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
  annotations:
    volume.beta.kubernetes.io/storage-class: "coursenfs-storage"
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
  1. 第二种方法:我们可以设置这个 course-nfs-storage 的 StorageClass为 Kubernetes 的默认存储后端,可以用 kubectl patch 命令来更新:
kubectl patch storageclass course-nfs-storage -p'{"metadata": {"annotations":{"storageclass.kubernetes.io/is-defaultclass":"true"}}}'

在实际工作中,使用 StorageClass 更多的是 StatefulSet 类型的服务,StatefulSet 类型的服务我们也可以通过一个 volumeClaimTemplates 属性来直接使用StorageClass,如下:(test-statefulset-nfs.yaml)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nfs-web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nfs-web
  template:
    metadata:
    labels:
      app: nfs-web
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
      annotations:
        volume.beta.kubernetes.io/storage-class: course-nfs-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

实际上 volumeClaimTemplates 下面就是一个 PVC 对象的模板,就类似于我们这里 StatefulSet 下面的 template,实际上就是一个 Pod 的模板,我们不单独创建成 PVC 对象,而用这种模板就可以动态的去创建对象了,这种方式在 StatefulSet 类型的服务下面使用得非常多。

[root@master prometheus]# kubectl  get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS         AGE
test-pvc         Bound    pvc-fe7e15b0-da47-4f2c-a43a-aba53b1f8a87   1Gi        RWX            course-nfs-storage   9d
www-test-pvc-0   Bound    pvc-558f0315-7994-4b22-a32a-c3978c7794ce   5Gi        RWX            course-nfs-storage   9d

[root@master prometheus]# kubectl  get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS         REASON   AGE
pvc-558f0315-7994-4b22-a32a-c3978c7794ce   5Gi        RWX            Delete           Bound    default/www-test-pvc-0   course-nfs-storage            9d
pvc-fe7e15b0-da47-4f2c-a43a-aba53b1f8a87   1Gi        RWX            Delete           Bound    default/test-pvc         course-nfs-storage            9d

[root@master prometheus]# cd /data/k8s/
[root@master k8s]# ls
default-test-pvc-pvc-fe7e15b0-da47-4f2c-a43a-aba53b1f8a87  
default-www-test-pvc-0-pvc-558f0315-7994-4b22-a32a-c3978c7794ce  
html  prometheus
[root@master k8s]# pwd
/data/k8s

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值