1、nfs介绍和作用
nfs卷能将 NFS (网络文件系统) 挂载到Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs卷的内容在删除 Pod 时会被保存,卷只是被卸载。
2、pv和pvc介绍
pv持久卷是集群中的一块存储,可以由管理员事先制备,或者使用存储类来动态制备。
持久化存储,对存储资源进行抽象,对外提供可以调用的地方。
pvc表达的是用户对存储的请求。概念上与Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求PV卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载)。用于调用,不需要关心内部实现细节。
3、配置nfs服务器
新准备一台虚拟机作为nfs服务器端,安装nfs,设置挂载路径
3、1 安装nfs
$ yum install -y nfs-utils
3、2 设置挂载路径
$ vi /etc/exports
# 添加如下内容
/data/nfs *{rw,no_root_squash}
3、3 创建挂载路径
注意:exports文件中设置的挂载路径必须存在
$ mkdir /data/nfs
4、k8s集群中的node节点安装nfs
在所有k8s集群中的node节点安装nfs
$ yum install -y nfs-utils
5、启动nfs服务器端,开启nfs服务
$ systemctl start nfs
6、 验证node节点是否能够挂载到nfs服务器
$ showmount -e nfs服务器Ip
# 出现如下内容即代表可以挂载
Export list for 192.168.150.143:
/data/nfs *
7、创建pv
$ kubectl apply -f pv.yaml
# pv.yaml文件内容如下:
apiVersion: v1
kind: PersistentVolume # 资源类型为pv
metadata:
name: my-pv
spec:
capacity: # 容量
storage: 5Gi # 5G
accessModes:
- ReadWriteMany
nfs:
path: /data/nfs # nfs挂载数据的目录地址
server: 192.168.150.143 # nfs服务器端IP地址
8、创建pvc
$ kubectl apply -f pvc.yaml
# pvc.yaml文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html # 挂载路径
ports:
- containerPort: 80
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes: # 匹配模式
- ReadWriteMany
resources: # 资源
requests: # 需求
storage: 5Gi # 5G容量
9、查看pvc是否绑定到pv
$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/my-pv 5Gi RWX Retain Bound default/my-pvc 19h
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/my-pvc Bound my-pv 5Gi RWX 19h
可以看到pvc已经绑定到了pv上
10、查看nginx-dep1 Pod是否创建成功
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-dep1-58b7bf955f-7c7d8 1/1 Running 0 20h
nginx-dep1-58b7bf955f-b5gpw 1/1 Running 0 20h
nginx-dep1-58b7bf955f-rhfz8 1/1 Running 0 20h
可以看到nginx-dep1 的3个副本已经创建成功。
11、数据共享(nfs服务器上操作)
$ cd /data/nfs
$ vi index.html
# 添加如下内容:
<h3>hello nfs</h3>
12、对外暴露应用
$ kubectl expose deployment ngin-dep1 --port=80 --target-port=80 --type=NodePort --name nginx
查看service
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
nginx NodePort 10.103.95.41 <none> 80:31252/TCP 20h
可以看到service已经成功创建成功。
13、浏览器端访问应用
通过IP:端口号在浏览器端访问nginx服务:
可以看到在nfs服务器端挂载路径下添加index.html文件后,Pod容器内容也相应发生了变化。