使用 subPath

有时,在单个 Pod 中共享卷以供多方使用是很有用的。 volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。

下面是一个使用同一共享卷的、内含 LAMP 栈(Linux Apache Mysql PHP)的 Pod 的示例。 HTML 内容被映射到卷的 html 文件夹,数据库将被存储在卷的 mysql 文件夹中:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: my-lamp-site
  5. spec:
  6. containers:
  7. - name: mysql
  8. image: mysql
  9. env:
  10. - name: MYSQL_ROOT_PASSWORD
  11. value: "rootpasswd"
  12. volumeMounts:
  13. - mountPath: /var/lib/mysql
  14. name: site-data
  15. subPath: mysql
  16. - name: php
  17. image: php:7.0-apache
  18. volumeMounts:
  19. - mountPath: /var/www/html
  20. name: site-data
  21. subPath: html
  22. volumes:
  23. - name: site-data
  24. persistentVolumeClaim:
  25. claimName: my-lamp-site-data

对上面的配置进行说明:

  1. volumeMounts 下面的name, 就是分配给这个pod的volume的名字site-data, mysql和php的html分别使用了它的子路径: mysqlhtml
  2. volumes 对于site-data这个volume, 是通过PVC的形式提供的, PVC的name为: my-lamp-site-data

使用带有扩展环境变量的 subPath

FEATURE STATE: Kubernetes v1.15 feature-state-beta.txt

使用 subPathExpr 字段从 Downward API 环境变量构造 subPath 目录名。 在使用此特性之前,必须启用 VolumeSubpathEnvExpansion 功能开关。 subPathsubPathExpr 属性是互斥的。

