K8S-数据持久化
在k8s中为什么要做持久化存储?
使用POD的文件系统保存数据并不可靠,因为POD可能会被删除或重启,从而导致数据丢失
我们想要使用存储卷,需要经历如下步骤
1、定义pod的volume,这个volume指明它要关联到哪个存储上的
2、在容器中要使用volumemounts挂载对应的存储`
持久化的类型
kubectl explain pod.spec.volumes # 查看持久化类型的字段定义emptyDir:挂载在宿主机临时目录,生命周期绑定整个 Pod 资源,只要 Pod 不删,即使容器反复重启数据都在
hostPath:Pod 重启、Pod 删除,
数据都永久保存在宿主机本地目录|只能给同节点的POD使用|DaemonSetPV 是一整块完整存储空间(NFS / 云盘 / 本地盘),PV只能绑定一个PVC
PVC是存储申请单,声明需要多大容量,PV剩余的容量会处于闲置状态
StorageClass:PVC 需要多大空间,PV 就自动创建多大空间
临时共享文件夹--emptyDir
Pod 一删,数据就没了
同一个 Pod 里的多个容器可以共享数据
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: vol-emptydir
emptyDir:
sizeLimit: 200Mi
containers:
- name: container-alpine
image: alpine:3.7
command: ["bin/sh", "-c", "sleep 3600"]
volumeMounts:
- name: vol-emptydir
mountPath: /home
- name: container-nginx
image: nginx:1.26.2
ports:
- containerPort: 80
volumeMounts:
- name: vol-emptydir
mountPath: /usr/share/nginx/html
kubectl get pod deploy-nginx-54d8c55bcf-gfbg2 -oyaml | grep uid # 查看pod的uid
cd /var/lib/kubelet/pods/<uid>/volumes/kubernetes.io~empty-dir/vol-emptydir[spec/template/spec/volumes/name] # 在pod对应的node上查看数据
kubectl exec -it deploy-nginx-d7b6d6b8b-gg4kb -c container-nginx -- ls /usr/share/nginx/html # 查看容器内的文件内容
# 任意pod写入文件,emptyDir的卷会同步数据到其他容器中
kubectl exec -it deploy-nginx-d7b6d6b8b-gg4kb -c container-alpine -- sh
echo 'Test' > /home/index.html
# node的/var/lib/kubelet/pods/<uid>/volumes/kubernetes.io~empty-dir/vol-emptydir
# 等于
# container-alpine的/home
# 等于
# container-nginx的/usr/share/nginx/html
kubectl delete -f empty-dir.yaml
# node的/var/lib/kubelet/pods/<uid>也会被删除
宿主机目录--hostPath
hostPath类型:即使pod被删除,数据也不会丢失
hosePath可以挂载宿目录或文件,emtpyDir只能挂载目录
DirectoryOrCreate 若主机路径不存在,自动创建该目录(权限为0755,属主是root);若路径已存在,要求必须是目录。
FileOrCreate 若主机路径不存在,自动创建该文件(权限为0644,属主是root);若路径已存在,要求必须是文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: vol-hostpath
hostPath:
path: /root/nginx
type: DirectoryOrCreate
containers:
- name: container-nginx
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx
ports:
- containerPort: 80
volumeMounts:
- name: vol-hostpath
mountPath: /usr/share/nginx/html
# node的/root/nginx 等于 pod的/usr/share/nginx/html
网络文件存储--NFS
文件系统挂载到远程服务器上,客户端和服务端通过RPC实现访问
NFS服务器
yum install rpcbind nfs-utils -y
mkdir -p /root/nfs/data
echo "/root/nfs/data *(insecure,rw,sync,no_root_squash)" > /etc/exports
systemctl start rpcbind && systemctl start nfs-server
systemctl enable rpcbind && systemctl enable nfs-server
NFS客户端
客户端无法直接删除挂载目录,只能先卸载[取消挂载]
yum install rpcbind nfs-utils -y
systemctl start rpcbind && systemctl enable rpcbind
showmount -e 192.168.248.10 # 查看nfs服务器共享目录
mkdir -p /root/nfs
mount -t nfs 192.168.248.10:/root/nfs/data /root/nfs # 挂载nfs服务器共享目录到本地
df -t nfs4 # 查看nfs挂载情况
umount -f /root/nfs # 取消挂载,-f强制卸载
0. *代表所有客户端地址,也可以指定,例如: 192.168.1.50
1. insecure:使用1024以上的端口, secure:使用1024以下的端口
2. rw:可读写权限, ro:只读权限
3. sync:数据同步写入内存和硬盘(效率低不丢数据), async:数据先缓存到内存, 待硬盘空闲再写入硬盘
4. no_root_squash:客户端用root访问共享文件夹时不压缩root权限。root_squash:将root访问转为匿名访问。all_squash:将所有用户访问转为匿名。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-nginx
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: vol-nfs
nfs:
path: /root/nfs/data # NFS_server
server: 192.168.248.10
containers:
- name: container-nginx
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/nginx
ports:
- containerPort: 80
volumeMounts:
- name: vol-nfs
mountPath: /usr/share/nginx/html
NFS简单易用, 支持跨平台, 数据集中存储, 这些都是它的优点。不足之处体现在
- 在高并发场景下性能不佳
- 不提供数据备份的高级别配置
- pod挂载任意的NFS写数据, 存储资源的使用不可控, 可能导致NFS服务器崩溃
集群级持久化存储
PV
kubectl api-resources | grep pv # 查看pv资源
kubectl get pv # 查看所有PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
# 1.存储能力
capacity:
# 存储大小(200Mi)
storage: 200Mi
# 2.访问模式(HostPath仅支持ReadWriteOnce, NFS除ReadWriteOncePod外都支持)
# https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
accessModes:
# RWO访问模式。只允许被单个节点读写挂载
- ReadWriteOnce
# RWO访问模式。只允许被单个Pod读写挂载
- ReadWriteOncePod
# ROX访问模式。允许被多个节点只读挂载
- ReadOnlyMany
# RWX访问模式。允许被多个节点读写挂载
# 3.回收策略
# Retain 保留。删除PVC不会同步删除PV, 等管理员手动去处理PV里的数据。NFS、HostPath都支持该选项
# Delete 删除。删除PVC同步删除PV。NFS、HostPath都不支持该选项
# Recycle 回收。删除PVC同步删除PV且返回可用状态。K8s v1.9后该回收策略标记为过时
persistentVolumeReclaimPolicy: Retain
# nfs服务器设置
nfs:
path: /root/nfs/data/pv1 # 确保/root/nfs/data/pv1事先存在
server: 192.168.248.10
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
capacity:
storage: 200Mi
accessModes:
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain # 回收策略,默认为Retain,Retain的意思是保留数据,删除PVC不会同步删除PV
nfs:
path: /root/nfs/data/pv1 # 确保/root/nfs/data/pv1事先存在
server: 192.168.248.10
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv2
labels:
pv: nfs-pv2
spec:
capacity:
storage: 200Mi
accessModes:
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/nfs/data/pv2
server: 192.168.248.10
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-grafana
labels:
pv: nfs-grafana
spec:
capacity:
storage: 200Mi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/nfs/data/grafana
server: 192.168.248.10
PVC
POD必须与PVC在同一个命名空间下

StoageClass
动态模式:通过StoageClass自动完成PV的创建以及PVC的绑定
provisioner # 存储卷插件,作用是创建存储卷, 例如: kubernetes.io/nfs
parameters # 存储卷插件的参数, 例如: 对于NFS来说, 需要指定服务器地址和共享目录
reclaimPolicy # 回收策略

浙公网安备 33010602011771号