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

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

我假设我们有一个功能正常的 k8s 集群和 NFS Server。以下是实验室设置的详细信息:
– NFS 服务器 IP = 192.168.1.40
– NFS 共享目录 = /opt/k8s-pods/data
– K8s 群集 = 一个主节点和两个工作节点

注意: 确保可以从 worker 节点访问 NFS 服务器,并尝试在每个 worker 节点上安装 nfs 共享以进行测试。

在 nfs 共享中创建一个 index.html 文件,因为我们将在本文后面的 nginx pod 中挂载该共享。

|

1

2

|

[kadmin@k8s-master ~]$ echo “Hello, NFS Storage NGINX” > /opt/k8s-pods/data/index.html

|

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

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

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

|

[kadmin@k8s-master ~]$ 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

|

保存并退出文件

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

|

1

2

3

4

|

[kadmin@k8s-master ~]$ kubectl create -f nfs-pv.yaml

persistentvolume/nfs-pv created

[kadmin@k8s-master ~]$

|

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

|

1

2

3

4

5

|

[kadmin@k8s-master ~]$ kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS      CLAIM STORAGECLASS REASON AGE

nfs-pv 10Gi RWX            Recycle          Available nfs 20s

[kadmin@k8s-master ~]$

|

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

配置持久卷声明

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

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

[kadmin@k8s-master ~]$ vi nfs-pvc.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: nfs-pvc

spec:

  storageClassName: nfs

  accessModes:

    - ReadWriteMany

  resources:

    requests:

      storage: 10Gi

|

保存并退出文件。

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

|

1

2

3

4

|

[kadmin@k8s-master ~]$ kubectl create -f nfs-pvc.yaml

persistentvolumeclaim/nfs-pvc created

[kadmin@k8s-master ~]$

|

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

|

1

2

3

4

5

6

7

8

9

|

[kadmin@k8s-master ~]$ kubectl get pvc nfs-pvc

NAME      STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

nfs-pvc Bound    nfs-pv 10Gi RWX            nfs            3m54s

[kadmin@k8s-master ~]$

[kadmin@k8s-master ~]$ 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

[kadmin@k8s-master ~]$

|

以上输出确认声明(nfs-pvc)与持久卷(nfs-pv)绑定。

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

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

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

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

|

[kadmin@k8s-master ~]$ 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

|

保存并关闭文件。

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

|

1

2

3

4

5

6

7

8

|

[kadmin@k8s-master ~]$ kubectl create -f nfs-pv-pod.yaml

pod/nginx-pv-pod created

[kadmin@k8s-master ~]$

[kadmin@k8s-master ~]$ 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              

[kadmin@k8s-master ~]$

|

注意:要获取有关 pod 的更多详细信息,可使用kubectl describe pod命令。

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

|

1

2

3

4

|

[kadmin@k8s-master ~]$ curl http://172.16.140.28

Hello, NFS Storage NGINX

[kadmin@k8s-master ~]$

|

完美,上面curl命令的输出确认了持久卷已正确挂载到 pod 中,因为我们可以获取 NFS 共享上index.html文件的内容。