存儲組件
nfs-subdir-external-provisioner是一個存儲資源自動調配器,它可用將現有的 NFS 服務器通過持久卷聲明來支持Kubernetes持久卷的動態分配。此組件是對nfs-client-provisioner的擴展,nfs-client-provisioner已經不提供更新,且nfs-client-provisioner的Github倉庫已經遷移到nfs-subdir-external-provisioner的倉庫。nfs-subdir-external-provisioner官方Github地址
k8s版本:v1.23.1
准備工作:
- 搭建好
NFS服務; - 安裝好
helm;
使用helm安裝:
-
使用命令行進行安裝:
#添加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 -
使用
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
測試:
-
創建
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綁定了:
-
創建
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 -
查看
NFS目錄里創建的文件:
可以看見
SUCCESS文件創建成功,並且可以看出命名目錄的規則為namespace名稱-pvc名稱-pv名稱,PV名稱是隨機字符串,所以 每次只要不刪除PVC,那么Kubernetes中的與存儲綁定將不會丟失,要是刪除PVC也就意味着刪除了綁定的文件夾,下次就算重新創建相同名稱的PVC,生成的文件夾名稱也不會一致,因為PV名是隨機生成的字符串,而文件夾命名又跟PV有關,所以刪除PVC需謹慎。 -
刪除相關測試的資源:
kubectl delete -f test-pod.yaml -n nfs-sc-default kubectl delete -f test-pvc.yaml -n nfs-sc-default
