kubernetes存储类型StorageClass的nfs配置方法

avatar 2022年12月19日18:31:54 评论 1,094 次浏览

说到StorageClass肯定绕不开的就是针对pv和pvc的理解,这里就不做过多的描述了,后面会加上相关描述连接,我们先不要过度的去想StorageClass,我们先需要知道StorageClass能做什么,有什么好处。StorageClass可以方便一些服务需要数据存储的时候可以通过pvc动态绑定给pv,然后供pod使用。

StorageClass 资源

StorageClass中包含了provisionerparameters reclaimPolicy字段,这些字段是在StorageClass动态分配pv的时候用到,而且StorageClass的命名也特别重要,一旦创建就不能再对其更新。可以先创建个默认的StorageClass。

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: standard
  5. provisioner: kubernetes.io/aws-ebs
  6. parameters:
  7. type: gp2
  8. reclaimPolicy: Retain
  9. allowVolumeExpansion: true
  10. mountOptions:
  11. - debug
  12. volumeBindingMode: Immediate

安装nfs服务端

因为我们需要把StorageClass关联nfs,所以先安装nfs服务端,并设置好目录,然后设置开机自启动。客户端也要在所有node节点上安装,并设置开机自启动。

  1. # 安装nfs-server
  2. [root@wulaoer.org ~]# yum install -y nfs-utils
  3. # 授权存储目录(master)
  4. [root@wulaoer.org ~]# echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
  5. # 执行以下命令,启动 nfs 服务;创建共享目录
  6. [root@wulaoer.org ~]# mkdir -p /nfs/data
  7. [root@wulaoer.org ~]# chmod 777 -R /nfs/data
  8. [root@wulaoer.org ~]# systemctl enable rpcbind
  9. [root@wulaoer.org ~]# systemctl enable nfs-server
  10. [root@wulaoer.org ~]# systemctl start rpcbind
  11. [root@wulaoer.org ~]# systemctl start nfs-server
  12. # 在kubernetes集群所有节点执行
  13. [root@wulaoer.org ~]# yum install -y nfs-utils rpcbind
  14. [root@wulaoer.org ~]# systemctl start rpcbind
  15. [root@wulaoer.org ~]# systemctl enable rpcbind
  16. [root@wulaoer.org ~]# systemctl start nfs
  17. [root@wulaoer.org ~]# systemctl enable nfs
  18. #需要注意的是kubernetes集群的任何节点必须和nfs集群进行通信,如果不能通信可以看一下防火墙。
  19. # 使配置生效
  20. [root@wulaoer.org ~]# exportfs -r
  21. # 检查配置是否生效
  22. [root@wulaoer.org ~]# exportfs
  23. # 测试,在子节点 IP为master的ip
  24. [root@wulaoer.org ~]# showmount -e 10.211.55.14
  25. Export list for 10.211.55.14:
  26. /nfs/data *

授权nfs

