使用helm安装nfs-subdir-external-provisioner实现动态创建存储

存储组件 nfs-subdir-external-provisioner 是一个存储资源自动调配器,它可用将现有的 NFS 服务器通过持久卷声明来支持 Kubernetes 持久卷的动态分配。此组件是对 nfs-client-provisioner 的扩展,nfs-client-provisioner 已经不提供更新,且 nfs-client-provisionerGithub仓库已经迁移到 nfs-subdir-external-provisioner 的仓库。

nfs-subdir-external-provisioner官方Github地址

k8s版本:v1.23.1

准备工作:
  • 搭建好NFS服务;
  • 安装好helm

使用helm安装:
  1. 使用命令行进行安装:

    #添加helm源
    helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
    
    #创建个namespace(可选,主要是为了查看资源方便)
    kubectl create ns nfs-sc-default
    
    #使用helm安装(10.1.129.86为NFS地址,/data/nfs-data为共享的目录)
    helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
        --set storageClass.name=nfs-sc-default	#指定sc的名字
        --set nfs.server=10.1.129.86 \					#指定nfs地址
        --set nfs.path=/data/nfs-data \					#指定nfs的共享目录
        --set storageClass.defaultClass=true \	#指定为默认sc
        -n nfs-sc-default												#指定命名空间
    
    #查看创建的sc
    kubectl get sc
    
  2. 使用values.yaml进行安装:

    #下载chart
    helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner
    
    #解压后可以看到values.yaml
    cat values.yaml | egrep -v '#|^$'
    
    ###########
    replicaCount: 1
    strategyType: Recreate
    image:
      repository: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner
      tag: v4.0.2
      pullPolicy: IfNotPresent
    imagePullSecrets: []
    nfs:
      server: 10.1.129.86			#指定nfs地址
      path: /data/nfs-data		#指定nfs的共享目录
      mountOptions:
      volumeName: nfs-subdir-external-provisioner-root
      reclaimPolicy: Retain
    storageClass:
      create: true
      defaultClass: true			#指定为默认sc
      name: nfs-sc-default		#指定sc的名字
      allowVolumeExpansion: true
      reclaimPolicy: Delete
      archiveOnDelete: true
      onDelete:
      pathPattern:
      accessModes: ReadWriteOnce
      annotations: {}
    leaderElection:
      enabled: true
    rbac:
      create: true
    podSecurityPolicy:
      enabled: false
    podAnnotations: {}
    podSecurityContext: {}
    securityContext: {}
    serviceAccount:
      create: true
      annotations: {}
      name:
    resources: {}
    nodeSelector: {}
    tolerations: []
    affinity: {}
    labels: {}
    ###########
    
    #就修改了上面4处参数后使用values.yaml文件进行安装
    helm install nfs-subdir-external-provisioner \
        nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
        -f values.yaml \
        -n nfs-sc-default
    
    #查看创建的sc
    kubectl get sc
    

测试:
  1. 创建pvc测试:

    先创建个test-pvc.yaml,在这个yaml文件里我们没有特意指定使用哪个sc,是因为之前创建的sc是默认的sc,如果没有指定默认sc,需要在这个文件里指定使用哪个sc

    cat test-pvc.yaml
    
    ##########
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc
    #  storageClassName: nfs-sc-default #指定sc名字,如果之前设定nfs-sc-default为默认sc可不用写这行指定
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Mi
    ##########
    
    #创建pvc
    kubectl apply -f test-pvc.yaml -n nfs-sc-default
    
    #查看pvc
    kubectl get pvc -n nfs-sc-default
    

    查看pv,如图第二个为sc创建的pv,名字为随机,并已经与test-pvc绑定了:

  2. 创建pod测试:

    创建test-pod.yaml文件,在这个yaml文件里我们只指定了busybox文件创建了个SUCCESS文件,绑定的volume里指定的是之前创建的test-pvc

    cat test-pod.yaml
    
    #########
    kind: Pod
    apiVersion: v1
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-pod
        image: busybox:latest
        command:
          - "/bin/sh"
        args:
          - "-c"
          - "touch /mnt/SUCCESS && exit 0 || exit 1"  
        volumeMounts:
          - name: nfs-pvc
            mountPath: "/mnt"
      restartPolicy: "Never"
      volumes:
        - name: nfs-pvc
          persistentVolumeClaim:
            claimName: test-pvc
    #########
    
    #创建测试pod
    kubectl apply -f test-pod.yaml  -n nfs-sc-default
    
    #查看pod已经显示创建成功了
    kubectl get pod -n nfs-sc-default
    
  3. 查看NFS目录里创建的文件:

    可以看见SUCCESS文件创建成功,并且可以看出命名目录的规则为namespace名称-pvc名称-pv名称PV 名称是随机字符串,所以 每次只要不删除PVC,那么Kubernetes中的与存储绑定将不会丢失,要是删除PVC也就意味着删除了绑定的文件夹,下次就算重新创建相同名称的PVC,生成的文件夹名称也不会一致,因为PV 名是随机生成的字符串,而文件夹命名又跟PV 有关,所以删除PVC需谨慎。

  4. 删除相关测试的资源:

    kubectl delete -f test-pod.yaml  -n nfs-sc-default
    kubectl delete -f test-pvc.yaml  -n nfs-sc-default
    

posted on 2022-02-10 17:54  cerberus43  阅读(2729)  评论(0编辑  收藏  举报