kubernetes数据持久化StorageClass动态供给(二)

打印 上一主题 下一主题

主题 727|帖子 727|积分 2181


  • 存储类的好处之一便是支持PV的动态供给,它甚至可以直接被视作为PV的创建模版,用户用到持久性存储时,需要通过创建PVC来绑定匹配的PV,此类操作需求较大,或者当管理员手动创建的PV无法满足PVC的所有需求时,系统按PVC的需求标准动态创建适配的PV会为存储管理带来极大的灵活性,不过仅那些属于StorageClass的PVC和PV才能产生绑定关系,即没有指定StorageClass的PVC只能绑定同类的PV。
  • 存储类对象的名称至关重要,它是用户调用的标识,创建存储类对象时,除了名称之外,还需要为其定义三个关键字段。provisioner、parameter和reclaimPolicy。
  • 所以kubernetes提供了一种可以动态分配的工作机制,可用自动创建PV,该机制依赖于StorageClass的API,将某个存储节点划分1T给kubernetes使用,当用户申请5Gi的PVC时,会自动从这1T的存储空间去创建一个5Gi的PV,而后自动与之进行关联绑定。
  • 动态PV供给的启用需要事先创建一个存储类,不同的Provisoner的创建方法各有不同,并非所有的存储卷插件都由Kubernetes内建支持PV动态供给。
2.基于NFS实现动态供应

由于kubernetes内部不包含NFS驱动,所以需要使用外部驱动nfs-subdir-external-provisioner是一个自动供应器,它使用NFS服务端来支持动态供应。
NFS-subdir-external- provisioner实例负责监视PersistentVolumeClaims请求StorageClass,并自动为它们创建NFS所支持的PresistentVolumes。
GitHub地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
2.1 准备NFS服务端的共享目录

这里的意思是要把哪个目录给kubernetes来使用。把目录共享出来。
  1. [root@kn-server-node02-15 ~]# ll /data/
  2. 总用量 0
  3. [root@kn-server-node02-15 ~]# showmount -e 10.0.0.15
  4. Export list for 10.0.0.15:
  5. /data        10.0.0.0/24
复制代码
2.2 安装NFS-Server驱动。

