NFS服务

本文档介绍了如何在 KubeCube 上接入 NFS 服务。

准备工作

登录 NFS 服务器

  1. 通过 NFS 导出文件为 KubeCube 分配服务器访问权限

    修改 /etc/exports 文件,添加 {导出目录} {KubeCube应用所在节点IP}(rw,sync,no_subtree_check,insecure)。如:

    nfs-6

  2. 重新启动 NFS 服务器

    1. systemctl restart nfs-kernel-server
  3. 为 KubeCube 打开防火墙

    1. ufw allow from {KubeCube所在节点IP} to any port nfs

登录 K8s 集群 worker 节点

  1. 安装 NFS Common

    apt-get install nfs-commonyum install nfs-utils等。

  2. 修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,添加- --feature-gates=RemoveSelfLink=false

创建 StorageClass

登录 KubeCube 所在节点,创建以下文件并 apply,请根据实际环境修改部分参数。

配置 account 及相关权限

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: nfs-client-provisioner
  5. # replace with namespace where provisioner is deployed
  6. namespace: default #根据实际环境设定namespace,下面类同
  7. ---
  8. kind: ClusterRole
  9. apiVersion: rbac.authorization.k8s.io/v1
  10. metadata:
  11. name: nfs-client-provisioner-runner
  12. rules:
  13. - apiGroups: [""]
  14. resources: ["persistentvolumes"]
  15. verbs: ["get", "list", "watch", "create", "delete"]
  16. - apiGroups: [""]
  17. resources: ["persistentvolumeclaims"]
  18. verbs: ["get", "list", "watch", "update"]
  19. - apiGroups: ["storage.k8s.io"]
  20. resources: ["storageclasses"]
  21. verbs: ["get", "list", "watch"]
  22. - apiGroups: [""]
  23. resources: ["events"]
  24. verbs: ["create", "update", "patch"]
  25. ---
  26. kind: ClusterRoleBinding
  27. apiVersion: rbac.authorization.k8s.io/v1
  28. metadata:
  29. name: run-nfs-client-provisioner
  30. subjects:
  31. - kind: ServiceAccount
  32. name: nfs-client-provisioner
  33. # replace with namespace where provisioner is deployed
  34. namespace: default
  35. roleRef:
  36. kind: ClusterRole
  37. name: nfs-client-provisioner-runner
  38. apiGroup: rbac.authorization.k8s.io
  39. ---
  40. kind: Role
  41. apiVersion: rbac.authorization.k8s.io/v1
  42. metadata:
  43. name: leader-locking-nfs-client-provisioner
  44. # replace with namespace where provisioner is deployed
  45. namespace: default
  46. rules:
  47. - apiGroups: [""]
  48. resources: ["endpoints"]
  49. verbs: ["get", "list", "watch", "create", "update", "patch"]
  50. ---
  51. kind: RoleBinding
  52. apiVersion: rbac.authorization.k8s.io/v1
  53. metadata:
  54. name: leader-locking-nfs-client-provisioner
  55. subjects:
  56. - kind: ServiceAccount
  57. name: nfs-client-provisioner
  58. # replace with namespace where provisioner is deployed
  59. namespace: default
  60. roleRef:
  61. kind: Role
  62. name: leader-locking-nfs-client-provisioner
  63. apiGroup: rbac.authorization.k8s.io

创建 NFS Provisioner

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nfs-client-provisioner
  5. labels:
  6. app: nfs-client-provisioner
  7. # replace with namespace where provisioner is deployed
  8. namespace: default #与RBAC文件中的namespace保持一致
  9. spec:
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. app: nfs-client-provisioner
  14. strategy:
  15. type: Recreate
  16. template:
  17. metadata:
  18. labels:
  19. app: nfs-client-provisioner
  20. spec:
  21. serviceAccountName: nfs-client-provisioner
  22. containers:
  23. - name: nfs-client-provisioner
  24. image: quay.io/external_storage/nfs-client-provisioner:latest
  25. volumeMounts:
  26. - name: nfs-client-root
  27. mountPath: /persistentvolumes
  28. env:
  29. - name: PROVISIONER_NAME
  30. value: qgg-nfs-storage #provisioner名称,请确保该名称与 nfs-StorageClass.yaml文件中的provisioner名称保持一致
  31. - name: NFS_SERVER
  32. value: 10.173.32.164 #NFS Server IP地址
  33. - name: NFS_PATH
  34. value: /mnt/linuxidc #NFS挂载卷
  35. volumes:
  36. - name: nfs-client-root
  37. nfs:
  38. server: 10.173.32.164 #NFS Server IP地址
  39. path: /mnt/linuxidc #NFS 挂载卷

创建 StorageClass

方式一:命令行操作

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: managed-nfs-storage
  5. provisioner: qgg-nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
  6. parameters:
  7. archiveOnDelete: "false"

方式二:页面操作

  1. 以平台管理员身份登录 KubeCube;
  2. 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。

nfs-1

创建 PVC

在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别可以选择已创建过的 StorageClass。

nfs-2

创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理

nfs-3

创建工作负载

在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。

nfs-4

具体配置说明见 工作负载管理

检查结果

创建挂载 PVC 的工作负载后,登录 NFS 服务器,进入导出目录,可以看到已经创建出一个新的文件夹,文件夹命名为 ${namespace}-${pvcName}-${pvName}。

nfs-5

最后修改 September 10, 2021 : add version (7423e0a7)