• k8s 1.24.0版本使用nfs-provisioner4.0.0动态创建PV


    一、nfs-client-provisioner简介

    nfs-client-provisioner 可动态为kubernetes提供pv卷,是Kubernetes的简易NFS的外部provisioner,本身不提供NFS,需要现有的NFS服务器提供存储。持久卷目录的命名规则为:${namespace}-${pvcName}-${pvName}。

    K8S的外部NFS驱动可以按照其工作方式(是作为NFS server还是NFS client)分为两类:

    nfs-client:

    它通过K8S内置的NFS驱动挂载远端的NFS服务器到本地目录;然后将自身作为storage provider关联storage class。当用户创建对应的PVC来申请PV时,该provider就将PVC的要求与自身的属性比较,一旦满足就在本地挂载好的NFS目录中创建PV所属的子目录,为Pod提供动态的存储服务。

    nfs-server:

    与nfs-client不同,该驱动并不使用k8s的NFS驱动来挂载远端的NFS到本地再分配,而是直接将本地文件映射到容器内部,然后在容器内使用ganesha.nfsd来对外提供NFS服务;在每次创建PV的时候,直接在本地的NFS根目录中创建对应文件夹,并export出该子目录。

    本文将介绍使用nfs-client-provisioner这个应用,利用NFS Server给Kubernetes作为持久存储的后端,并且动态提供PV。前提条件是有已经安装好的NFS服务器,并且NFS服务器与Kubernetes的Slave节点网络能够连通。将nfs-client驱动做为一个deployment部署到K8S集群中,然后对外提供存储服务


    二、准备NFS服务端

    2.0 当前环境信息

    1. [root@k8s-master]-[~/nfs-provisioner]-#kubectl get node -o wide
    2. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
    3. k8s-master Ready control-plane 4d19h v1.24.0 10.0.0.16 <none> CentOS Linux 7 (Core) 3.10.0-1160.45.1.el7.x86_64 containerd://1.6.2
    4. k8s-node-1 Ready <none> 4d19h v1.24.0 10.0.0.17 <none> CentOS Linux 7 (Core) 3.10.0-1160.45.1.el7.x86_64 containerd://1.6.2
    5. k8s-node-2 Ready <none> 4d19h v1.24.0 10.0.0.18 <none> CentOS Linux 7 (Core) 3.10.0-1160.45.1.el7.x86_64 containerd://1.6.2

    2.1 通过yum安装nfs server端

    1. rpm -qa|egrep "nfs|rpc"
    2. yum -y install nfs-utils rpcbind

    2.2 启动服务和设置开机启动

    1. #启动nfs-server,并加入开机启动
    2. systemctl start rpcbind.service
    3. systemctl enable rpcbind.service
    4. systemctl start nfs
    5. systemctl enable nfs-server --now
    6. #查看nfs server是否已经正常启动
    7. systemctl status nfs-server

     2.3  编辑配置文件,设置共享目录

    1. [root@k8s-node-2]-[/data/nfs_provisioner]-#vim /etc/exports
    2. /data/nfs_provisioner 10.0.0.0/24(rw,no_root_squash)
    3. #不用重启nfs服务,配置文件就会生效
    4. exportfs -arv

    用于配置NFS服务程序配置文件的参数:

    2.4 客户端尝试挂载

    2.4.1 客户端需要安装nfs-utils,否则将无法进行nfs的挂载

    1. yum -y install nfs-utils
    2. systemctl start nfs
    3. systemctl enable nfs
    4. systemctl status nfs

    2.4.2 nfs-server创建共享目录

    mkdir /nfs_data
    

    2.4.3 客户端测试

    1. #查看nfs-server共享的目录
    2. [root@k8s-master]-[~]-#showmount -e 10.0.0.18
    3. Export list for 10.0.0.18:
    4. /data/nfs_provisioner 10.0.0.0/24
    5. #本地创建一个目录作为挂载点
    6. mount -t nfs 10.0.0.18:/data/nfs_provisioner /nfs_data
    7. #将nfs-server的共享目录挂载到本地
    8. #通过df -Th
    9. [root@k8s-node-1]-[~]-#df -Th /nfs_data/
    10. Filesystem Type Size Used Avail Use% Mounted on
    11. /dev/mapper/centos-root xfs 39G 7.9G 31G 21% /

    三、部署nfs-provisioner

    3.1 创建ServiceAccount

    1. apiVersion: v1
    2. kind: ServiceAccount
    3. metadata:
    4. name: nfs-client-provisioner
    5. # replace with namespace where provisioner is deployed
    6. namespace: default
    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: ["nodes"]
    15. verbs: ["get", "list", "watch"]
    16. - apiGroups: [""]
    17. resources: ["persistentvolumes"]
    18. verbs: ["get", "list", "watch", "create", "delete"]
    19. - apiGroups: [""]
    20. resources: ["persistentvolumeclaims"]
    21. verbs: ["get", "list", "watch", "update"]
    22. - apiGroups: ["storage.k8s.io"]
    23. resources: ["storageclasses"]
    24. verbs: ["get", "list", "watch"]
    25. - apiGroups: [""]
    26. resources: ["events"]
    27. verbs: ["create", "update", "patch"]
    28. ---
    29. kind: ClusterRoleBinding
    30. apiVersion: rbac.authorization.k8s.io/v1
    31. metadata:
    32. name: run-nfs-client-provisioner
    33. subjects:
    34. - kind: ServiceAccount
    35. name: nfs-client-provisioner
    36. # replace with namespace where provisioner is deployed
    37. namespace: default
    38. roleRef:
    39. kind: ClusterRole
    40. name: nfs-client-provisioner-runner
    41. apiGroup: rbac.authorization.k8s.io
    42. ---
    43. kind: Role
    44. apiVersion: rbac.authorization.k8s.io/v1
    45. metadata:
    46. name: leader-locking-nfs-client-provisioner
    47. # replace with namespace where provisioner is deployed
    48. namespace: default
    49. rules:
    50. - apiGroups: [""]
    51. resources: ["endpoints"]
    52. verbs: ["get", "list", "watch", "create", "update", "patch"]
    53. ---
    54. kind: RoleBinding
    55. apiVersion: rbac.authorization.k8s.io/v1
    56. metadata:
    57. name: leader-locking-nfs-client-provisioner
    58. # replace with namespace where provisioner is deployed
    59. namespace: default
    60. subjects:
    61. - kind: ServiceAccount
    62. name: nfs-client-provisioner
    63. # replace with namespace where provisioner is deployed
    64. namespace: default
    65. roleRef:
    66. kind: Role
    67. name: leader-locking-nfs-client-provisioner
    68. apiGroup: rbac.authorization.k8s.io
    kubectl apply -f sa.yaml

     3.2 创建Deployment

    注意镜像需要用比较新的,不然会报错:unexpected error getting claim reference: selfLink was empty, can't make reference

    注意:千万不要使用以下方式来解决selfLink的问题,k8s1.24.0版本默认是true,不支持修改为false,否则apiserver会启动失败!

    1. kind: Deployment
    2. apiVersion: apps/v1
    3. metadata:
    4. name: nfs-client-provisioner
    5. spec:
    6. replicas: 1
    7. selector:
    8. matchLabels:
    9. app: nfs-client-provisioner
    10. strategy:
    11. type: Recreate
    12. template:
    13. metadata:
    14. labels:
    15. app: nfs-client-provisioner
    16. spec:
    17. serviceAccountName: nfs-client-provisioner
    18. containers:
    19. - name: nfs-client-provisioner
    20. image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
    21. volumeMounts:
    22. - name: nfs-client-root
    23. mountPath: /persistentvolumes
    24. env:
    25. - name: PROVISIONER_NAME
    26. value: nfs-provisioner # 和3.Storage中provisioner保持一致便可
    27. - name: NFS_SERVER
    28. value: 10.0.0.18
    29. - name: NFS_PATH
    30. value: /data/nfs_provisioner
    31. volumes:
    32. - name: nfs-client-root
    33. nfs:
    34. server: 10.0.0.18
    35. path: /data/nfs_provisioner
    kubectl apply -f deployment.yaml

     3.3 创建storageclass

    1. kind: StorageClass
    2. apiVersion: storage.k8s.io/v1
    3. metadata:
    4. annotations:
    5. storageclass.kubernetes.io/is-default-class: "true"
    6. name: nfs-storage
    7. provisioner: nfs-provisioner
    8. volumeBindingMode: Immediate
    9. reclaimPolicy: Delete
    kubectl apply -f sc.yaml

     四、创建应用测试动态添加PV

    4.1 创建一个nginx应用

    kubectl apply -f nginx_sts_pvc.yaml
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: nginx
    5. labels:
    6. app: nginx
    7. spec:
    8. ports:
    9. - port: 80
    10. name: web
    11. clusterIP: None
    12. selector:
    13. app: nginx
    14. ---
    15. apiVersion: apps/v1
    16. kind: StatefulSet
    17. metadata:
    18. name: web
    19. spec:
    20. serviceName: "nginx"
    21. replicas: 2
    22. selector:
    23. matchLabels:
    24. app: nginx
    25. template:
    26. metadata:
    27. labels:
    28. app: nginx
    29. spec:
    30. containers:
    31. - name: nginx
    32. image: nginx
    33. ports:
    34. - containerPort: 80
    35. name: web
    36. volumeMounts:
    37. - name: www
    38. mountPath: /usr/share/nginx/html
    39. volumeClaimTemplates:
    40. - metadata:
    41. name: www
    42. spec:
    43. accessModes: [ "ReadWriteOnce" ]
    44. storageClassName: "nfs-storage" #使用新建的sc
    45. resources:
    46. requests:
    47. storage: 10Mi

    4.2 检查结果

    检查nfs-server服务器是否创建pv持久卷:

     -----------------后期会继续分享k8s1.24.0高版本的新变化和新特性,请大家多多关注!-----------------

  • 相关阅读:
    linux之查看端口占用
    Pytorch 学习路程 - 1:入门
    webpack5学习进阶:Library、模块联邦、构建优化
    软考 系统架构设计师系列知识点之数字孪生体(2)
    (论文调研) Multi-task的网络结构 在图像去噪问题中的应用
    手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
    JVM探究
    计算机毕业设计Java校园教育服务平台(源码+系统+mysql数据库+Lw文档)
    蓝桥杯实战应用【算法代码篇】-一题三解:计算二进制中1的个数(附Java和C++代码)
    EcmaScript标准-导入与导出-js
  • 原文地址:https://blog.csdn.net/zfw_666666/article/details/126490241