数据卷与持久卷

一.为什么需要存储卷

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服务端共享出来的路径

 

 

   

上一篇:快速入门Kubernetes(K8S)——资源清单


下一篇:WTF?在beta环境的代码一言不合就启动失败啦