一.为什么需要存储卷
Container中的文件在磁盘上是临时存放的,这给container中运行比较重要的应用程序带来一些问题
- 当容器崩溃时文件丢失:kubelet会重新启动容器,但容器会以干净的状态重启
- 同一pod中运行多个容器,如何共享文件
回顾:容器部署过程中一般需要三种数据
- 启动时需要初始化数据:例如配置文件
- 启动过程中会产生临时数据,该临时数据需要多个容器共享
- 启动过程中产生的持久化数据,例如mysql的数据目录
kubernetes中的Volume提供了容器中挂载外部存储的能力
Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可以使用相应的Volume
官网文档:https://kubernetes.io/zh/docs/concepts/storage/volumes/
二.数据卷的类型
- 本地(hostPath、emptyDir)
- 网络(NFS、Ceph、 GlusterFs)
- 公有云(AWS EBS)
- k8s资源(configmap、secret)
三. emptyDir
emptyDir是一个临时存储卷,与pod的生命周期绑定在一起。pod删除,卷也会被删除 应用场景:pod容器之间数据共享
apiVersion: v1 kind: Pod metadata: name: emptydir-pod namespace: volume spec: containers: - name: write image: centos command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"] volumeMounts: - name: data mountPath: /data - name: read image: centos command: ["bash","-c","tail -f /data/hello"] volumeMounts: - name: data mountPath: /data volumes: - name: data emptyDir: {}
P
###多个pod之间数据共享
三.hostPath
hostPath卷:挂载node文件系统(pod所在的节点)上的文件或者目录到pod中的容器内 应用场景:Pod中的容器需要访问宿主机文件
apiVersion: v1 kind: Pod metadata: name: hostpath-pod namespace: volume spec: containers: - name: hostpath-pod image: nginx volumeMounts: - mountPath: /data/ # 容器中挂载的目录位置 name: configdir # 挂载名: 与volumes中的name字段一致 - mountPath: /data/volume name: yamlfile volumes: - name: configdir hostPath: # 确保文件所在目录成功创建。 path: /root/yaml/config type: DirectoryOrCreate - name: yamlfile hostPath: path: /root/yaml/volume/hostpath-pod.yaml type: FileOrCreate
四.NFS卷
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-web namespace: volume spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot nfs: server: 192.168.11.130 # nfs服务器 path: /ifs/kubernetes # nfs服务端共享出来的路径