首页 > 技术文章 > k8s基础概念之六 volumes

RRecal 2021-12-16 17:33 原文

自动创建

……
spec:
  containers:
  ……
    volumeMounts:      #挂载一个数据卷
    - name: app-logs   #挂载数据卷名字
      mountPath: /logs #挂载路径
  ……
  volumes:          #定义一个数据卷
  - name: app-logs  #定义一个数据卷名字
    emptyDir: {}    # volume的类型,emryDir的参数设置为{}  
---
#注解:
"emptyDir: 无需指定宿主机目录,由pod自动创建,pod移除时候数据会永久删除,作为容器间的共享目录
"
---
#扩展:
apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs       # 容器中的日志目录
      
  - name: logreader                           # 容器名称,使用kubectl指定容器时需要使用此名称,无法使用容器ID
    image: busybox
    command: ["sh","-c","tail -f /logs/catalina*.log"]
    volumeMounts:
    - name: app-logs
      mountPath: /logs
  volumes:                                    # volume设定的具体信息
  - name: app-logs
    emptyDir: {}                              # volume的类型,emryDir的参数设置为{}  

#这里的示例是将tomcat容器的日志目录和logreader的log目录共享,通过在logreader执行查看日志的命令,就可以在logreader中看到tomcat的启动日志。

 

 

手动创建挂载目录

hostPath: Pod挂载宿主机上的文件和目录,可用于永久保存日志,容器内部访问宿主机数据,

……
spec:
  containers:
  ……
    volumeMounts:      #挂载一个数据卷
    - name: app-logs   #挂载数据卷名字
      mountPath: /logs #挂载路径
  ……
  volumes:          #定义一个数据卷
  - name: app-logs  #定义一个数据卷名字
    emptyDir: {}    # volume的类型,emryDir的参数设置为{}  
------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs
  volumes:
  - name: app-logs
    hostPath:
      # 宿主机的本地目录,需要事先创建,否则pod无法启动
      path: /logs
      # this field is optional
      type: Directory
#当pod删除时,数据依旧保存在宿主机目录中。

 

 

网络存储

apiVersion: v1
kind: Pod
metadata:
  name: cephfs
spec:
  containers:
  - name: cephfs-rw
    image: kubernetes/pause
    volumeMounts:
    - mountPath: "/mnt/cephfs"
      name: cephfs
  volumes:
  - name: cephfs
    cephfs:
      monitors:
      - 10.16.154.78:6789
      - 10.16.154.82:6789
      - 10.16.154.83:6789
      # by default the path is /, but you can override and mount a specific path of the filesystem by using the path attribute
      # path: /some/path/in/side/cephfs   #更改挂载
      user: admin
      secretFile: "/etc/ceph/admin.secret"
      readOnly: true

 

 

什么情况下会使用到valumes

一些需要持久化数据的程序才会使用到valmes,或者一些需要数据共享的容器需要volumes

 

日志收集的需求

需要在应用程序里面加一个sidecar,这个容器是一个收集日志的容器

emptyDir

……
spec:
  containers:
  ……
  volumesMounts:
  - mountPath: /etc/timezone    #挂载到容器的目录
    name: timezone     #需要挂载持久卷的名字
  ……
  volumes:
  - name :timezone  #定义一个持久卷,可以写多个,多加一个name即可
    hostPath:
      path: /etc/timezone  #宿主机的目录
      emptyDir: {}         #和以下不同的是,将type换成这个即可
"
    和volumes不同的是,如果删除pod,emptyDir卷中的数据也将被删除,一般emptyDir卷用于pod中的不同容器共享数据
,他可以挂在到相同或者不同的路径上 默认情况下,emptyDir卷支持节点上的任何介质,可能是SSD、磁盘、或网络存储,具体取决于自身的环境,
可以将emptyDir、medium字段设置为Memory字段设置为memory,让kubernetes使用tmpfs,碎肉tmpfs非常快,但是tmpfs在节点重启时
,数据同样会被清除,并且设置的大小会被记入到COntainer的内存限制当中
"

 

 

hostPath

将节点或者主机上的目录挂载到pod上

……
spec:
  containers:
  ……
  volumesMounts:
  - mountPath: /etc/timezone    #挂载到容器的目录
    name: timezone     #需要挂载持久卷的名字
  ……
  volumes:
  - name :timezone  #定义一个持久卷,可以写多个,多加一个name即可
    hostPath:
      path: /etc/timezone  #宿主机的目录
      type: File           #挂载类型
   """
   type的类型:
           type为空字符串:默认选项,以为这挂载hostPath之前不会执行任何检查
           DirectotyOrCreate:如果给定的path不存在任何东西,name将根据需要创建一个权限为0755的空目录,和kubelet具有相同的组合权限。
           FileOrCreate:如果给定的路径不存储任何内容,则会根据需要创建一个空文件,权限设置为0655,和kubelet具有相同的组合所有权
           File:文件不许存在给定的路径中。
           Socket:Unix套接子,必须存在于给定路径中。
           CharDevice:字符设备,必须存在于给定路径中
           BlockDevice:块设备,必须存在于给定路径中
   """

 

 

nfs挂载至容器

#nfs服务器搭建跳过
……
spec:
  containers:
    ……
    volumesMounts:
    - mountPath: /mnt
      name: nfs-volumes
  volumes:
  -name: nfs-volumes
   nfs: 
     server: 192.168.159.14     #nfs服务器ip
     path: /data/nfs/test-dp     #/data/nfs是nfs共享的目录

 

 

推荐阅读