Csi driver nfs
安装 NFS CSI 驱动
首先需要在 Kubernetes 集群中安装 NFS CSI 的驱动,https://github.com/kubernetes-csi/csi-driver-nfs 就是一个 NFS 的 CSI 驱动实现的项目。
直接使用下面的命令一键安装 NFS CSI 驱动程序:
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/install-driver.sh | bash -s master --
也可以本地安装:
git clone https://github.com/kubernetes-csi/csi-driver-nfs.git && cd csi-driver-nfs
./deploy/install-driver.sh master local
和上面介绍的部署方式基本上也是一致的,首先会用 DaemonSet 的形式在每个节点上运行了一个包含 Driver registra
容器的 Pod,当然和节点相关的操作比如 Mount/Unmount 也是在这个 Pod 里面执行的,其他的比如 Provision、Attach 都是在另外的 csi-nfs-controller-xxx
Pod 中执行的。
> kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-controller-7dd749b445-99nrs 3/3 Running 0 56s 10.244.244.201 devmaster <none> <none>
> kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-node-5mldq 3/3 Running 0 2m8s 10.244.244.212 devnode2 <none> <none>
csi-nfs-node-8xpzf 3/3 Running 0 2m8s 10.244.244.201 devmaster <none> <none>
csi-nfs-node-9xqh2 3/3 Running 0 2m8s 10.244.244.211 devnode1 <none> <none>
还可以通过 helm 进行安装
官网 https://github.com/kubernetes-csi/csi-driver-nfs 按 helm 模式下载源码:
helm repo add csi-driver-nfs \
https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm pull csi-driver-nfs/csi-driver-nfs --untar
修改模板文件中 dnsPolicy: ClusterFirst
通过 CSI 创建 NFS 存储
当 csi 的驱动安装完成后我们就可以通过 csi 的方式来使用我们的 nfs 存储了。
比如创建:
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- hard
- nfsvers=4.1
csi:
driver: nfs.csi.k8s.io
readOnly: false
volumeHandle: unique-volumeid # make sure it's a unique id in the cluster
volumeAttributes:
server: 10.244.244.101
share: /data/nfs
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-nfs-static
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
volumeName: pv-nfs
storageClassName: ""
直接创建上面的资源对象后我们的 PV 和 PVC 就绑定在一起了:
> kubectl get pv pv-nfs
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 10Gi RWX Retain Bound default/pvc-nfs-static 48s
> kubectl get pvc pvc-nfs-static
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs-static Bound pv-nfs 10Gi RWX 50s
这里的核心配置是 PV 中的 csi
属性的配置,需要通过 csi.driver
来指定我们要使用的驱动名称,比如我们这里使用 nfs 的名称为 nfs.csi.k8s.io
,然后就是根据具体的驱动配置相关的参数。
同样还可以创建一个用于动态创建 PV 的 StorageClass 对象:
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: 10.244.244.101
share: /mnt/nfs
# csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
# csi.storage.k8s.io/provisioner-secret-name: "mount-options"
# csi.storage.k8s.io/provisioner-secret-namespace: "default"
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- hard
- nfsvers=4.1
对于普通用户来说使用起来都是一样的,只需要管理员提供何时的 PV 或 StorageClass 即可,这里就使用的 CSI 的形式来提供 NFS 的存储。