小提示: K8S中如何使用Subpath

2022-04-21 14:39:49 浏览数 (1)

概述

Kubernetes中什么是Subpath

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

什么时候应该使用 Subpath

  1. 场景一: 一个共享卷, 挂载多个路径.
  2. 场景二: ConfigMap或Secret挂载到特定目录的特定路径, 而 该目录下已经有其他文件且不希望被覆盖掉

如何使用Subpath

场景一示例: 一个共享卷, 挂载多个路径.

典型的应用场景示例就是Kubernetes官方的示例:

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

代码语言:javascript复制
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

场景二示例: ConfigMap或Secret挂载到特定目录的特定路径

例如, 我希望将setenv.sh这样的一个初始化配置环境变量的脚本挂载到tomcat的bin目录: /opt/tomcat/bin下.

如果我不使用subpath, 直接将该ConfigMap 挂载到/opt/tomcat/bin目录下, 那么该目录下已有的文件全部被覆盖.

所以正确的做法是使用Subpath进行挂载:

代码语言:javascript复制
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
spec:
    containers:
    - name: tomcat
      image: tomcat
      volumeMounts:
      - mountPath: /opt/tomcat/bin/setenv.sh
        name: volume-env
        subPath: setenv.sh
    volumes:
    - name: volume-env
        configMap:
          name: env-config
          defaultMode: 420

最终挂载效果如下图所示:

❗️ 注意事项

特别注意mountPathsubPath的写法, 最后的path要保持一致.

mountPath是: /opt/tomcat/bin/setenv.sh; subPath是: setenv.sh.

mountPath不要漏写为: /opt/tomcat/bin/

代码语言:javascript复制
      - mountPath: /opt/tomcat/bin/setenv.sh
        subPath: setenv.sh

0 人点赞