一,概要
1,实现步骤
想要使用存储卷,需要经历如下步骤
1、定义pod的volume,这个volume指明它要关联到哪个存储上的
2、在容器中要使用volumemounts挂载对应的存储
2,常用存储类型
# kubectl explain pods.spec.volumes
emptyDir <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-emptydir
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts: # 定义pod的目录参数
- name: pod-volume # 目录名字必须与volumes的名字相同
mountPath: /cache # pod内的指定的挂在目录
volumes: # 定义宿主机目录参数
- emptyDir: {} # 设定宿主机指定临时目录
name: pod-volume # 目录名字必须与 volumeMounts名字相同
【查找临时目录的位置】:
第一步:查找uid
kubectl get pods name-emptydir -o yaml | grep uid
uid: 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.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-hostpath
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: test-nginx
volumeMounts:
- mountPath: /test-nginx
name: test-volume # 与volumes的名称一致
- image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
name: test-tomcat
volumeMounts:
- mountPath: /test-tomcat
name: 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: 3
selector:
matchLabels:
cunchu: nfs
template:
metadata:
labels:
cunchu: nfs
spec:
containers:
- name: test-nfs
image: xianchao/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- name: nfs-volumes # 与指定的卷名称一致
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-volumes # 卷名称
nfs:
server: 192.168.40.180 # 服务主机ip,此处为master主机ip
path: /data/volumes # 与之前创建的nfs的共享卷地址一致
删除其中一个pod,自动生成的pod后,依然数据可以访问。
缺点:
单节点。 存储节点一单宕机,所有pod共享数据集,均丢失。