【kubernetes】持久化存储 —— nfs,emptyDir,hostPath
一,概要
1,实现步骤
想要使用存储卷,需要经历如下步骤
1、定义pod的volume,这个volume指明它要关联到哪个存储上的
2、在容器中要使用volumemounts挂载对应的存储
2,常用存储类型
# kubectl explain pods.spec.volumesemptyDir <Object> # 临时目录,随之删除
hostPath <Object> # 宿主机目录
nfs <Object>
persistentVolumeClaim <Object>
glusterfs <Object>
cephfs <Object>
configMap <Object>
secret <Object>
二,应用
(1)emptyDir类型
在宿主机上,创建临时目录作为存储地址。当pod删除后,该临时目录一并删除。
# cat emptydir.yaml apiVersion: v1
kind: Pod
metadata:name: name-emptydir
spec:containers:- name: pod-emptydirimage: nginximagePullPolicy: IfNotPresentvolumeMounts: # 定义pod的目录参数- name: pod-volume # 目录名字必须与volumes的名字相同mountPath: /cache # pod内的指定的挂在目录volumes: # 定义宿主机目录参数- emptyDir: {} # 设定宿主机指定临时目录name: pod-volume # 目录名字必须与 volumeMounts名字相同
【查找临时目录的位置】:
第一步:查找uid
kubectl get pods name-emptydir -o yaml | grep uiduid: a105fca2-b82c-46c2-8ba3-e0aa3f528540
第二步:在pod分配node节点拼接路径
/var/lib/kubelet/pods/
+ uid值
可以通过tree
命令向下查找
第三步:测试内容同步
缺点:
pod删除,数据删除。
(2)hostPath类型
hostPath Volume是指Pod挂载宿主机上的目录或文件。
hostPath Volume使得容器可以使用宿主机的文件系统进行存储,
hostpath(宿主机路径):节点级别的存储卷,在pod被删除,这个存储卷还是存在的,不会被删除,所以只要同一个pod
被调度到同一个节点
上来,在pod被删除重新
被调度到这个节点之后,对应的数据依然是存在的。
# cat hostpath.yamlapiVersion: v1
kind: Pod
metadata:name: test-hostpath
spec:containers:- image: nginximagePullPolicy: IfNotPresentname: test-nginxvolumeMounts:- mountPath: /test-nginxname: test-volume # 与volumes的名称一致- image: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentname: test-tomcatvolumeMounts:- mountPath: /test-tomcatname: test-volume # 与volumes的名称一致volumes:- name: test-volume # 与容器pod的名称一致hostPath: path: /data1 # 宿主机的路径type: DirectoryOrCreate # 查看下面图说明:
进入到指定pod内的指定容器内:
kubectl exec -it test-hostpath -c test-tomcat -- /bin/bash
缺点:
单节点。 pod删除之后,数据虽然没有丢失,但是重新创建的pod,必须调度到同一个node节点,数据才会还原。
(3)nfs类型
一,安装NFS:网络文件系统。
第一步:在master和其他node节点安装NFS
yum install nfs-utils -y
systemctl start nfs
systemctl enable nfs --now
systemctl status nfs
第二步:在master节点配置NFS
# 在宿主机创建NFS需要的共享目录
mkdir /data/volumes -pv # vim /etc/exports
/data/volumes *(rw,no_root_squash)# 保持生效
exportfs -arv
service nfs restart
- rw 该主机对该共享目录有读写权限
- no_root_squash 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限
第三步:在node01上,手动测试 挂载/卸载
【挂载】:
mkdir /test
mount 192.168.40.180:/data/volumes /test/# 如果执行如下命令,查看挂载卷,说明nfs可以被正常挂载
df -h
192.168.40.180:/data/volumes 50G 5.2G 45G 11% /test
【卸载】:
umount /test
二,创建Pod,挂载NFS共享出来的目录。
# cat nfs.yaml apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-test
spec:replicas: 3selector:matchLabels:cunchu: nfstemplate:metadata:labels:cunchu: nfsspec:containers:- name: test-nfsimage: xianchao/nginx:v1imagePullPolicy: IfNotPresentports:- containerPort: 80protocol: TCPvolumeMounts:- name: nfs-volumes # 与指定的卷名称一致mountPath: /usr/share/nginx/htmlvolumes:- name: nfs-volumes # 卷名称nfs:server: 192.168.40.180 # 服务主机ip,此处为master主机ippath: /data/volumes # 与之前创建的nfs的共享卷地址一致
删除其中一个pod,自动生成的pod后,依然数据可以访问。
缺点:
单节点。 存储节点一单宕机,所有pod共享数据集,均丢失。