nfs服务端已经部署完成,我们的目的是把nfs通过StorageClass关联起来。这个时候nfs也是kubernetes中的一个组件了,需要进行授权,授予在kubernetes集群中运行的权限。根据需求只修改命名空间。

  1. ---
  2. apiVersion: v1
  3. kind: ServiceAccount #创建个SA账号主要用来管理NFS provisioner在k8s集群中运行的权限
  4. metadata:
  5. name: nfs-client-provisioner #和上面的SA账号保持一致
  6. # replace with namespace where provisioner is deployed
  7. namespace: default
  8. ---
  9. #以下就是ClusterRole,ClusterRoleBinding,Role,RoleBinding都是权限绑定配置,不在解释。直接复制即可。
  10. kind: ClusterRole
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. metadata:
  13. name: nfs-client-provisioner-runner
  14. rules:
  15. - apiGroups: [""]
  16. resources: ["nodes"]
  17. verbs: ["get", "list", "watch"]
  18. - apiGroups: [""]
  19. resources: ["persistentvolumes"]
  20. verbs: ["get", "list", "watch", "create", "delete"]
  21. - apiGroups: [""]
  22. resources: ["persistentvolumeclaims"]
  23. verbs: ["get", "list", "watch", "update"]
  24. - apiGroups: ["storage.k8s.io"]
  25. resources: ["storageclasses"]
  26. verbs: ["get", "list", "watch"]
  27. - apiGroups: [""]
  28. resources: ["events"]
  29. verbs: ["create", "update", "patch"]
  30. ---
  31. kind: ClusterRoleBinding
  32. apiVersion: rbac.authorization.k8s.io/v1
  33. metadata:
  34. name: run-nfs-client-provisioner
  35. subjects:
  36. - kind: ServiceAccount
  37. name: nfs-client-provisioner
  38. # replace with namespace where provisioner is deployed
  39. namespace: default
  40. roleRef:
  41. kind: ClusterRole
  42. name: nfs-client-provisioner-runner
  43. apiGroup: rbac.authorization.k8s.io
  44. ---
  45. kind: Role
  46. apiVersion: rbac.authorization.k8s.io/v1
  47. metadata:
  48. name: leader-locking-nfs-client-provisioner
  49. # replace with namespace where provisioner is deployed
  50. namespace: default
  51. rules:
  52. - apiGroups: [""]
  53. resources: ["endpoints"]
  54. verbs: ["get", "list", "watch", "create", "update", "patch"]
  55. ---
  56. kind: RoleBinding
  57. apiVersion: rbac.authorization.k8s.io/v1
  58. metadata:
  59. name: leader-locking-nfs-client-provisioner
  60. # replace with namespace where provisioner is deployed
  61. namespace: default
  62. subjects:
  63. - kind: ServiceAccount
  64. name: nfs-client-provisioner
  65. # replace with namespace where provisioner is deployed
  66. namespace: default
  67. roleRef:
  68. kind: Role
  69. name: leader-locking-nfs-client-provisioner
  70. apiGroup: rbac.authorization.k8s.io
  71. ---------------------------------分割线----------------------------------------------
  72. [root@Mater storageclass]# kubectl apply -f rbac.yaml
  73. serviceaccount/nfs-client-provisioner unchanged
  74. clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner unchanged
  75. clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner unchanged
  76. role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner unchanged
  77. rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner unchanged

StorageClass指定nfs

负责建立PVC并调用NFS provisioner进行预定的工作,并让PV与PVC建立关联,这里注意,nfs服务端的ip必须和集群之间的通信。

  1. apiVersion: storage.k8s.io/v1
  2. #存储类的资源名称
  3. kind: StorageClass
  4. metadata:
  5. #存储类的名称,自定义
  6. name: nfs-storage
  7. annotations:
  8. #注解,是否是默认的存储,注意:KubeSphere默认就需要个默认存储,因此这里注解要设置为“默认”的存储系统,表示为"true",代表默认。
  9. storageclass.kubernetes.io/is-default-class: "true"
  10. #存储分配器的名字,自定义
  11. provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  12. parameters:
  13. archiveOnDelete: "true" ## 删除pv的时候,pv的内容是否要备份
  14.  
  15. ---
  16. apiVersion: apps/v1
  17. kind: Deployment
  18. metadata:
  19. name: nfs-client-provisioner
  20. labels:
  21. app: nfs-client-provisioner
  22. # replace with namespace where provisioner is deployed
  23. namespace: default
  24. spec:
  25. #只运行一个副本应用
  26. replicas: 1
  27. #描述了如何用新的POD替换现有的POD
  28. strategy:
  29. #Recreate表示重新创建Pod
  30. type: Recreate
  31. #选择后端Pod
  32. selector:
  33. matchLabels:
  34. app: nfs-client-provisioner
  35. template:
  36. metadata:
  37. labels:
  38. app: nfs-client-provisioner
  39. spec:
  40. serviceAccountName: nfs-client-provisioner #创建账户
  41. containers:
  42. - name: nfs-client-provisioner
  43. image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
  44. #image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2 #使用NFS存储分配器的镜像
  45. # resources:
  46. # limits:
  47. # cpu: 10m
  48. # requests:
  49. # cpu: 10m
  50. volumeMounts:
  51. - name: nfs-client-root #定义个存储卷,
  52. mountPath: /persistentvolumes #表示挂载容器内部的路径
  53. env:
  54. - name: PROVISIONER_NAME #定义存储分配器的名称
  55. value: k8s-sigs.io/nfs-subdir-external-provisioner #需要和上面定义的保持名称一致
  56. - name: NFS_SERVER #指定NFS服务器的地址,你需要改成你的NFS服务器的IP地址
  57. value: 10.211.55.14 ## 指定自己nfs服务器地址
  58. - name: NFS_PATH
  59. value: /nfs/data ## nfs服务器共享的目录 #指定NFS服务器共享的目录
  60. volumes:
  61. - name: nfs-client-root #存储卷的名称,和前面定义的保持一致
  62. nfs:
  63. server: 10.211.55.14 #NFS服务器的地址,和上面保持一致,这里需要改为你的IP地址
  64. path: /nfs/data #NFS共享的存储目录,和上面保持一致
  65. -----------------------------分割线---------------------------------
  66. [root@Mater storageclass]# kubectl apply -f sc.yaml
  67. storageclass.storage.k8s.io/nfs-storage unchanged
  68. deployment.apps/nfs-client-provisioner unchanged

