Kubernetes(二十二)Volumes

容器中的磁盘文件是临时存放的,如果容器销毁、停止数据也将丢失。同时在一个pod运行多个容器的时候,常常需要在容器之间共享数据。kubernetes抽象出voleme对象来解决这2个问题。
 
  • Volume类型
  • emptyDir
    • 当pod指定到某个节点上时,首先创建的是一个emptyDir,并且pod只要一直在这个node上运行,emptyDir就一直存在。当pod从节点删除时,emptydir卷也会被永久删除。它的主要用途如下:
      • 缓存空间,例如基于磁盘的归并排序。
      • 为耗时较长的任务提供检查点,以便于任务能够方便的从崩溃前恢复执行。
      • 在web服务器容器服务数据时,保存内容管理器获取的文件。
    • 应用场景:多容器之间的数据共享。
    • 示例 emptyDir.yaml
      apiVersion: v1
      kind: Pod
      metadata:
        name: test-pd
      spec:
        containers:
        - image: k8s.gcr.io/test-webserver #写入的容器
          name: test-container-write
          volumeMounts:
          - mountPath: /cache
            name: cache-volume #使用的数据卷名称,跟volumes:name要能匹配上
        
        - image: k8s.gcr.io/test-webserver #读取的容器
          name: test-container-read
          volumeMounts:
          - mountPath: /cache
            name: cache-volume #使用的数据卷名称,跟volumes:name要能匹配上
            
        volumes: #定义数据卷来源,支持定义多个数据卷
        - name: cache-volume #定义数据卷的名称1
          emptyDir: {}

        - name: cache-volume2 #定义数据卷的名称2
          emptyDir: {}
    • kubectl apply -f emptyDir.yaml #创建带volume的pod

    •  
  • hostPath
    • hostpath挂载和docker原理是一样的;就是将卷挂载在node节点物理磁盘上。
    • 支持以下type类型
      • 空 空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
      • DirectoryOrCreate 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权。
      • Directory 在给定路径上必须存在的目录。
      • FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。
      • File 在给定路径上必须存在的文件。
      • Socket 在给定路径上必须存在的 UNIX 套接字。
      • CharDevice 在给定路径上必须存在的字符设备。
      • BlockDevice 在给定路径上必须存在的块设备。    
    • 应用场景:pod容器需要访问宿主机文件。
    • 示例 hostPath.yaml
    • apiVersion: v1
      kind: Pod
      metadata:
        name: test-pd
      spec:
        containers:
        - image: k8s.gcr.io/test-webserver
          name: test-container #pod容器名称
          volumeMounts:
          - mountPath: /test-pd #容器内的目录
            name: test-volume #使用的数据卷名称,跟volumes:name要能匹配上
        volumes:
        - name: test-volume #定义数据卷的名称
          hostPath:
            # 宿主机的路径
            path: /data
            # type类型
            type: Directory

    •  
    • kubectl apply -f emptyDir.yaml #创建带volume的pod
  • nfs
    • nfs网络卷可以不受容器销毁、节点销毁而永久存储数据在其他的服务端云服务器上。
    • githup https://github.com/kubernetes/examples/tree/master/staging/volumes/nfs
    • 安装客户端
      • 挂载nfs需要node支持客户端的库nfs-utils
      • yum install nfs-utils -y #安装nfs
      • systemctl start nfs #启动nfs
    • 安装服务端
      • yum install nfs-utils -y #安装nfs
      • vi /etc/exports
      • /data/nfs *(rw,no_root_squash) #暴露/data/nfs 目录,支持所有的IP来访问,支持读写权限;
      • systemctl start nfs #启动nfs     
    • nfs.yaml
      apiVersion: apps/v1beta1
      kind: Deployment
      metadata:
        name: nginx-deployment
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        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.31.61  #nfs服务地址
                path: /data/nfs #nfs暴露的目录
      • kubectl apply -f nfs.yaml #创建nfs的pod  
 
 
原文地址:https://www.cnblogs.com/TSir/p/12272917.html