为什么我们需要将数据持久化
- 假如现在我们在整个集群环境,有一个3副本的nginx服务,我们将我们的前端代码放到了html文件下面,这里我们使用111来代表我们的前端资源,可以看到,可以正常访问到111
- 但是我们在重启了服务,或者重启了pod之后,发现我们的资源丢失,资源不存在了,只能访问到nginx的默认界面
所以我们需要将数据和外部的目录文件进行映射,但是呢,假如我们按照docker的方式进行挂载,如果有一台节点上面的nginx的服务宕机了,本来服务是在节点3上面,现在重启过后,由于调度问题,我们的资源被重启在了节点2上面,就访问不到之前的资源了,所以这里我们需要抽象出一层存储层,来实现数据持久化,无论是采用Glustrtfs,NFS,还是CephFS都可以,本文选择NFS作为数据持久化的文件系统
NFS环境搭建
节点信息
主机 | IP地址 |
---|---|
master | 192.168.229.135 |
node1 | 192.168.229.136 |
node2 | 192.168.229.137 |
- 所有节点进行NFS的工具安装
yum install -y nfs-utils
- 主节点配置
#nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
- 从节点配置
#这里为你主节点的IP地址,主要是为了查看有哪些目录可以挂载
showmount -e 192.168.229.135
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
mount -t nfs 192.168.229.135:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
- 这里我们就完成了挂载,可以写入一个文件到主节点来查看是否完成同步,我们在主节点写入一个文件,可以查看到node1文件也有,文件同步是没问题的
原生方式数据挂载
- 编写yaml文件通过原生方式挂载
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 172.31.0.4
path: /nfs/data/nginx-pv
kubectl apply -f depoly.yaml
- 通过在外部目录编辑文件,查看是否完成同步
PV&PVC
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
可以做到数据的弹性缩放,要多少给多少,要是pod被删除了的话还可以回收空间
- 创建PV池
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
- 编写pv.yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.229.135
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.229.135
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-3gi
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 192.168.229.135
- 执行文件
kubectl apply -f pv.yaml
- 创建pvc,编写pvc的yaml文件,申请200M空间的
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
- 我们执行yaml文件,然后查看pv池的状态,发现1g的状态变成了bound状态
- 创建pod绑定pvc
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-pvc
name: nginx-deploy-pvc
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc
- 查看绑定情况
ConfigMap
抽取配置文件,并且可以自动更新
-编写一个redis.conf
vim redis.conf
appendonly yes
- 将之前的配置创建为配置集,配置集的位置保存在etcd里面
kubectl create cm redis-conf --from-file=redis.conf
- 创建pod,编写redis.yaml文件
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
command:
- redis-server
- "/redis-master/redis.conf" #指的是redis容器内部的位置
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: redis-conf
items:
- key: redis.conf
path: redis.conf
kubectl apply -f redis.yaml
进入容器查看可以看到redis的配置文件已经更新并且修改
如果大家想了解更多信息可以查看官方文档,如果这篇博客有帮到你,麻烦给个三连鼓励一下,谢谢!!!!
K8S官网文档地址link