创建后直接看一下StorageClass,这时是有两个,一个是前面创建的默认的,另一个就是上面创建的。

  1. [root@Mater ~]# kubectl get storageclass
  2. NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
  3. nfs-storage (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 21s
  4. standard kubernetes.io/aws-ebs Retain Immediate true 15m

测试

创建一个pvc,并测试pvc是否可以在nfs共享文件中创建文件。

  1. kind: PersistentVolumeClaim #创建PVC资源
  2. apiVersion: v1
  3. metadata:
  4. name: nginx-pvc #PVC的名称
  5. spec:
  6. accessModes: #定义对PV的访问模式,代表PV可以被多个PVC以读写模式挂载
  7. - ReadWriteMany
  8. resources: #定义PVC资源的参数
  9. requests: #设置具体资源需求
  10. storage: 200Mi #表示申请200MI的空间资源
  11. storageClassName: nfs-storage
  12. -----------------------分割线---------------------------------------------
  13. [root@Mater storageclass]# kubectl apply -f pvc.yaml
  14. persistentvolumeclaim/tomcat-pvc unchanged
  15. [root@Mater storageclass]# kubectl get pvc
  16. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  17. nginx-pvc Bound pvc-85e99ea4-80e6-4f6e-a305-54b620f9ca64 200Mi RWX nfs-storage 8m29s

验证通过,说明可以在nfs上创建pvc,并且在nfs共享目录里也有创建的pvc文件名,说明这个实验已经创建成功了。但是在实验时,刚开始总是报错创建的pvc是Pending状态,通过查看信息,如下:

  1. [root@Mater storageclass]# kubectl get pvc
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. nginx-pvc Bound pvc-29c5e68b-abd4-4822-a338-440b9e66421e 200Mi RWX nfs-storage 4s
  4. [root@Mater storageclass]# kubectl describe pvc nginx-pvc
  5. Name: nginx-pvc
  6. Namespace: default
  7. StorageClass: nfs-storage
  8. Status: Bound
  9. Volume: pvc-29c5e68b-abd4-4822-a338-440b9e66421e
  10. Labels: <none>
  11. Annotations: pv.kubernetes.io/bind-completed: yes
  12. pv.kubernetes.io/bound-by-controller: yes
  13. volume.beta.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  14. volume.kubernetes.io/storage-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
  15. Finalizers: [kubernetes.io/pvc-protection]
  16. Capacity: 200Mi
  17. Access Modes: RWX
  18. VolumeMode: Filesystem
  19. Used By: <none>
  20. Events:
  21. Type Reason Age From Message
  22. ---- ------ ---- ---- -------
  23. Normal ExternalProvisioning 6m13s 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

网上很多说是修改apiserver的配置,但是我修改apiserver配置时就会出现apiserver重启,然后就用不了了,都说是1.20版本的才有,但是我这个版本相对比较高的,后来发现是应该有node节点没有安装nfs客户端才导致的,所以一定要根据文档来做,这样避免没必要的问题。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

滑动解锁才能提交