在 K8S Volume 中使用 subPath

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在 K8S Volume 中使用 subPath

使用 subPath

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

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

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      env:
      - name: MYSQL_ROOT_PASSWORD
        value: "rootpasswd"
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data
YAML

对上面的配置进行说明:

  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 中。

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: container1
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.name
    image: busybox
    command: ["sh", "-c", "while [true]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]
    volumeMounts:
    - name: workdir1
      mountPath: /logs
      subPathExpr: $(POD_NAME)
  restartPolicy: Never
  volumes:
  - name: workdir1
    hostPath:
      path: /var/log/pods
YAML

说明:

  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 步.

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
|
6月前
|
Kubernetes 调度 Docker
kubernetes核心技术之Volume知识点总结
kubernetes核心技术之Volume知识点总结
64 0
|
11月前
|
存储 Kubernetes Unix
k8s教程(Volume篇)-CSI存储机制详解
k8s教程(Volume篇)-CSI存储机制详解
1440 0
k8s教程(Volume篇)-CSI存储机制详解
|
11月前
|
存储 Kubernetes 虚拟化
k8s教程(Volume篇)-总结
k8s教程(Volume篇)-总结
100 0
|
11月前
|
存储 Kubernetes API
k8s教程(Volume篇)-动态存储管理案例(GlusterFS)
k8s教程(Volume篇)-动态存储管理案例(GlusterFS)
252 0
|
11月前
|
存储 Kubernetes 调度
k8s教程(Volume篇)-StorageClass详解
k8s教程(Volume篇)-StorageClass详解
893 0
|
11月前
|
存储 Kubernetes 关系型数据库
k8s教程(Volume篇)-PVC详解
k8s教程(Volume篇)-PVC详解
130 0
|
11月前
|
存储 Kubernetes 块存储
k8s教程(Volume篇)-PV详解
k8s教程(Volume篇)-PV详解
233 0
|
11月前
|
存储 Kubernetes Docker
k8s教程(Volume篇)-持久卷工作原理
k8s教程(Volume篇)-持久卷工作原理
150 0
|
11月前
|
存储 Kubernetes API
k8s教程(Volume篇)-k8s存储机制概述
k8s教程(Volume篇)-k8s存储机制概述
498 0
下一篇
无影云桌面