首先创建RBAC权限。
  1. [root@kn-server-master01-13 nfs-provisioner]# cat nfs-rbac.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5.   name: nfs-client-provisioner
  6.   # replace with namespace where provisioner is deployed
  7.   namespace: default
  8. ---
  9. kind: ClusterRole
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. metadata:
  12.   name: nfs-client-provisioner-runner
  13. rules:
  14.   - apiGroups: [""]
  15.     resources: ["nodes"]
  16.     verbs: ["get", "list", "watch"]
  17.   - apiGroups: [""]
  18.     resources: ["persistentvolumes"]
  19.     verbs: ["get", "list", "watch", "create", "delete"]
  20.   - apiGroups: [""]
  21.     resources: ["persistentvolumeclaims"]
  22.     verbs: ["get", "list", "watch", "update"]
  23.   - apiGroups: ["storage.k8s.io"]
  24.     resources: ["storageclasses"]
  25.     verbs: ["get", "list", "watch"]
  26.   - apiGroups: [""]
  27.     resources: ["events"]
  28.     verbs: ["create", "update", "patch"]
  29. ---
  30. kind: ClusterRoleBinding
  31. apiVersion: rbac.authorization.k8s.io/v1
  32. metadata:
  33.   name: run-nfs-client-provisioner
  34. subjects:
  35.   - kind: ServiceAccount
  36.     name: nfs-client-provisioner
  37.     # replace with namespace where provisioner is deployed
  38.     namespace: default
  39. roleRef:
  40.   kind: ClusterRole
  41.   name: nfs-client-provisioner-runner
  42.   apiGroup: rbac.authorization.k8s.io
  43. ---
  44. kind: Role
  45. apiVersion: rbac.authorization.k8s.io/v1
  46. metadata:
  47.   name: leader-locking-nfs-client-provisioner
  48.   # replace with namespace where provisioner is deployed
  49.   namespace: default
  50. rules:
  51.   - apiGroups: [""]
  52.     resources: ["endpoints"]
  53.     verbs: ["get", "list", "watch", "create", "update", "patch"]
  54. ---
  55. kind: RoleBinding
  56. apiVersion: rbac.authorization.k8s.io/v1
  57. metadata:
  58.   name: leader-locking-nfs-client-provisioner
  59.   # replace with namespace where provisioner is deployed
  60.   namespace: default
  61. subjects:
  62.   - kind: ServiceAccount
  63.     name: nfs-client-provisioner
  64.     # replace with namespace where provisioner is deployed
  65.     namespace: default
  66. roleRef:
  67.   kind: Role
  68.   name: leader-locking-nfs-client-provisioner
  69.   apiGroup: rbac.authorization.k8s.io
  70. [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f nfs-rbac.yaml
  71. serviceaccount/nfs-client-provisioner created
  72. clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
  73. clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
  74. role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
  75. rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
复制代码
2.3 部署NFS-Provisioner
  1. [root@kn-server-master01-13 nfs-provisioner]# cat nfs-provisioner-deploy.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: nfs-client-provisioner
  6.   labels:
  7.     app: nfs-client-provisioner
  8.   # replace with namespace where provisioner is deployed
  9.   namespace: default
  10. spec:
  11.   replicas: 1
  12.   strategy:
  13.     type: Recreate
  14.   selector:
  15.     matchLabels:
  16.       app: nfs-client-provisioner
  17.   template:
  18.     metadata:
  19.       labels:
  20.         app: nfs-client-provisioner
  21.     spec:
  22.       serviceAccountName: nfs-client-provisioner
  23.       containers:
  24.         - name: nfs-client-provisioner
  25.           image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2  镜像在国内是拉取不到的,因此为下载下来了放在我的docker hub。 替换为lihuahaitang/nfs-subdir-external-provisioner:v4.0.2
  26.           volumeMounts:
  27.             - name: nfs-client-root
  28.               mountPath: /persistentvolumes
  29.           env:
  30.             - name: PROVISIONER_NAME
  31.               value: k8s-sigs.io/nfs-subdir-external-provisioner   NFS-Provisioner的名称,后续StorageClassName要与该名称保持一致
  32.             - name: NFS_SERVER    NFS服务器的地址
  33.               value: 10.0.0.15  
  34.             - name: NFS_PATH
  35.               value: /data
  36.       volumes:
  37.         - name: nfs-client-root
  38.           nfs:
  39.             server: 10.0.0.15
  40.             path: /data
  41. [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f nfs-provisioner-deploy.yaml
  42. deployment.apps/nfs-client-provisioner created
  43. Pod正常运行。
  44. [root@kn-server-master01-13 nfs-provisioner]# kubectl get pods
  45. NAME                                      READY   STATUS    RESTARTS   AGE
  46. nfs-client-provisioner-57d6d9d5f6-dcxgq   1/1     Running   0          2m25s
  47. describe查看Pod详细信息;
  48. [root@kn-server-master01-13 nfs-provisioner]# kubectl describe pods nfs-client-provisioner-57d6d9d5f6-dcxgq
  49. Name:         nfs-client-provisioner-57d6d9d5f6-dcxgq
  50. Namespace:    default
  51. Priority:     0
  52. Node:         kn-server-node02-15/10.0.0.15
  53. Start Time:   Mon, 28 Nov 2022 11:19:33 +0800
  54. Labels:       app=nfs-client-provisioner
  55.               pod-template-hash=57d6d9d5f6
  56. Annotations:  <none>
  57. Status:       Running
  58. IP:           192.168.2.82
  59. IPs:
  60.   IP:           192.168.2.82
  61. Controlled By:  ReplicaSet/nfs-client-provisioner-57d6d9d5f6
  62. Containers:
  63.   nfs-client-provisioner:
  64.     Container ID:   docker://b5ea240a8693185be681714747f8e0a9f347492a24920dd68e629effb3a7400f
  65.     Image:          k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2  镜像来自k8s.gcr.io
  66.     Image ID:       docker-pullable://k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner@sha256:63d5e04551ec8b5aae83b6f35938ca5ddc50a88d85492d9731810c31591fa4c9
  67.     Port:           <none>
  68.     Host Port:      <none>
  69.     State:          Running
  70.       Started:      Mon, 28 Nov 2022 11:20:12 +0800
  71.     Ready:          True
  72.     Restart Count:  0
  73.     Environment:
  74.       PROVISIONER_NAME:  k8s-sigs.io/nfs-subdir-external-provisioner
  75.       NFS_SERVER:        10.0.0.15
  76.       NFS_PATH:          /data
  77.     Mounts:
  78.       /persistentvolumes from nfs-client-root (rw)
  79.       /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-q2z8w (ro)
  80. Conditions:
  81.   Type              Status
  82.   Initialized       True
  83.   Ready             True
  84.   ContainersReady   True
  85.   PodScheduled      True
  86. Volumes:
  87.   nfs-client-root:
  88.     Type:      NFS (an NFS mount that lasts the lifetime of a pod)
  89.     Server:    10.0.0.15
  90.     Path:      /data
  91.     ReadOnly:  false
  92.   kube-api-access-q2z8w:
  93.     Type:                    Projected (a volume that contains injected data from multiple sources)
  94.     TokenExpirationSeconds:  3607
  95.     ConfigMapName:           kube-root-ca.crt
  96.     ConfigMapOptional:       <nil>
  97.     DownwardAPI:             true
  98. QoS Class:                   BestEffort
  99. Node-Selectors:              <none>
  100. Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
  101.                              node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
  102. Events:
  103.   Type    Reason     Age    From               Message
  104.   ----    ------     ----   ----               -------
  105.   Normal  Scheduled  3m11s  default-scheduler  Successfully assigned default/nfs-client-provisioner-57d6d9d5f6-dcxgq to kn-server-node02-15
  106.   Normal  Pulling    3m11s  kubelet            Pulling image "k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2"
  107.   Normal  Pulled     2m32s  kubelet            Successfully pulled image "k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2" in 38.965869132s
  108.   Normal  Created    2m32s  kubelet            Created container nfs-client-provisioner
  109.   Normal  Started    2m32s  kubelet            Started container nfs-client-provisioner
复制代码
2.4 创建StorageClass

创建NFS StorageClass动态供应商。
  1. [root@kn-server-master01-13 nfs-provisioner]# cat storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass    类型为storageclass
  4. metadata:
  5.   name: nfs-provisioner-storage    PVC申请时需明确指定的storageclass名称
  6.   annotations:
  7.     storageclass.kubernetes.io/is-default-class: "true"
  8. provisioner: k8s-sigs.io/nfs-subdir-external-provisioner  供应商名称,必须和上面创建的"PROVISIONER_NAME"保持一致
  9. parameters:
  10.   archiveOnDelete: "false" 如果值为false,删除pvc后也会删除目录内容,"true"则会对数据进行保留
  11.   pathPattern: "${.PVC.namespace}/${.PVC.name}" 创建目录路径的模板,默认为随机命名。
  12. [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f storageclass.yaml
  13. storageclass.storage.k8s.io/nfs-provisioner-storage created
  14. storage简写sc
  15. [root@kn-server-master01-13 nfs-provisioner]# kubectl get sc
  16. NAME                      PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  17. nfs-provisioner-storage   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  3s
  18. describe查看配详细信息。
  19. [root@kn-server-master01-13 nfs-provisioner]# kubectl describe sc
  20. Name:            nfs-provisioner-storage
  21. IsDefaultClass:  Yes
  22. Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"nfs-provisioner-storage"},"parameters":{"archiveOnDelete":"false","pathPattern":"${.PVC.namespace}/${.PVC.name}"},"provisioner":"k8s-sigs.io/nfs-subdir-external-provisioner"}
  23. ,storageclass.kubernetes.io/is-default-class=true
  24. Provisioner:           k8s-sigs.io/nfs-subdir-external-provisioner
  25. Parameters:            archiveOnDelete=false,pathPattern=${.PVC.namespace}/${.PVC.name}
  26. AllowVolumeExpansion:  <unset>
  27. MountOptions:          <none>
  28. ReclaimPolicy:         Delete
  29. VolumeBindingMode:     Immediate
  30. Events:                <none>
复制代码
2.5 创建PVC,自动关联PV
  1. [root@kn-server-master01-13 nfs-provisioner]# cat nfs-pvc-test.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: nfs-pvc-test
  6. spec:
  7.   storageClassName: "nfs-provisioner-storage"
  8.   accessModes:
  9.   - ReadWriteMany
  10.   resources:
  11.     requests:
  12.       storage: 0.5Gi
  13. 这里的PV的名字是随机的,数据的存储路径是根据pathPattern来定义的。
  14. [root@kn-server-node02-15 data]# ls
  15. default
  16. [root@kn-server-node02-15 data]# ll default/
  17. 总用量 0
  18. drwxrwxrwx 2 root root 6 11月 28 13:56 nfs-pvc-test
  19. [root@kn-server-master01-13 pv]# kubectl get pv
  20. pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f   512Mi      RWX            Delete           Bound         default/nfs-pvc-test   nfs-provisioner-storage            5m19s
  21. [root@kn-server-master01-13 nfs-provisioner]# kubectl describe pv pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f
  22. Name:            pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f
  23. Labels:          <none>
  24. Annotations:     pv.kubernetes.io/provisioned-by: k8s-sigs.io/nfs-subdir-external-provisioner
  25. Finalizers:      [kubernetes.io/pv-protection]
  26. StorageClass:    nfs-provisioner-storage
  27. Status:          Bound
  28. Claim:           default/nfs-pvc-test
  29. Reclaim Policy:  Delete
  30. Access Modes:    RWX
  31. VolumeMode:      Filesystem
  32. Capacity:        512Mi
  33. Node Affinity:   <none>
  34. Message:         
  35. Source:
  36.     Type:      NFS (an NFS mount that lasts the lifetime of a pod)
  37.     Server:    10.0.0.15
  38.     Path:      /data/default/nfs-pvc-test
  39.     ReadOnly:  false
  40. Events:        <none>
  41. describe可用看到更详细的信息
  42. root@kn-server-master01-13 nfs-provisioner]# kubectl describe pvc
  43. Name:          nfs-pvc-test
  44. Namespace:     default
  45. StorageClass:  nfs-provisioner-storage
  46. Status:        Bound
  47. Volume:        pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f
  48. Labels:        <none>
  49. Annotations:   pv.kubernetes.io/bind-completed: yes
  50.                pv.kubernetes.io/bound-by-controller: yes
  51.                volume.beta.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  52. Finalizers:    [kubernetes.io/pvc-protection]
  53. Capacity:      512Mi    定义的存储大小
  54. Access Modes:  RWX    卷的读写
  55. VolumeMode:    Filesystem
  56. Used By:       <none>
  57. Events:
  58.   Type    Reason                 Age   From                                                                                                                      Message
  59.   ----    ------                 ----  ----                                                                                                                      -------
  60.   Normal  ExternalProvisioning   13m   persistentvolume-controller                                                                                               waiting for a volume to be created, either by external provisioner "k8s-sigs.io/nfs-subdir-external-provisioner" or manually created by system administrator
  61.   Normal  Provisioning           13m   k8s-sigs.io/nfs-subdir-external-provisioner_nfs-client-provisioner-57d6d9d5f6-dcxgq_259532a3-4dba-4183-be6d-8e8b320fc778  External provisioner is provisioning volume for claim "default/nfs-pvc-test"
  62.   Normal  ProvisioningSucceeded  13m   k8s-sigs.io/nfs-subdir-external-provisioner_nfs-client-provisioner-57d6d9d5f6-dcxgq_259532a3-4dba-4183-be6d-8e8b320fc778  Successfully provisioned volume pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f
