在 Kubernetes 集群中,可以通过 Helm 部署 nfs-subdir-external-provisioner 来动态管理持久卷,这是一个存储资源自动调配器,可以将现有的 NFS 服务器通过持久卷声明来支持 持久卷的动态分配

前置条件:

  • NFS服务器正常运行并且能够与集群通信
  • 安装 Helm
  • 集群正常运行

添加仓库

nfs-subdir-external-provisioner 的 Helm 仓库添加到本地

1
2
helm repo add nfs-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm repo update

部署

下载nfs-subdir-external-provisioner的 chart 到本地

1
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --untar

编辑其目录中的 values.yaml 下面是示例,,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 cat values.yaml  | grep -v "#"
replicaCount: 1
strategyType: Recreate

image:
repository: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner
tag: v4.0.0
pullPolicy: IfNotPresent
imagePullSecrets: []

nfs:
server: 10.0.80.253 # nfs服务端ip地址
path: /data # nfs共享目录
mountOptions:
volumeName: nfs-subdir-external-provisioner-root
reclaimPolicy: Retain

storageClass:
create: true


defaultClass: true

name: nfs-default # Storage Class的名字

....... # 下面的内容省略

使用自定义的values.yaml进行部署,这里我选择了创建一个独立的namespace便于管理

1
helm install nfs-provisioner ./nfs-subdir-external-provisioner -f values.yaml -n nfs-provisioner --create-namespace

验证并测试

检查存储类是否创建成功

1
kubectl get storageclass

测试动态卷分配

创建 testpvc.yaml 并应用

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-claim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: custom-nfs
1
kubectl apply -f testpvc.yaml -n nfs-provisioner

验证 PVC 是否绑定成功

1
kubectl get pvc -n nfs-provisioner

接下来可以起个pod进行验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: test-nfs-provisioner
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "echo 'nfstest' > /mnt/testfile && sleep 3600"]
volumeMounts:
- name: test-storage
mountPath: /mnt
volumes:
- name: test-storage
persistentVolumeClaim:
claimName: test-claim
1
kubectl apply -f testpod.yaml -n nfs-provisioner

pod正常运行之后可以登录到nfs服务器查看到共享目录生成了一个目录和文件表明成功。。