如何在 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
文件的内容。