专栏首页编程坑太多「走进k8s」Kubernetes1.15.1的持久化存储StorageClass(32)

「走进k8s」Kubernetes1.15.1的持久化存储StorageClass(32)

上次说了pv和pvc,但是前面讲的pv都是静态的,需要使用pvc的话前提就是需要创建一个pv,有没有一个动态的方式自动来创建呢,就要讲解一个动态的pv,它的名字是StorageClass。

(一)介绍

  • ① 官网

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#storageclass-v1-storage-k8s-io

  • ② 介绍

一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。介绍有点让你晕吧,实践让你深入了解。

(二)创建StorageClass

  • ① 创建StorageClass

用到一个 nfs-client 的自动配置程序,叫它 Provisioner,这个程序使用已经配置好的 nfs 服务器,来自动创建持久卷,也就是自动帮我们创建 PV。 https://github.com/kubernetes-incubator/external-storage

https://github.com/kubernetes-incubator/external-storage/blob/master/nfs-client/deploy/deployment.yaml

1.自动创建的 PV 以${namespace}-${pvcName}-${pvName}这样的命名格式创建在 NFS 服务器上的共享数据目录中。2.而当这个 PV 被回收后会以archieved-${namespace}-${pvcName}-${pvName}这样的命名格式存在 NFS 服务器上。3.下面的yaml涉及到3个yaml文件,都是参考github里面配置来的

修改nfs-clinet-deployment.yaml,里面的对应的参数替换成 nfs 配置,NFSSERVER更换成PV那次的 192.168.86.100,NFSPATH更换成/data/k8s

apiVersion: v1kind: ServiceAccountmetadata:  name: nfs-client-provisioner---kind: DeploymentapiVersion: extensions/v1beta1metadata:  name: nfs-client-provisionerspec:  replicas: 1  strategy:    type: Recreate  template:    metadata:      labels:        app: nfs-client-provisioner    spec:      serviceAccountName: nfs-client-provisioner      containers:        - name: nfs-client-provisioner          image: quay.io/external_storage/nfs-client-provisioner:latest          volumeMounts:            - name: nfs-client-root              mountPath: /persistentvolumes          env:            - name: PROVISIONER_NAME              value: fuseim.pri/ifs            - name: NFS_SERVER              value: 192.168.86.100            - name: NFS_PATH              value: /data/k8s      volumes:        - name: nfs-client-root          nfs:            server: 192.168.86.100            path: /data/k8s

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