复制代码
2.6 创建Pod,测试数据是否持久。
  1. [root@kn-server-master01-13 nfs-provisioner]# cat nginx-pvc-test.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nginx-sc
  6. spec:
  7.   containers:
  8.   - name: nginx
  9.     image: nginx
  10.     volumeMounts:
  11.     - name: nginx-page
  12.       mountPath: /usr/share/nginx/html
  13.   volumes:
  14.   - name: nginx-page
  15.     persistentVolumeClaim:
  16.       claimName: nfs-pvc-test
  17. [root@kn-server-master01-13 nfs-provisioner]# kubectl apply -f nginx-pvc-test.yaml
  18. pod/nginx-sc created
  19. [root@kn-server-master01-13 nfs-provisioner]# kubectl describe pvc
  20. Name:          nfs-pvc-test
  21. Namespace:     default
  22. StorageClass:  nfs-provisioner-storage
  23. Status:        Bound
  24. Volume:        pvc-8ed67f7d-d829-4d87-8c66-d8a85f50772f
  25. Labels:        <none>
  26. Annotations:   pv.kubernetes.io/bind-completed: yes
  27.                pv.kubernetes.io/bound-by-controller: yes
  28.                volume.beta.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  29. Finalizers:    [kubernetes.io/pvc-protection]
  30. Capacity:      512Mi
  31. Access Modes:  RWX
  32. VolumeMode:    Filesystem
  33. Used By:       nginx-sc   可以看到的是nginx-sc这个Pod在使用这个PVC。
  34. 和上面名称是一致的。
  35. [root@kn-server-master01-13 nfs-provisioner]# kubectl get pods nginx-sc
  36. NAME       READY   STATUS    RESTARTS   AGE
  37. nginx-sc   1/1     Running   0          2m43s
  38. 尝试写入数据
  39. [root@kn-server-node02-15 data]# echo "haitang" > /data/default/nfs-pvc-test/index.html
  40. 访问测试。
  41. [root@kn-server-master01-13 nfs-provisioner]# curl 192.168.2.83
  42. haitang
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表