当前位置:   article > 正文

k8s的存储卷、数据卷---动态PV创建_kubernetes deployment 使用动态vpc

kubernetes deployment 使用动态vpc

当发布PVC之后可以生成PV,还可以在动态服务器上直接生成挂载目录。PVC直接绑定和使用PV。

动态PV需要两个组件

  1. 存储卷插件:Provisioner(存储分配器)根据定义的属性创建PV

  2. StorageClass:定义属性

存储卷插件

存储卷插件:k8s本身不支持动态PV创建,不包括NFS。所以需要声明和安装一个外部插件Provisioner(存储分配器)

Provisioner(存储分配器)可以动态的创建PV。根据PVC的请求自动绑定和使用。

StorageClass

StorageClass来定义PV属性、存储类型、大小、回收策略等等。

使用NFS实现动态PV。NFS支持的方式NFS-client。先创建Provisioner来适配NFS-client

需要先创建nfs-client-Provisioner

动态PV实验举例

实验架构图:

serviceAccount:NFS PRovisioner:是一个插件,没有权限是无法在集群当中获取k8s的信息的。插件要有权限才能监听APIserver。获取get,list(获取集中列表资源)create delete.

开始实验:

  1. 实验架构:
  2. master01: 20.0.0.32
  3. ndoe01: 20.0.0.34
  4. node02: 20.0.0.35
  5. k8s5: 20.0.0.36 NFS服务
  6. k8s5
  7. mkdir k8s
  8. chmod 777 k8s/
  9. vim /etc/exports
  10. /opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)
  11. systemctl restart rpcbind
  12. systemctl restart nfs
  13. showmount -e
  14. 确定每台主机上都能查看
  15. serviceAccount:NFS PRovisioner:是一个插件,没有权限是无法在集群当中获取k8s的信息的。插件要有权限才能监听APIserver。获取get,list(获取集中列表资源)create delete.
  16. 给NFS PRovisioner创建一个账户
  17. [root@master01 ~]# cd /opt/
  18. [root@master01 opt]# vim nfs-client-rbac.yaml
  19. #定义账户类型和名称
  20. apiVersion: v1
  21. kind: ServiceAccount
  22. metadata:
  23. name: nfs-client-provisioner
  24. #定义账户的名称叫nfs-client-provisioner
  25. ---
  26. #定义类型名称和权限以及动作
  27. apiVersion: rbac.authorization.k8s.io/v1
  28. kind: ClusterRole
  29. metadata:
  30. name: nfs-client-provisioner-role
  31. rules:
  32. #定义权限
  33. - apiGroups: [""]
  34. #apiGroups定义规则可以使用哪个api组的权限
  35. #[""]:如果为空表示直接使用api的核心资源
  36. resources: ["persistentvolumes"]
  37. #定义在核心组中需要的资源.定义获取PV的相关资源
  38. verbs: ["get","list","watch","create","delete"]
  39. #表示权限需要哪些动作
  40. #watch表示监听
  41. #表示声明的账号可以对PV进行这些操作
  42. - apiGroups: [""]
  43. resources: ["persistentvolumeclaims"]
  44. #定义获取pvc的相关组件
  45. verbs: ["watch","get","list","update"]
  46. #表示权限需要哪些动作
  47. - apiGroups: ["storage.k8s.io"]
  48. resources: ["storageclass"]
  49. verbs: ["get","watch","get"]
  50. - apiGroups: [""]
  51. #获取核心组件中的事件信息
  52. #api在调用时候的所有事件信息
  53. resources: ["events"]
  54. verbs: ["get","create","watch","update","patch"]
  55. - apiGroups: [""]
  56. resources: ["endpoints"]
  57. #获取服务节点的终端IP地址
  58. verbs: ["delete","create","get","watch","update","patch","list"]
  59. #获取权限需要哪些动作
  60. ---
  61. #开始绑定角色和权限
  62. apiVersion: rbac.authorization.k8s.io/v1
  63. kind: ClusterRoleBinding
  64. metadata:
  65. name: nfs-client-provisioner-bind
  66. subjects:
  67. - kind: ServiceAccount
  68. name: nfs-client-provisioner
  69. #声明账户的名称需要一一对应
  70. namespace: default
  71. #要在哪个有权限就声明使用哪个命名空间
  72. roleRef:
  73. kind: ClusterRole
  74. name: nfs-client-provisioner-role
  75. #声明调用权限的名称
  76. apiGroup: rbac.authorization.k8s.io
  77. #声明api的组名
  78. #将定义好的集群规则定义好的权限都赋给nfs-client-provisioner账户
  79. kubectl apply -f nfs-client-rbac.yaml
  80. 角色和权限都创建完毕

部署插件


