目录
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。
1.emptyDir存储卷
容器之间共享数据无持久化
当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除。
示例:
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo.pod
name: demo.pod
spec:
volumes: #定义一个存储卷
- name: tan-vol #定义存储卷名字
emptyDir: {}
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: tan-vol
mountPath: /mnt/
- image: busybox:1.28
name: busybox
volumeMounts: #设置挂载数据卷
- name: tan-vol #设置挂载数据卷名字
mountPath: /data/ #设置挂载目录(容器内)
command: #设置操作命令
- sh
- -c
- "while true; do echo '123' >> /data/scj.txt; sleep 2; done"
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl apply -f pod.yaml
验证数据持久化:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo.pod
name: demo.pod
spec:
volumes:
- name: tan-vol
emptyDir: {}
containers:
- image: soscscs/myapp:v1
name: myapp
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: tan-vol
mountPath: /mnt/
- image: busybox:1.28
name: busybox
volumeMounts:
- name: tan-vol
mountPath: /data/
command:
- sh
- -c
- "while true; do echo '456' >> /data/scj.txt; sleep 2; done" #修改内容重新生成
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl delete -f pod.yaml && kubectl apply -f pod.yaml #更新数据
2.hostPath存储卷
挂载宿主机文件/目录,实现数据共享,只能在单机上实现持久化
hostPath卷将 node 节点的文件系统中的文件或目录挂载到集群中。
hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失。
示例:
vim demo3.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo3
name: demo3
spec:
volumes:
- name: tan-vol
hostPath:
path: /opt/tan
type: DirectoryOrCreate
containers:
- image: soscscs/myapp:v1
name: demo
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: tan-vol
mountPath: /usr/share/nginx/html
readOnly: false
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl apply -f demo3.yaml
测试不同节点数据是否能共享
vim demo3.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo3
name: demo4 #修改资源名
spec:
nodeName: node01 #指定node节点创建资源
volumes:
- name: tan-vol
hostPath:
path: /opt/tan
type: DirectoryOrCreate
containers:
- image: soscscs/myapp:v1
name: demo
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: tan-vol
mountPath: /usr/share/nginx/html
readOnly: false
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl apply -f demo3.yaml
3.nfs共享存储卷
跨node节点的Pod共享数据
配置nfs,任选一台服务器
systemctl disable --now firewalld.service
setenforce 0
yum install -y rpcbind nfs-utils
systemctl enable --now rpcbind nfs
mkdir /opt/nfs #创建共享目录
vim /etc/exports
/opt/nfs 192.168.9.0/24(rw,sync,no_root_squash)
exportfs -avr #共享
确保两台node节点的rpcbind是开启状态
vim demo4.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo4
name: demo4
spec:
volumes: #定义一个存储卷
- name: tc-vol #定义存储卷名字
nfs: #存储卷类型为nfs
path: /opt/nfs #NFS服务器上的共享目录路径
server: 192.168.9.116 #NFS服务器的IP地址
containers:
- image: soscscs/myapp:v1
name: demo
ports:
- containerPort: 80
resources: {}
volumeMounts: #存储卷挂载
- name: tc-vol #挂载的存储卷
mountPath: /mnt #存储卷挂载目录
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl apply -f demo4.yaml
实现跨节点通信
vim demo4.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo4
name: demo5
spec:
nodeName: node01 #指定节点创建
volumes:
- name: tc-vol
nfs:
path: /opt/nfs
server: 192.168.9.116
containers:
- image: soscscs/myapp:v1
name: demo
ports:
- containerPort: 80
resources: {}
volumeMounts:
- name: tc-vol
mountPath: /mnt
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl apply -f demo4.yaml