如何在 Kubernetes 中配置基于 NFS 的持久卷

建议将 pod 的数据放入某个持久卷中,这样即使在 pod 终止后数据仍然可用。 在 Kubernetes (k8s) 中,可以在 pod 内使用基于 NFS 的持久卷。 在本文中,我们将学习如何配置持久卷和持久卷声明,然后我们将讨论如何在 k8s pod 中通过其声明名称使用持久卷。

我假设我们有一个功能强大的 k8s 集群并且 NFS服务器. 以下是实验室设置的详细信息,

  • NFS 服务器 IP = 192.168.1.40
  • NFS 共享 = /opt/k8s-pods/data
  • K8s 集群 = 一个主节点和两个工作节点

笔记: 确保 NFS 服务器可从工作节点访问,并尝试在每个工作节点上安装 nfs 共享一次以进行测试。

创建一个 索引.html 文件在 nfs 共享中,因为我们将在本文后面的 nginx pod 中安装此共享。

[[email protected] ~]$ echo "Hello, NFS Storage NGINX" > /opt/k8s-pods/data/index.html

配置基于 NFS 的 PV(持久卷)

要在 K8s 中创建基于 NFS 的持久卷,请在主节点上创建包含以下内容的 yaml 文件,

[[email protected] ~]$ vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /opt/k8s-pods/data
    server: 192.168.1.40

Save 并退出文件

现在使用上面创建的 yaml 文件创建持久卷,运行

[[email protected] ~]$ kubectl create -f nfs-pv.yaml
persistentvolume/nfs-pv created
[[email protected] ~]$

运行以下 kubectl 命令以验证持久卷的状态

[[email protected] ~]$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv   10Gi       RWX            Recycle          Available           nfs                     20s
[[email protected] ~]$

以上输出确认 PV 已成功创建且可用。

配置持久卷声明

要在 pod 中挂载持久卷,我们必须指定其持久卷声明。 因此,让我们使用以下 yaml 文件创建持久卷声明

[[email protected] ~]$ vi nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

Save 并退出文件。

运行下面的 kubectl 命令以使用上面的 yaml 文件创建 pvc,

[[email protected] ~]$ kubectl create -f nfs-pvc.yaml
persistentvolumeclaim/nfs-pvc created
[[email protected] ~]$

执行上述操作后,控制平面将查找满足声明要求且具有相同存储类名称的持久卷,然后将声明绑定到持久卷,示例如下所示:

[[email protected] ~]$ kubectl get pvc nfs-pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc   Bound    nfs-pv   10Gi       RWX            nfs            3m54s
[[email protected] ~]$
[[email protected] ~]$ kubectl get pv nfs-pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
nfs-pv   10Gi       RWX            Recycle          Bound    default/nfs-pvc   nfs                     18m
[[email protected] ~]$

以上输出证实了这一说法(nfs-pvc) 与持久卷 (nfs-pv)。

现在我们准备在 pod 中使用基于 nfs 的持久卷。

在 Pod 中使用基于 NFS 的持久卷

使用下面的 yaml 文件创建一个 nginx pod,它将在 ‘ 上挂载持久卷声明/usr/share/nginx/html

[[email protected] ~]$ vi nfs-pv-pod
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pv-pod
spec:
  volumes:
    - name: nginx-pv-storage
      persistentVolumeClaim:
        claimName: nfs-pvc
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "nginx-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-pv-storage

Save 和 close 文件。

现在使用上面的 yaml 文件创建 pod,运行

[[email protected] ~]$ kubectl create -f nfs-pv-pod.yaml
pod/nginx-pv-pod created
[[email protected] ~]$
[[email protected] ~]$ kubectl get pod nginx-pv-pod -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
nginx-pv-pod   1/1     Running   0          66s   172.16.140.28 k8s-worker-2   <none>           <none>
[[email protected] ~]$

笔记: 要获取有关 pod 的更多详细信息, kubectl 描述 pod

以上命令输出确认pod已成功创建。 现在尝试使用访问 nginx 页面 curl 命令

[kadm[email protected] ~]$ curl https://172.16.140.28
Hello, NFS Storage NGINX
[[email protected] ~]$

完美,以上 curl 命令的输出确认持久卷已正确安装在 pod 中,因为我们正在获取 NFS 共享上存在的 index.html 文件的内容。

文章到此结束,我相信你们对如何在 Kubernetes pod 中配置和使用基于 NFS 的持久卷有了一些基本的了解。

还阅读如何使用 Kubeadm 在 HA 中设置 Kubernetes(k8s) 集群

还阅读 如何在 Kubernetes 中安装和使用 Helm