NFS-privisioner。使用deployment来部署插件 pod
1.20之后又一个新的机制
selfLink:API的资源对象之一,消失资源对象在集权当中滋生的一个连接。self Link是一个唯一表示符号。可以用于表示k8s集群当中每个资源的对象。
selfLink的值是一个URL。指向该资源对象的k8s的api路径
更好的实现资源对象的查找和引用。

  1. [root@master01 opt]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
  2. - --feature-gates=RemoveSelfLink=false
  3. #feature-gates:在不破坏现在又规则以及功能基础上引入新功能或者修改现在又的功能机制。禁用不影响之前的规则
  4. [root@master01 opt]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
  5. [root@master01 opt]# kubectl get pod -n kube-system
  6. kubectl delete pod -n kube-system kube-apiserver
  7. 部署nfs-provisioner的插件
  8. nfs的provisioner的客户端,以pod的方式运行在集群中监听k8s当中的pv请求。动态的创建于nfs服务相关的PV
  9. 容器使用的配置,在provisioner当中定义好环境变量。传给容器。storageclass的名称、nfs服务器的地址以及nfs的目录
  10. 开始部署:
  11. [root@master01 opt]# vim nfs-client-provisioner.yaml
  12. apiVersion: apps/v1
  13. kind: Deployment
  14. metadata:
  15. name: nfs-provisioner
  16. labels:
  17. app: nfs1
  18. spec:
  19. replicas: 1
  20. selector:
  21. matchLabels:
  22. app: nfs1
  23. template:
  24. metadata:
  25. labels:
  26. app: nfs1
  27. spec:
  28. serviceAccountName: nfs-client-provisioner
  29. containers:
  30. #指定容器
  31. - name: nfs1
  32. image: quay.io/external_storage/nfs-client-provisioner:latest
  33. volumeMounts:
  34. - name: nfs
  35. mountPath: /persistentvolumes
  36. env:
  37. - name: PROVISIONER_NAME
  38. value: nfs-storage
  39. #配置provisioner的账户名称。要和storageclass的资源名称一致
  40. - name: NFS_SERVER
  41. #nfs共享服务器的地址
  42. value: 20.0.0.36
  43. - name: NFS_PATH
  44. value: /opt/k8s
  45. #把变量传递给内部容器,设置共享服务器和共享目录
  46. volumes:
  47. - name: nfs
  48. nfs:
  49. server: 20.0.0.36
  50. path: /opt/k8s
  51. #表示后续在哪创建存储卷。定义后续存储卷存储的位置。
  52. #provisioner的作用就是创建pv
  53. #定义pv的属性
  54. #告诉你nfs共享的服务器
  55. #告诉你共享目录
  56. #容器和本地目录进行挂载
  57. #当有符合storageclass的pvc请求来了之后
  58. #这个nfs-client-provisioner就会往定义的服务器上自动创建存储目录
  59. [root@master01 opt]# kubectl apply -f nfs-client-provisioner.yaml

 

部署PVC的存储卷和策略

  1. [root@master01 opt]# vim nfs-client-storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: nfs-client-storageclass
  6. #匹配provisioner
  7. provisioner: nfs-storage
  8. #定义pv的相关属性
  9. parameters:
  10. archiveOnDelete: "false"
  11. #表示当pvc被删除之后pv的状态。有false和true两种
  12. #如果是false。pvc如果被删除那么pv的状态将是released。可以人工调整继续使用
  13. #如果定义是true,那么pv的状态将是Archived。表示pv将不再可用。
  14. #一般来说都用false
  15. reclaimPolicy: Retain
  16. #定义pv的回收策略。reclaimPolicy定义的只支持两种retain和delete
  17. allowVolumeExpansion: true
  18. #pv的存储空间可以动态的扩缩容
  19. [root@master01 opt]# kubectl apply -f nfs-client-storageclass.yaml
  20. [root@master01 opt]# kubectl get storageclasses.storage.k8s.io
  21. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  22. nfs-client-storageclass nfs-storage Retain Immediate true
  23. name:storageclass的名称
  24. PROVISIONER:对应的创建pv的PROVISIONER插件
  25. RECLAIMPOLICY:回收策略。保留
  26. VOLUMEBINDINGMODE:卷绑定模式。lmmediate表示pvc请求创建pv时,系统会立即绑定一个可用的pv
  27. waitForFirstConsumer:第一个使用者出现之后再绑定pv
  28. ALLOWVOLUMEEXPANSION:true表示可以再运行时对pv进行扩容
  29. AGE:生命周期

 

开始创建pod

  1. [root@master01 opt]# vim pvc-pod.yaml
  2. #创建PVC
  3. apiVersion: v1
  4. kind: PersistentVolumeClaim
  5. metadata:
  6. name: nfs-pvc
  7. spec:
  8. accessModes:
  9. - ReadWriteMany
  10. storageClassName: nfs-client-storageclass
  11. resources:
  12. requests:
  13. storage: 2Gi
  14. #创建一个pvc,名称为nfs-pvc,使用的pv属性是nfs-client-storageclass定义的属性
  15. #创建的pv大小是2Gi最后由provisioner
  16. ---
  17. apiVersion: apps/v1
  18. kind: Deployment
  19. metadata:
  20. name: nginx1
  21. labels:
  22. app: nginx1
  23. spec:
  24. replicas: 1
  25. selector:
  26. matchLabels:
  27. app: nginx1
  28. template:
  29. metadata:
  30. labels:
  31. app: nginx1
  32. spec:
  33. containers:
  34. - name: nginx1
  35. image: nginx:1.22
  36. volumeMounts:
  37. - name: html
  38. mountPath: /usr/share/nginx/html
  39. volumes:
  40. - name: html
  41. persistentVolumeClaim:
  42. #指定pvc
  43. claimName: nfs-pvc
  44. #pod引用上面的pvc

