使用 NFS 作为网络共享存储
在 Kubernetes 中使用 NFS(Network File System)作为网络共享存储,可以实现跨多个 Pod 的数据共享和持久化存储。以下是使用 NFS 的几个关键步骤:
部署 NFS 服务器
-
在某个 Kubernetes 集群外的机器或者集群内的一个专用节点上安装 NFS 服务器软件:
sudo yum install -y nfs-utils rpcbind
-
创建一个 NFS 共享目录并在
/etc/exports
文件中配置对外共享:echo "/exported/path *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
然后,重启 NFS 服务以应用新的配置:
sudo systemctl restart nfs-server.service
-
在防火墙中开放 NFS 所需的端口(默认为 TCP/UDP 111 和 TCP/UDP 2049)。
部署 NFS Client Provisioner
-
动态存储卷:要实现在 Kubernetes 集群中动态创建和销毁 NFS 基于 PersistentVolume (PV) 的 PersistentVolumeClaim (PVC),可以部署一个名为 NFS Client Provisioner 的控制器。
下面是一个简化的 YAML 示例,用于部署一个使用 NFS 的动态存储卷供给器:
apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner labels: app: nfs-client-provisioner spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: nfs-client-provisioner template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:v4.0.2 env: - name: PROVISIONER_NAME value: my-nfs-storage-class - name: NFS_SERVER value: nfs-server.example.com - name: NFS_PATH value: /exported/path
请注意,这里需要设置
NFS_SERVER
和NFS_PATH
环境变量,指向已配置好的 NFS 服务器和共享目录。 -
创建 StorageClass:
创建一个 StorageClass 对象,指定 provisioner 为刚才部署的 NFS Client Provisioner,并设置适当的参数:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage-class provisioner: my-nfs-storage-class
-
使用 PersistentVolumeClaim:
开发者或应用程序可以创建 PersistentVolumeClaim 请求,指定刚刚创建的 StorageClass,Kubernetes 会根据 StorageClass 自动创建并绑定合适的 PersistentVolume。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-nfs-pvc spec: accessModes: - ReadWriteMany storageClassName: nfs-storage-class resources: requests: storage: 1Gi
然后在 Pod 中挂载这个 PVC:
apiVersion: v1 kind: Pod metadata: name: my-pod-using-nfs spec: containers: - name: my-container image: some-image volumeMounts: - mountPath: /mnt/data name: nfs-pvc-volume volumes: - name: nfs-pvc-volume persistentVolumeClaim: claimName: my-nfs-pvc
这样,每当有 Pod 需要持久化存储时,只需创建一个 PersistentVolumeClaim 并在 Pod 中挂载该 Claim,Kubernetes 会根据 StorageClass 动态创建并挂载 NFS 共享的 PersistentVolume。当 Pod 销毁时,数据并不会丢失,因为它们是持久存储在 NFS 服务器上的。