K8s中的volumes-容器数据存放类型及位置

学习对象:kubectl explain pod.spec.volumespod.spec.containers.image.volumeMounts#

介绍Volumes#

容器内部也有自己的空间,但这里面保存的数据会在容器重启后就没了;所以为了保证容器重新启动时,数据保存不丢失,可以使用Volume挂载到pod上;另外,如果一个Pod中有多个容器,那么这个卷可以同时被所有的容器使用。

多容器的Pod中,容器之间无法互相访问彼此里面存的东西,所以可以用Volume来实现。

使用Volume首先要弄清楚:.spec.volumes.spec.containers.image.volumeMounts

spec:
  containers:
  - image: demoimage:latest
    name: containername
    volumeMounts:
    - name: thisVolumeName      # 和下面保持一致
      mountPath: /data          # 挂载在容器内的路径
      readOnly: true
  volumes:
  - name: thisVolumeName        # 保持一致
    emptyDir: {}                # 一种volume类型
  • .spec.volumes.name.spec.containers.image.volumeMounts.name这样就可以将volume挂载到容器的对应位置;
  • 挂载点路径不存在的话是会自动创建的,而且可以设置挂载点权限readOnly: true;

当我设置readOnly: true,在容器中看挂载文件夹的权限是777,但尝试写入时:

# touch aaa
touch: aaa: Read-only file system

Volume重要参数#

持续更新ing

subPath#

挂载到一个容器里已有的文件夹,如挂载volume到容器的/etc下,那么/etc下的所有原有文件都会被覆盖;

我们只是想把某少量文件,放到容器内原有的文件夹里,不对原有文件更改,

  1. K8s提供了 volumeMounts.subPath 属性用于挂在单个文件而不是整个目录。
spec:
    containers:
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html/index.php
        name: index
        subPath: indexaaa.php    
    volumes:
    - name: index
      configMap:
        name: php-index
        items:
        - key: index.php
          path: indexaaa.php      # configmap中的目录index.php对应的值给了相对路径 indexaaa.php,所以上面的subpath要用 相对路径indexaaa.php
  1. 用subpath挂载文件夹到容器内已存在文件夹里
spec:
    containers:
    - name: mysql
      image: mysql
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql               # /var/lib/mysql/mysql
    - name: php
      image: php
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html                # 
    volumes:
    - name: site-data
      persistentVolumeClaim: xxx

Volume的类型#

目标对象:kubectl explain pod.spec.volumes

volume有太多类型,会详细介绍一些,官网有每一种Volume的具体使用方式 https://v1-18.docs.kubernetes.io/zh/docs/concepts/storage/volumes/:

EmptyDir#

emptyDir卷对于在同一个pod中运行的容器之间共享文件特别有用。但是它用于将数据临时写入磁盘,当删除pod时卷的数据就会丢失。

使用emptyDir

spec:
  containers:
  - image: luksa/fortune
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  volumes:
  - name: html
    emptyDir: {}

使用emptyDir创建的volume实际是在节点磁盘上创建的,我们可以将这个暂时存在的volume(tmfs)创建在内存上:

  volumes:
  - name: html
    emptyDir: {}
      medium: Memory

HostPath:访问节点主机上的文件#

HostPath卷需要和节点绑定,hostPath中的路径是Pod创建节点的绝对路径;

Pod删除后该路径下的数据不会被删除;

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  nodeSelector: 
    kubernetes.io/hostname: nodename
  containers:
  - image: hub-mirror.c.163.com/library/busybox
    name: busybox
    args:
    - /bin/sh
    - -c
    - sleep 10; touch /tmp/healthy; sleep 30000
    volumeMounts:
    - name: test
      mountPath: /data/test
  volumes:
  - name: test
    hostPath:
      path: /home/rancher/test

NFS

这个和NFS的StorageClass不同,这种会将nfs的整个资源池挂载在pod里,而不是在里面创建一个文件夹给pod使用的这种形式。

spec:
    containers:
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html/index.php
        name: index
        subPath: index.php

ISCSI

建议先使用:kubectl explain pod.spec.volumes.iscsi

spec:
  volumes:
  - name: iscsipd-rw
    iscsi:
      targetPortal: 10.0.2.15:3260
      portals: ['10.0.2.16:3260', '10.0.2.17:3260']			 # 没有多个可以省略
      iqn: iqn.2001-04.com.example:storage.kube.sys1.xyz # iscsi target端的iqn
      lun: 0
      fsType: ext4
      readOnly: true

作者:kphang

出处:https://www.cnblogs.com/kphang/p/15814650.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

备注:你可以在这里自定义其他内容,支持 HTML

posted @   鲸波行者、苇一航  阅读(834)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示