当前位置:   article > 正文

k8s存储卷之动态

k8s存储卷之动态
动态pv需要两个组件

1、卷插件,k8s本身支持的动态pv创建不包含NFS,需要声明和安装一个外部插件

Provisioner	存储分配器,动态创建pv,然后根据pvc的请求自动绑定和使用

2、StorageClass,用来定义pv的属性,存储类型,大小,回收策略

使用NFS来实现动态pv,NFS支持的方式nfs-cli,Provisioner来适配nfs-client

nfs-client-Provisioner 卷插件

部署动态

1、在Harbor上部署
  1. 进入opt目录下
  2. mkdir k8s
  3. chmod 777 k8s
  4. vim /etc/exports
  5. /opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)
  6. systemctl restart rpcbind
  7. systemctl restart nfs
  8. 在本机上测试
  9. [root@k8s4 opt]# showmount -e
  10. Export list for k8s4:
  11. /opt/k8s 20.0.0.0/24
  12. 在节点上测试
  13. [root@node02 ~]# showmount -e 20.0.0.73
  14. Export list for 20.0.0.73:
  15. /opt/k8s 20.0.0.0/24
2、在主节点上部署serviceAccount    Nfs-privisioner  storageclasses
部署serviceAccount 

NFS PRovisioner是一个插件,没有权限是无法再集群当中获取k8s的消息,插件要有权限能够监听APIserver,获取getlist

rbac  Role-based Access Control
定义角色在集群当中可以使用的权限

  1. vim nfs-client-rbac.yaml
  2. #定义角色
  3. apiVersion: v1
  4. kind: ServiceAccount
  5. metadata:
  6. name: nfs-client-provisioner
  7. ---
  8. #定义角色的权限
  9. apiVersion: rbac.authorization.k8s.io/v1
  10. kind: ClusterRole
  11. metadata:
  12. name: nfs-client-provisioner-role
  13. rules:
  14. - apiGroups: [""]
  15. #apiGroups定义了规则使用那个API的组,空字符"",直接使用API的核心组的资源
  16. resources: ["persistentvolumes"]
  17. verbs: ["get","list","watch","create","delete"]
  18. #表示权限的动作
  19. - apiGroups: [""]
  20. resources: ["persistentvolumeclaims"]
  21. verbs: ["watch","get","list","update"]
  22. - apiGroups: ["storage.k8s.io"]
  23. resources: ["storageclasses"]
  24. verbs: ["get","list","watch"]
  25. - apiGroups: [""]
  26. #获取所有事件信息
  27. resources: ["events"]
  28. verbs: ["list","watch","create","update","patch"]
  29. - apiGroups: [""]
  30. resources: ["endpoints"]
  31. verbs: ["create","delete","get","list","watch","patch","update"]
  32. ---
  33. apiVersion: rbac.authorization.k8s.io/v1
  34. kind: ClusterRoleBinding
  35. metadata:
  36. name: nfs-client-provisioner-bind
  37. subjects:
  38. - kind: ServiceAccount
  39. name: nfs-client-provisioner
  40. namespace: default
  41. roleRef:
  42. kind: ClusterRole
  43. name: nfs-client-provisioner-role
  44. apiGroup: rbac.authorization.k8s.io
部署Nfs-privisioner
部署插件:


Nfs-privisioner  deployment来创建插件 pod
1.20之后有一个新的机制
selfLink  api的资源对象之一,表示资源对象在集群当中自身的一个连接,self-link是一个唯一标识符号,可以用于标识k8s集群当中
每个资源的对象
self -link的值是一个URL,指向该资源对象的k8s api的路径
更好的实现资源对象的查找和引用
 

  1. vim /etc/kubernetes/manifests/kube-apiserver.yaml
  2. ...........
  3. spec:
  4. containers:
  5. - command:
  6. - kube-apiserver
  7. - --feature-gates=RemoveSelfLink=false
  8. - --advertise-address=20.0.0.70
  9. ............
  10. - --feature-gates=RemoveSelfLink=false
  11. feature-gates 在不破坏现有有规则以及功能基础上引用新功能或者修改现有功能的机制,禁用不影响之前的规则
  12. 生成一个新的APIserver
  13. kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
  14. 删除旧的apiserver
  15. kubectl delete pod -n kube-system kube-apiserver
  16. [root@master01 opt]# kubectl get pod -n kube-system
  17. NAME READY STATUS RESTARTS AGE
  18. coredns-7f89b7bc75-vhmhn 1/1 Running 1 2d1h
  19. coredns-7f89b7bc75-vrsqz 1/1 Running 0 2d2h
  20. etcd-master01 1/1 Running 1 13d
  21. kube-apiserver-master01 1/1 Running 0 3h45m
  22. kube-controller-manager-master01 1/1 Running 11 13d
  23. kube-flannel-ds-btmh8 1/1 Running 1 13d
  24. kube-flannel-ds-kpfhw 1/1 Running 0 2d1h
  25. kube-flannel-ds-nn558 1/1 Running 1 2d2h
  26. kube-proxy-46rbj 1/1 Running 1 13d
  27. kube-proxy-khngm 1/1 Running 1 13d
  28. kube-proxy-lq8lh 1/1 Running 1 13d
  29. kube-scheduler-master01 1/1 Running 11 13d