kind: ServiceAccountapiVersion: v1metadata:  name: nfs-client-provisioner---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: nfs-client-provisioner-runnerrules:  - 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: ["create", "update", "patch"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: run-nfs-client-provisionersubjects:  - kind: ServiceAccount    name: nfs-client-provisioner    namespace: defaultroleRef:  kind: ClusterRole  name: nfs-client-provisioner-runner  apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: leader-locking-nfs-client-provisionerrules:  - apiGroups: [""]    resources: ["endpoints"]    verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: leader-locking-nfs-client-provisionersubjects:  - kind: ServiceAccount    name: nfs-client-provisioner    # replace with namespace where provisioner is deployed    namespace: defaultroleRef:  kind: Role  name: leader-locking-nfs-client-provisioner  apiGroup: rbac.authorization.k8s.io

创建 nfs-clinet-class.yaml,nfs-client 的 Deployment 声明完成后,创建一个StorageClass对象,provisioner对应的值一定要和上面的Deployment下面的 PROVISIONER_NAME 这个环境变量的值一样。

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: managed-nfs-storageprovisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'parameters:  archiveOnDelete: "false"

这步很重要,因为国内无法获取镜像quay.io/external_storage/nfs-client-provisioner:latest,这里通过阿里的获取,获取后更改image的名称的方式

docker pull registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisionerdocker tag registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner:latest quay.io/external_storage/nfs-client-provisioner:latest

执行这3个yaml文件

#因为已经把这三个文件放入指定的目录下了,直接通过下面这个命令运行目录下的所有yamlkubectl apply -f .

查看创建的结果

 kubectl get podskubectl get deploymentkubectl get sc# 上边的命令等于 kubectl get storageclass

(三)新建

上面把StorageClass资源对象创建成功了,下面申请一个标识使用StorageClass的pvc,看能否自动创建pv

  • ① 新建立test-sc-pvc.yaml,这里的managed-nfs-storage 就是上边创建StorageClass名称。

也可以设置一个系统默认的 storageclass.kubernetes.io/is-default-class=true,尽量不要使用系统默认的不方便管理,通过StorageClass的方式方便管理。

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: test-pvc  annotations:    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:  accessModes:  - ReadWriteMany  resources:    requests:      storage: 1Mi
  • ② 运行查看效果

只创建了一个pvc,自动生成一个对应的pv,

kubectl apply -f test-sc-pvc.yamlkubectl get sckubectl get pvckubectl get pv

(四)测试

  • ① 用 StorageClass 方式声明的 PVC 对象

参考官网的例子https://github.com/kubernetes-incubator/external-storage/blob/master/nfs-client/deploy/test-pod.yaml

kind: PodapiVersion: v1metadata:  name: test-podspec:  containers:  - name: test-pod    image: busybox    imagePullPolicy: IfNotPresent    command:    - "/bin/sh"    args:    - "-c"    - "touch /mnt/SUCCESS && exit 0 || exit 1"    volumeMounts:    - name: nfs-pvc      mountPath: "/mnt"  restartPolicy: "Never"  volumes:  - name: nfs-pvc    persistentVolumeClaim:      claimName: test-pvc

运行yml,用一个 busybox 容器,在 /mnt 目录下面新建一个 SUCCESS 的文件,然后把 /mnt 目录挂载到上面我们新建的 test-pvc 这个资源对象上面了,查看 nfs 服务器的共享数据目录下面查看下数据

 kubectl apply -f test-sc-pod.yamlls /data/k8s/cat /data/k8s/default-test-pvc-pvc-0ef7327d-3be8-4f15-8229-0a3d85b6069d/SUCCESS

生成的规则:${namespace}-${pvcName}-${pvName}

  • ② StatefulSet 不在手动创建pvc的方式
apiVersion: apps/v1beta1kind: StatefulSetmetadata:  name: nfs-webspec:  serviceName: "nginx"  replicas: 3  template:    metadata:      labels:        app: nfs-web    spec:      terminationGracePeriodSeconds: 10      containers:      - name: nginx        image: nginx:1.7.9        ports:        - containerPort: 80          name: web        volumeMounts:        - name: www          mountPath: /usr/share/nginx/html  volumeClaimTemplates:  - metadata:      name: www      annotations:        volume.beta.kubernetes.io/storage-class: managed-nfs-storage    spec:      accessModes: [ "ReadWriteOnce" ]      resources:        requests:          storage: 1Gi

volumeClaimTemplates 下面就是一个 PVC 对象的模板,就类似于这里 StatefulSet 下面的 template,实际上就是一个 Pod 的模板,我们不单独创建成 PVC 对象,而用这种模板就可以动态的去创建了对象了

 kubectl apply -f test-statefulset-sc.yamlkubectl get statefulset kubectl get pods

查看3个对应的pvc

kubectl get pvc

查看3个对应的pv

kubectl get pv

查看对应的nfs

ll /data/k8s/

也有对应的3个数据目录,这就是我们的 StorageClass 的使用方法,对于 StorageClass 多用于 StatefulSet 类型的服务。都是自动生成pvc,自动生成pv,自动产生目录nfs。

PS:这样的配置多个副本的共享目录不在一起,之前pod共享目录的方式,多个副本在一个共享目录。自从有了storageclass 他们之前都可以不放在一起,根据副本数量分别的管理,这个多用于集群中,mysql集群,后面再说。

本文分享自微信公众号 - 编程坑太多(idig88),作者:诸葛阿明

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「docker实战篇」python的docker-docker-appium镜像(30)

    PS:下载的过程中比较漫长,下次咱们一起看看docker appium如何连接windows下的虚拟机。

    IT故事会
  • 「小程序JAVA实战」小程序模块之间引用(19)

    1.js代码块可以在页面中被引入使用 2.定义*.wxs,module.exports暴露接口和属性

    IT故事会
  • 「走进k8s」Kubernetes1.15.1的持久化存储PVC(34)

    PS:如果这时删除了PV和PVC,共享目录中的文件也同时被删除了,这跟设置的回收版本有关系,回收策略是 Recycle,PVC 给删除掉了,然后回收了数据。上次...

    IT故事会
  • kubernetes中持久化存储之StorageClass

    上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对...

    极客运维圈
  • 细思极恐!大数据和机器学习揭示十二星座的真实面目

    ? 原文链接:http://bbs.pinggu.org/thread-5905227-1-1.html “为什么我的论文总发表不了,是不是我天生就不是做...

    CDA数据分析师
  • 细思极恐!大数据和机器学习揭示十二星座的真实面目

    作者:经管之家 “为什么我的论文总发表不了,是不是我天生就不是做研究的料?”很多同学在写论文中遇到挫折,经常会发出这样的疑问。那么今天我就用星座,真实的数据和“...

    钱塘数据
  • 细思极恐!大数据和机器学习揭示十二星座的真实面目

    原文链接:http://bbs.pinggu.org/thread-5905227-1-1.html

    华章科技
  • Python Django 协程报错,进程池、线程池与异步调用、回调机制

    concurrent.futures模块提供了高度封装的异步调用接口  ThreadPoolExecutor:线程池,提供异步调用  ProcessPoolEx...

    py3study
  • 使用Python编写网络爬虫抓取视频下载资源

    Python因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些模块的存在,用Python来写爬虫就简直易于反掌了。...

    机器学习AI算法工程
  • bootstrap 滚动监听

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bootstrap 实例 - 滚...

    用户5760343

扫码关注云+社区

领取腾讯云代金券