Kubernetes 中配置基于NFS的持久卷
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:41
建议将Pod的数据放入某个持久卷中,以便即使Pod终止后也可以使用这些数据。在Kubernetes(k8s)中,可以在Pod中使用基于NFS的持久卷。在本文中,我们将学习如配置持久卷和持久卷声明,然后我们将讨论如何通过k8s pod中的声明名称使用持久卷。
我假设我们有一个功能正常的k8s集群和NFS Server。以下是设置的详细信息:
-
NFS服务器IP = 192.168.179.102
-
NFS共享目录 = /opt/k8s-pods/data
-
K8s群集 = 一个主节点和两个工作节点
注意: 确保可以从worker节点访问NFS服务器,并尝试在每个worker节点上安装nfs共享以进行测试。
NFS环境准备
NFS 192.168.179.102 提供共享目录
#在nfs共享中创建一个index.html文件,因为我们将在本文后面的nginx pod中挂载该共享。
[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# mkdir -p /opt/k8s-pods/data/
[root@localhost ~]# echo "Hello, NFS Storage NGINX" > /opt/k8s-pods/data/index.html
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/opt/k8s-pods/data 192.168.0.0/16(rw,no_root_squash)
[root@localhost ~]# exportfs -avr
exporting 192.168.0.0/16:/opt/k8s-pods/data
Master Node 安装驱动设备
[root@k8s-master ~]# mount -t nfs 192.168.179.102:/opt/k8s-pods/data /mnt
mount: wrong fs type, bad option, bad superblock on 192.168.179.102:/opt/k8s-pods/data,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
#可以看到不支持,要安装驱动存储设备,所有节点都需要安装 master node
[root@k8s-master ~]# yum install nfs-utils -y
[root@k8s-master ~]# mount -t nfs 192.168.179.102:/opt/k8s-pods/data /mnt
[root@k8s-master ~]# cd /mnt/
[root@k8s-master mnt]# ls
index.html
[root@k8s-master mnt]# cat index.html
Hello, NFS Storage NGINX
[root@k8s-master ~]# umount /mnt
配置持久卷声明
要在Pod内挂载持久卷,我们必须指定其持久卷声明。因此,让我们使用以下YAML文件创建持久卷声明:
[root@k8s-master mnt]# cat nfs-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /opt/k8s-pods/data
server: 192.168.179.102
[root@k8s-master mnt]# kubectl apply -f nfs-pv.yml
[root@k8s-master mnt]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 2Gi RWX Recycle Available nfs 2m44s
以上输出确认PV已成功创建并且可用。
配置持久卷声明
要在Pod内挂载持久卷,我们必须指定其持久卷声明。因此,让我们使用以下YAML文件创建持久卷声明:
[root@k8s-master mnt]# cat nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
[root@k8s-master mnt]# kubectl apply -f nfs-pvc.yaml
persistentvolumeclaim/nfs-pvc created
#执行完上述操作后,控制平面将使用相同的存储类名称查找满足声明要求的持久卷,然后将声明绑定到持久卷,示例如下所示:
[root@k8s-master mnt]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound nfs-pv 2Gi RWX nfs 3m37s
[root@k8s-master mnt]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 2Gi RWX Recycle Bound default/nfs-pvc nfs 15m
以上输出确认声明(nfs-pvc)与持久卷(nfs-pv)绑定。现在我们准备在pod中使用基于nfs的持久卷。
在Pod中使用基于NFS的持久卷
在yaml文件下面创建一个nginx pod,它将在/usr/share/nginx/html
上挂载持久卷声明。
[root@k8s-master mnt]# cat nfs-pv-pod.yml
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:
- name: http
containerPort: 80
volumeMounts:
- name: nginx-pv-storage
mountPath: /usr/share/nginx/html
注意:要获取有关pod的更多详细信息,可使用 kubectl describe pod <pod-name>
命令。
以上命令输出确认已成功创建容器。现在尝试使用curl命令访问nginx页面:
[root@k8s-master mnt]# kubectl get pod -o wide | awk 'NR==1 || $1=="nginx-pv-pod"'
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pv-pod 1/1 Running 0 5m42s 10.244.0.22 k8s-master <none> <none>
[root@k8s-master mnt]# curl 10.244.0.22
Hello, NFS Storage NGINX
完美,上面curl
命令的输出确认了持久卷已正确挂载到pod中,因为我们可以获取NFS共享上index.html
文件的内容。