在这个示例中,Pod 基于 Downward API 中的 Pod 名称,使用 subPathExpr 在 hostPath 卷 /var/log/pods 中创建目录 pod1。 主机目录 /var/log/pods/pod1 挂载到了容器的 /logs 中。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod1
  5. spec:
  6. containers:
  7. - name: container1
  8. env:
  9. - name: POD_NAME
  10. valueFrom:
  11. fieldRef:
  12. apiVersion: v1
  13. fieldPath: metadata.name
  14. image: busybox
  15. command: [ "sh", "-c", "while [ true ]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]
  16. volumeMounts:
  17. - name: workdir1
  18. mountPath: /logs
  19. subPathExpr: $(POD_NAME)
  20. restartPolicy: Never
  21. volumes:
  22. - name: workdir1
  23. hostPath:
  24. path: /var/log/pods

说明:

  1. env中, 配置了POD_NAME这个环境变量, 这个变量的值来自于metadata.name, 即pod1
  2. subPathExpr: $(POD_NAME) 子路径为$(POD_NAME)这个变量, 就是pod1
  3. volume用的是hostPath, 实际路径为:/var/log/pods. 那么完整的path就是/var/log/pods/pod1

总结

subPath 还是挺实用的, 是个小功能, 但是确实能提交效率. 比如我昨天搭建的禅道的容器. 就是典型的LAMP: Linux + Apache + Mysql + PHP.

这些组件中,

  • Apachewww/html需要挂载
  • mysql的数据库需要挂载
  • php的应用数据需要挂载

如果没用subPath, 那么我得这么操作: (以nfs为例)

  1. nfs下手动创建3个子目录: html  mysql php
  2. 创建3个PV, 分别为: apache-volume mysql-volume php-volume
  3. 写3个PVC, 分别是: apache-claim mysql-claim php-claim. 而且2和3这两步最好一个pv+一个PVC来建. 避免bound乱了.
  4. 再修改Deployment 配置, 一个个挂载上去.

△ 算下来,10步.

用了subPath, 确实节省了工作量: (还是以nfs为例)

  1. 创建1个PV, 为: LAMP-volume
  2. 创建1个PVC, 为: LAMP-claim
  3. 再修改Deployment 配置, 挂载一个PVC, 用subPath区分.

△ 算下来, 3步.

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

在 K8S Volume 中使用 subPath的更多相关文章

  1. k8s volume

        只有nfs和rbd的,本人翻译确实很渣         在容器中磁盘文件寿命是短暂的,当在容器中运行一些重要程序时,这会产生一些问题. 首先,当一个容器崩溃后,kubelet将重新启动该容器, ...

  2. k8s volume存储卷(四)

    介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...

  3. k8s volume存储卷

    k8s volume存储卷   介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价, ...

  4. 总结traefik 在k8s 环境中的配置文件

    总结traefik 在k8s 环境中的配置文件 traefik.toml配置文件引用 [www@localhost traefik-ingress]$ more * :::::::::::::: co ...

  5. kubectl cp 从k8s pod 中 拷贝 文件到本地

    请查看官方的说明 kubectl cp --help 官方说使用cp , pod里需要有tar命令 从k8s pod 中 拷贝 文件到本地 这是我使用的命令 kubectl exec redis-6c ...

  6. 使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控

    1. 概述 老话说的好:任何成功都不是轻易得来的,是不断地坚持与面对的结果. 言归正传,之前我们聊了 SpringCloud 开发的微服务是如何部署在  Kubernetes(K8s)集群中的,今天我 ...

  7. k8s/02中文文档学习笔记

    k8s中文文档 一.k8s概述 Kubernetes:是一个开源的,用于管理云平台中多个主机上的容器化的应用 k8s设计目标:让部署容器化的应用简单并且高效 大规模容器集群管理工具,从Borg到Kub ...

  8. 阿里云手动搭建k8s搭建中遇到的问题解决(持续更新)

    ETCD搭建 systemd启动etcd服务的时候出现错误:Failed at step CHDIR spawning /usr/bin/etcd: No such file or directory ...

  9. k8s docker 中部署think php 并搭建php websocket

    不得不说php 对云原生有点不够友好,之前用java .net打包docker镜像 一下就ok了,php倒腾了好久才算部署成功. 场景:使用阿里云ack(k8s) 部署采用thinkPHP框架的php ...

  10. k8s volume 基本类型分类

    volume 类型 静态volume emptyDir 临时空目录, 用途,pod内多用户同享一个目录.与POD的生命周期一至,POD创建时创建,删除时删除. Hostpath 宿主机1:1映射,用途 ...

随机推荐

  1. vue项目Eslint和prettier结合使用

    一.eslint介绍--代码语法检查工具 Eslint是一个代码检查工具,用来检查你的代码语法是否符合指定的规范,ECMAScript标准 二.prettier插件--代码格式化工具 prettier ...

  2. Hudi 数据湖的插入,更新,查询,分析操作示例

    Hudi 数据湖的插入,更新,查询,分析操作示例 作者:Grey 原文地址: 博客园:Hudi 数据湖的插入,更新,查询,分析操作示例 CSDN:Hudi 数据湖的插入,更新,查询,分析操作示例 前置 ...

  3. 1、使用简单工厂模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程

    1.使用简单工厂模式设计能够实现包含加法(+).减法(-).乘法(*).除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果.要求使用相关的工具绘制UML类图并严格按照类图的设计编写程 ...

  4. go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪

    0.转载 go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪 0.1源码地址 https://github.com/liuyuede123/go-zero-co ...

  5. 大文件分片上传,后端拼接保存(前端:antd;后端:.Net 5 WebAPI)

    前言 对于普通业务场景而言,直接用 FormData() 将文件以入参的一个参数传给后端即可,但此方法有一个弊端就是,有个 30M 的上限. 对于动辄几百 M.几个 G 的文件上传需求,FormDat ...

  6. C++算法之旅、02 从木棒切割问题领悟二分法精髓

    172.木棒切割问题 https://sunnywhy.com/problem/172 题目描述 给出n根木棒的长度,现在希望通过切割它们来得到至少k段长度相等的木棒(长度必须是整数),问这些长度相等 ...

  7. Windows7下驱动开发与调试体系构建——3.调试体系概述

    目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html 调试体系概述 0.什么是自建调试体系? 就是复写windows的调试api,使得调试 ...

  8. selenium 添加特殊配置(如不完整 希望各位大神评论告诉我)

    options 常用配置 #添加特殊配置 options=webdriver.ChromeOptions() #设置默认编码为utf-8,也就是中文 options.add_argument('lan ...

  9. 还在用双层for循环吗?太慢了

    前情提要 我们在开发中经常碰到这样的场景,查出两个 list 集合数据,需要根据他们相同的某个属性为连接点,进行聚合.但是平时我们使用的时候关注过性能吗?下面让我们一起来看看它的表现如何. 来个例子 ...

  10. perl静态变量

    state操作符功能类似于C里面的static修饰符,state关键字将局部变量变得持久. state也是词法变量,所以只在定义该变量的词法作用域中有效,举个例子: #!/usr/bin/perl u ...