检验实验结果

  1. [root@k8s5 k8s]# cd /opt/k8s
  2. [root@k8s5 k8s]# ls
  3. [root@k8s5 k8s]# cd default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc/
  4. [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
  5. [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# echo 123 > index.html
  6. [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
  7. [root@master01 opt]# curl 10.244.2.147:80
  8. 123

检验回收策略

Retain策略

  1. [root@master01 opt]# vim nfs-client-storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: nfs-client-storageclass
  6. #匹配provisioner
  7. provisioner: nfs-storage
  8. #定义pv的相关属性
  9. parameters:
  10. archiveOnDelete: "false"
  11. #表示当pvc被删除之后pv的状态。有false和true两种
  12. #如果是false。pvc如果被删除那么pv的状态将是released。可以人工调整继续使用
  13. #如果定义是true,那么pv的状态将是Archived。表示pv将不再可用。
  14. #一般来说都用false
  15. reclaimPolicy: Retain
  16. allowVolumeExpansion: true
  17. #pv的存储空间可以动态的扩缩容
  18. 开始测试资源回收策略:
  19. reclaimPolicy: Retain
  20. root@k8s5 k8s]# cd default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc/
  21. [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
  22. [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# echo 123 > index.html
  23. [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
  24. index.html
  25. [root@master01 opt]# kubectl get pod -o wide
  26. [root@master01 opt]# curl 10.244.2.147:80
  27. [root@master01 opt]# kubectl delete deployments.apps nginx2
  28. #删除控制器
  29. [root@master01 opt]# kubectl delete pvc nfs-pvc2
  30. #删除PVC
  31. [root@master01 opt]# kubectl delete pv pvc-c15e8810-62e5-49eb-a7f1-282b5292347
  32. #删除PV
  33. 回到k8s5查看共享目录依旧存在

 

Delete策略

  1. [root@master01 opt]# vim nfs-client-storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5. name: nfs-client-storageclass
  6. #匹配provisioner
  7. provisioner: nfs-storage
  8. #定义pv的相关属性
  9. parameters:
  10. archiveOnDelete: "false"
  11. #表示当pvc被删除之后pv的状态。有false和true两种
  12. #如果是false。pvc如果被删除那么pv的状态将是released。可以人工调整继续使用
  13. #如果定义是true,那么pv的状态将是Archived。表示pv将不再可用。
  14. #一般来说都用false
  15. reclaimPolicy: Delete
  16. allowVolumeExpansion: true
  17. #pv的存储空间可以动态的扩缩容
  18. reclaimPolicy: Delete
  19. [root@k8s5 k8s]# cd default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b
  20. [root@k8s5 default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b]# ls
  21. [root@k8s5 default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b]# echo 456 > index.html
  22. [root@k8s5 default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b]# cd /opt/k8s/
  23. [root@k8s5 k8s]# ls
  24. [root@master01 opt]# kubectl delete deployments.apps nginx2
  25. #删除控制器
  26. [root@master01 opt]# kubectl delete pvc nfs-pvc2
  27. #删除PVC
  28. [root@master01 opt]# kubectl delete pv pvc-c15e8810-62e5-49eb-a7f1-282b5292347
  29. #删除PV
  30. 回到k8s5查看共享目录自动消失
  31. 实验完成!!!!

 

rbac:Role-based ACCESS CONTROL:基础权限配置。用来定义角色在集群当中可以使用的权限。

provisioner的作用就是创建pv

nfs-client-provisioner.yaml的作用就是定义pv的属性告诉你nfs共享的服务器。告诉你共享目录。容器和本地目录进行挂载。当有符合storageclass的pvc请求来了之后这个nfs-client-provisioner就会往定义的服务器上自动创建存储目录

工作流程图:

 

总结

动态pv的两个组件:

provisioner插件:支持nfs。创建pv目录

strogeclass:定义pv的属性。

动态pv的默认策略是删除

动态pv删除pvc的状态。最好设置为releassed

  1. 给卷插件创建账号,确保集群可以在集群内部通信,获取资源,监听事件。创建和删除以及更新pv

  2. 创建卷插件的pod。由卷插件的pod创建pv

  3. 定义storageclass给pv赋予属性。属性包括:pvc被删除之后pv的状态,以及回收策略。

  4. 创建pvc

  5. 实验完成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/420125
推荐阅读
  

闽ICP备14008679号