某些应用是要持久化数据的,如果直接持久化在pod所在节点,当pod因为某种原因重建或被调度另外一台节点,是无法访问到之前持久化的数据,所以需要一个公共存储数据的地方,无论pod删除重建或重新调度到其他节点都能访问原来的数据,使用nfs就可以到达此目的。
一、安装nfs
1.在k8sMaster主节点上安装nfs服务端
apt install -y nfs-kernel-server
systemctl start nfs-server
systemctl enable nfs-server
systemctl status nfs-server
查看安装后的状态为active
创建目录并设置权限
mkdir -p /nfs/data
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
不要忘了重启nfs-server
systemctl restart nfs-server
2.在两台k8sworker节点上安装nfs客户端
apt install -y nfs-common
mkdir -p /nfs/data
# 把本地的/nfs/data挂载到主节点上
mount 192.168.59.110:/nfs/data /nfs/data
3.测试
在某台worker节点上往目录中写入测试文件数据
echo "nfs data" >> /nfs/data/test.txt
在所有节点上都能查看到写入的数据,并且是一样的
二、使用原始方式挂载pod数据目录
1.先删除之前dev名称空间下的所有资源
kubectl delete ns dev
2.把ns、deployment、svc资源的描述合并在一个yaml文件中
vi nginx-deploy-svc.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nginxvolume
mountPath: /usr/share/nginx/html
volumes:
- name: nginxvolume
#通过nfs服务挂载
nfs:
server: 192.168.59.110
# 此处要特别注意:一定要手动创建nginx子目录,否则pod在过载的时候会报目录不存在异常
path: /nfs/data/nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-nginx
name: svc-nginx
namespace: dev
spec:
selector:
app: nginx
type: NodePort
ports:
- port: 8000
protocol: TCP
targetPort: 80
3.创建资源对象
kubectl apply -f nginx-deploy-svc.yaml
查看svc的ip与端口号
4.测试
在挂载目录中创建index.html
echo "hello,nfs" >> /nfs/data/nginx/index.html
通过ip端口访问,可以看到读取的就是nfs目录中的内容
现在你可以把dev名称空间删除,然后重新创建这些资源,再次访问的时候,发现数据还在。
三、PV
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置,与namespace无关
1.先创建nfs目录
# 在master节点执行
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
2.创建基于nfs的pv对象
(1)创建pv资源文件
vi pv.yaml
(2)编写三个pv资源对象,大小分别是:10M,1G,5G
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-10m
spec:
capacity:
storage: 10M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.59.110
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.59.110
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-5gi
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 192.168.59.110
(3)创建pv对象
kubectl apply -f pv.yaml
3.查看创建结果
kubectl get pv
pv对象列表
某个pv对象的详细信息
四、PVC
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
1.创建pvc
(1)创建pvc资源文件
vi pvc.yaml
(2)编写pvc资源申明信息
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
# 申请200M的空间
storage: 200Mi
storageClassName: nfs
(3)创建pvc对象
kubectl apply -f pvc.yaml
2.查看创建结果
kubectl get pvc -owide -n dev
由于申请的是200M空间,可以看到k8s自定绑定到合适的pv对象上,即选择大小为1G的pv对象。
再回过头来查看pv对象的绑定信息,可以看到已经和刚刚创建的pvc对象绑定了。
五、绑定pod与pvc
1.创建新的yaml文件
(1)新建资源文件
vi nginx-dp-svc-pvc.yaml
(2)使用persistentVolumeClaim属性指定刚刚创建的nginx-pvc对象
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nginxvolume
mountPath: /usr/share/nginx/html
volumes:
- name: nginxvolume
# 使用pvc
persistentVolumeClaim:
claimName: nginx-pvc
---
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-nginx
name: svc-nginx
namespace: dev
spec:
selector:
app: nginx
type: NodePort
ports:
- port: 8000
protocol: TCP
targetPort: 80
(3)创建pod,svc对象
kubectl apply -f nginx-dp-svc-pvc.yaml
2.测试
由于申请的是pvc是与名称为pv-1gi的pv对象绑定的,所以往/nfs/data/02文件夹中写入index.htm文件进行测试
echo "hello,pv" >> /nfs/data/02/index.html
使用ip访问服务,可以看到正确输出了内容
再次查看pv,pvc信息
3.删除pod
当删除pod,与之绑定的pvc对象也会被删除,pv对象的状态变成Released
【文章原创作者:美国多ip站群服务器 http://www.558idc.com/mgzq.html