provisioner的yaml文件

  1. vim nfs-client-provisioner.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nfs-provisioner
  6. labels:
  7. app: nfs1
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: nfs1
  13. template:
  14. metadata:
  15. labels:
  16. app: nfs1
  17. spec:
  18. serviceAccountName: nfs-client-provisioner
  19. containers:
  20. - name: nfs1
  21. image: quay.io/external_storage/nfs-client-provisioner:latest
  22. volumeMounts:
  23. - name: nfs
  24. mountPath: /persistentvolumes
  25. env:
  26. - name: PROVISIONER_NAME
  27. value: nfs-storage
  28. #配置provisioner的账户名称,要和storageclass的资源名称一致
  29. - name: NFS_SERVER
  30. #指定的是nfs共享服务器的地址
  31. value: 20.0.0.73
  32. - name: NFS_PATH
  33. value: /opt/k8s
  34. volumes:
  35. - name: nfs
  36. nfs:
  37. server: 20.0.0.73
  38. path: /opt/k8s
  39. 部署nfs-provisioner的插件
  40. nfs的PRovisioner的客户端已pod的方式运行在集群当中,监听k8s集群当中pv的请求,动态的创建于NFS服务器相关的pv
  41. 容器里使用的配置,在PRovisioner当中定义好环境变量,传给容器,storageclass的名称,nfs服务器的地址,nfs的目录
部署storageclass(定义pv的存储卷)
  1. 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. parameters:
  9. archiveOnDelete: "false"
  10. #当pvc被删除之后,pv的状态,定义的是false,pvc被删除,pv的状态将是released,可以人工调整继续使用,如果是true,pv的状态将是Archived,表示pv不再可
  11. reclaimPolicy: Delete
  12. #定义pv的回收的策略,retain,delete,不支持回收
  13. allowVolumeExpansion: true
  14. #pv的存储空间可以动态的扩缩容
  15. 查看storageclasses
  16. [root@master01 opt]# kubectl get storageclasses.storage.k8s.io
  17. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  18. nfs-client-storageclass nfs-storage Retain Immediate true 16s
  19. NAME storageclasses的名称
  20. PROVISIONER 对应的创建pv的 PROVISIONER的插件
  21. RECLAIMPOLICY 回收策略,保留
  22. VOLUMEBINDINGMODE 卷绑定模式,Immediate表示pvc请求创建pv时,系统会立即绑定一个可用pv
  23. waitFirstConsumer:第一个使用者出现之后再绑pv
  24. ALLOWVOLUMEEXPANSION true表示可以在运行时对pv进行扩容
pod
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: nfs-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. storageClassName: nfs-client-storageclass
  9. resources:
  10. requests:
  11. storage: 2Gi
  12. ---
  13. apiVersion: apps/v1
  14. kind: Deployment
  15. metadata:
  16. name: nginx1
  17. labels:
  18. app: nginx1
  19. spec:
  20. replicas: 1
  21. selector:
  22. matchLabels:
  23. app: nginx1
  24. template:
  25. metadata:
  26. labels:
  27. app: nginx1
  28. spec:
  29. containers:
  30. - name: nginx1
  31. image: nginx:1.22
  32. volumeMounts:
  33. - name: html
  34. mountPath: /usr/share/nginx/html
  35. volumes:
  36. - name: html
  37. persistentVolumeClaim:
  38. claimName: nfs-pvc
三者之间的关系

动态pv的默认策略是删除,delete

查看pv

  1. [root@master01 opt]# kubectl get pv
  2. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  3. pvc-da0b10f1-be7c-4553-9eb6-edd07b573058 2Gi RWX Retain Bound default/nfs-pvc nfs-client-storageclass 169m

查看挂载目录

  1. [root@k8s4 k8s]# ls
  2. default-nfs-pvc-pvc-da0b10f1-be7c-4553-9eb6-edd07b573058
  3. [root@k8s4 default-nfs-pvc-pvc-da0b10f1-be7c-4553-9eb6-edd07b573058]# echo 123 > index.html
  4. 访问
  5. [root@master01 opt]# curl 10.244.2.63
  6. 123
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/40631
推荐阅读
相关标签
  

闽ICP备14008679号