美文网首页JCloud
K8S中ConfigMap以file的方式挂载

K8S中ConfigMap以file的方式挂载

作者: 魔哈Moha | 来源:发表于2017-08-29 20:58 被阅读729次

需求
很多时候在制作Docker镜像时,对于有些程序存在个性化配置时,Dockerfile提供的的ADD方式就显得不太灵活。

比如某些特定的场景下,不同业务的PHP模块配置有差异时,就需要在容器启动时将外部配置文件注入到容器里面的指定路径。这个工作其实可以用Kubernetes的ConfigMap对象完成。

操作

ConfigMap在默认挂载到容器是以Volumes的形式,比如这样:

containers:
- image: alpine:latest
  name: my-project
  volumeMounts:
  - mountPath: /app_conf/app1.config
    name: my-project
volumes:
- name: my-project
  configMap:
    items:
      - key: config-app1
        path: app1.config

这个时候实际上Pod里面会在容器里面创建一个 名为/app_conf/app1.config目录,实际的app1.config这个配置文件会在这个目录下面。这个时候配置文件并没有生效。

如果将mountPath路径改为/app_conf,这个时候容器挂载volumes的时候会挂载到/app_conf/目录,而这个目录下原本的文件。

如何将ConfigMap以文件的形式挂载到容器呢?

这个问题,在GitHub上已经提出了解决方法
configmap file mount path results in command not found error #44815

按照方法,只需要添加一个subPath字段即可,如下:

containers:
- image: alpine:latest
  name: my-project
  volumeMounts:
  - mountPath: /app_conf/app1.config
    subPath: app1.config
    name: my-project
volumes:
- name: my-project
  configMap:
    items:
      - key: config-app1
        path: app1.config

根据官网对SubPath的描述

Using SubPath

Sometimes, it is useful to share one volume for multiple uses in a single pod. The volumeMounts.subPath property can be used to specify a sub-path inside the referenced volume instead of its root.
Here is an example of a pod with a LAMP stack (Linux Apache Mysql PHP)
using a single, shared volume. The HTML contents are mapped to its html folder, and the databases will be stored in its mysql folder:

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data

subPath是用来对于一个Volume分别给多个容器使用时,会根据subPath给出的key创建目录。在这个例子中site-data这个Volume在分别个mysql和php容器使用时,html的内容映射在site-data卷的html子目录,而数据库则保存在site-data卷的mysql目录。

官网中并没有给出能以file的形式挂载volume,给人比较奇怪。

相关文章

网友评论

    本文标题:K8S中ConfigMap以file的方式挂载

    本文链接:https://www.haomeiwen.com/subject/cxuadxtx.html