Kubernetes-Volume
Volume
Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用 程序带来一些问题。问题之一是当容器崩溃时文件丢失。kubelet 会重新启动容器, 但容器会以干净的状态重启。 第二个问题会在同一
Pod
中运行多个容器并共享文件时出现。 Kubernetes 卷(Volume)这一抽象概念能够解决这两个问题。
NFS
安装nfs,设置挂载路径
yum -y install nfs-utils
cat >>/etc/exports<<-EOF
/data/nfs *(rw,sync,no_root_squash)
EOF
在k8s集群部署引用nfs持久网络存储
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.19
imagePullPolicy: Always
name: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: wwwroot
ports:
- containerPort: 80
volumes:
- name: wwwroot
nfs:
server: 192.168.2.241
path: /nfs/data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
hostPath
hostPath卷可将节点上的文件或目录挂载到Pod上,用于Pod自定义日志输出或访问Docker内部的容器等。
常用的type:
- type为空白字符串: 默认选项,意味着挂载hostPath卷之前不会执行任何检查。
- DirectroyOrCreate: 如果给定的path不存在任何东西,那么将根据需要创建一个权限为0755的空白目录,和kublet具有相同的组和权限。
- Directory:目录必须存在于给定的路径下。
- FileOrCreate: 如果给定的路径不存储任何东西,则会根据需要创建一个空白文件,权限设置为0644,和kubelet具有相同的组合权限。
- File:文件,必须存在于给定的路径下。
- Socket:UNIX套接字,必须存在于给定的路径下。
- CharDevice:字符设备,必须存在于给定的路径下。
- BlockDevice:块设备,必须存在于给定的路径下。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.19
imagePullPolicy: Always
name: nginx
volumeMounts:
- mountPath: /mnt
name: hosts
volumes:
- name: hosts
hostPath:
path: /etc/hosts
type: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
emptyDir
当 Pod 分派到某个 Node 上时,
emptyDir
卷会被创建,并且在 Pod 在该节点上运行期间,卷一直存在。 就像其名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载emptyDir
卷的路径可能相同也可能不同,这些容器都可以读写emptyDir
卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir
卷中的数据也会被永久删除。
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- image: nginx:1.19
name: nginx
volumeMounts:
- mountPath: /opt
name: share-volume
- image: nginx:1.19
name: nginx2
command:
- sh
- -c
- sleep 3600
volumeMounts:
- mountPath: /mnt
name: share-volume
volumes:
- name: share-volume
emptyDir: {}
当一个pod中运行两个容器,将/opt目录共享,在任一容器的opt目录下创建文件,另一个容器的opt目录下也能看见