容器内的目录和宿主机的目录进行挂载 |
容器在系统上的生命周期是短暂的,delete,k8s用控制器创建的pod,delete相当于重启,容器的状态也会恢复到初始状态,一旦回到初始状态,所有的后天编辑的文件都会消失 容器和几点之间创建一个持久化保存容器内文件的存储卷,即使容器被销毁,删除,重启,节点上的存储卷的数据依然存在,后续也可以继续使用。可以继续将容器内的目录和宿主机挂载,保存的数据继续使用 |
三种存储方式
emptyDir | 作用: 容器内部共享存储卷,k8s系统中,是一个pod当中的多个容器共享一个存储卷目录emptyDir卷可以是pod当中容器在这个存储卷上读取和写入 EmpytyDir是不能挂载到节点的,随着pod的生命周期结束,emptyDir也会结束,数据也不会保留 所以emptyDir就是用来容器内部的共享,lnmp |
hostPath | 将容器内的挂载点,和节点上的目录进行挂载,hostPath可以实现数据的持久化,node节点被销毁,那么数据也会丢失 面试题:污点设置为NoExecute:节点上的pod会被驱逐,文件数据在不在? 1.Pod被驱逐,并不是node节点被销毁,所有数据还保留在节点上 2.Pod被驱逐(基于控制器创建的)会在其他节点部署,并且会在其他节点上生成一个新的存储卷,数据依然可以持久化 3.EmptyDir的共享数据,会丢失 |
NFS共享存储 | 所有的pod内的目录都和节点上的nfs共享目录形成数据卷,所有的数据文件都保存在共享目录当中,集中,方便管理 |
查看同一容器不同副本的log
[root@master01 k8s.yaml]# kubectl logs nginx-c85454d4d-4m6p2 -c nginx1
[root@master01 k8s.yaml]# kubectl logs nginx-c85454d4d-4m6p2 -c nginx2
emptyDir
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其他容器的共享目录
- image: nginx:1.22
name: nginx2
volumeMounts:
- name: html
mountPath: /data/
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载
command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
#每隔两秒打印一下当前时间
volumes:
- name: html
emptyDir: {}
hostPath
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其>他容器的共享目录
- image: nginx:1.22
name: nginx2
volumeMounts:
- name: html
mountPath: /data
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载
command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
volumes:
- name: html
hostPath:
path: /opt/test1
type: DirectoryOrCreate
#如果没有/opt/test1就直接创建
# /usr/share/nginx/html, /data ,/opt/test1 ,三者是一体的,在节点上的目录里创建或者修改文件都会改变容器内的文件,不同节点上除了index.html是一样的,其他不一样
NFS共享存储
[root@k8s4 ~]# vim /etc/exports
/data/volumes 192.168.233.0/24(rw,no_root_squash)
[root@k8s4 ~]# cd /data/
[root@k8s4 data]# mkdir volumes
[root@k8s4 data]# chmod 777 volumes
[root@k8s4 data]# systemctl restart rpcbind
Job for rpcbind.service failed because the control process exited with error code. See
#报错之后的操作
[root@k8s4 data]# netstat -antp | grep rpcbind
[root@k8s4 sbin]# kill -9 5513
[root@k8s4 sbin]# systemctl restart rpcbind
[root@k8s4 sbin]# systemctl restart nfs
[root@k8s4 sbin]# showmount -e
Export list for k8s4:
/data/volumes 192.168.233.0/24
#到master01操作
[root@master01 k8s.yaml]# showmount -e 192.168.233.84
Export list for 192.168.233.84:
/data/volumes 192.168.233.0/24
[root@master01 k8s.yaml]# vim e.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其>他容器的共享目录
- image: nginx:1.22
name: nginx2
volumeMounts:
- name: html
mountPath: /data
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载
command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
volumes:
- name: html
nfs:
path: /data/volumes
server: 192.168.233.84
#这里的server可以是ip地址也可以用主机名来替代 如k8s ,主机名要做映射,所有的节点都必须>要做