微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

k8s subPath 的作用

在Linux中,将目录A挂载到目录B,则目录B原有的文件都会被目录A下的文件覆盖。

那么在k8s中,如何将configmap挂载到容器中某个目录的文件中呢?答案是使用subPath。

subPath的使用方法一共有两种:
1. 同一个pod中多容器挂载同一个卷时提供隔离
2. 将configMap和secret作为文件挂载到容器中而不覆盖挂载目录下的文件

 

使用 subPath 

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

下面例子展示了如何配置某包含 LAMP 堆栈(Linux Apache MysqL PHP)的 Pod 使用同一共享卷。 此示例中的 subPath 配置不建议在生产环境中使用。 PHP 应用的代码和相关数据映射到卷的 html 文件夹,MysqL 数据库存储在卷的 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

 

那么如果 subPath 不是文件夹,而是一个文件,又该如何解决呢?同样的道理,只需要通过 subPath 指定出该文件即可,注意 subPath 要使用相对目录。具体如下所示:

containers:
- volumeMounts:
  - name: demo-config
    mountPath: /etc/ssl.key
    subPath: ssl.key  # 如果没有subPath,则/etc/ssl.key将被当成一个目录,根据Linux挂载的概念,该目录下的所有文件会被覆盖
volumes:
- name: demo-ssl
  configMap:
    name: ssl-secret

configmap内容

apiVersion: v1
kind: ConfigMap
Metadata:
  name: demo-ssl
data:
  ssl.key: |
    username:admin
    password:123456

 



参考:

k8s官网 卷 - 使用 subPath

Kubernetes subPath | 容器原目录下的文件全被覆盖了,什么鬼?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