【问题标题】:Kubernetes generating dynamic config filesKubernetes 生成动态配置文件
【发布时间】:2017-12-15 11:28:26
【问题描述】:

我想根据从环境变量中收集的值 (ex.redis_host) 生成动态配置文件(redis、数据库),这些值会因服务而异,并将其放在特定位置 (config/redis.yml)。

我将如何实现它?

【问题讨论】:

    标签: docker kubernetes kubernetes-helm


    【解决方案1】:

    动态配置文件生成可以包括创建

    1. 配置文件结构

      redis.yaml 等配置文件可能因开发、暂存、生产环境而异。 例如:

      分期

      ${ENVIRONMENT}:
          host: ${REDIS_HOST}
          namespace: ${REDIS_NAMESPACE}
          port: 6379
      

      生产:

      ${ENVIRONMENT}:
          host: ${REDIS_HOST}
          namespace: ${REDIS_NAMESPACE}
          port: 6379
          connect_timeout: ${REDIS_CONNECT_TIMEOUT}
          timeout: {REDIS_TIMEOUT}
      
    2. 配置文件内容

      配置文件的内容可以再次动态填充。

    我们可以使用 helm 生成 config-templatesconfig-file-structure 并将它们安装在 pod 内所需的位置(例如 config/redis.yaml )。然后可以使用实用程序将这些配置模板转换/渲染为适当的文件容器运行时间。

    根据 environment/environment_variables 动态创建配置文件可以通过以下方式实现。

    Bash 方式(使用 evalcat):

    1. 创建一个名为inator的文件,内容如下

      #!/bin/bash
      eval "cat <<EOF 
      $(<$1)
      EOF
      " | tee $1 >/dev/null
      
    2. 将 inator 设为可执行文件并将其放在 docker 映像中并作为 ENTRYPOINT 脚本执行

    3. 考虑到环境变量在吊舱/容器内是可用的

      例如: 分期

      $ env
      ENVIRONMENT=staging
      REDIS_HOST=abc.com
      REDIS_NAMESPACE=inator
      
      $ cat config/redis.yaml
      ${ENVIRONMENT}:
         host: ${REDIS_HOST}
         namespace: ${REDIS_NAMESPACE}
         port: 6379
      
      $ ./inator config/redis.yaml
      $ cat config/redis.yaml
      staging:
        host: abc.com
        namespace: inator
        port: 6379
      

      生产

      $ env
      ENVIRONMENT=production
      REDIS_HOST=redis.prod.com
      REDIS_NAMESPACE=prod
      REDIS_CONNECT_TIMEOUT=5
      TIMEOUT=10
      
      $ cat config/redis.yaml
      ${ENVIRONMENT}:
         host: ${REDIS_HOST}
         namespace: ${REDIS_NAMESPACE}
         port: 6379
         connect_timeout: ${REDIS_CONNECT_TIMEOUT}           
         timeout: {REDIS_TIMEOUT}
      
      $ ./inator config/redis.yaml
      $ cat config/redis.yaml
      production:
        host: redis.prod.com
        namespace: prod
        port: 6379
        connect_timeout: 5
        timeout: 10
      

    优点: 不需要额外的包。

    码头化方式

    dockerize 是一个用于简化在 docker 容器中运行的应用程序的实用程序。它在内部使用 go 模板从环境变量中填充配置文件。

    查看这篇博文Environment Variable Templates 了解更多信息。

    【讨论】:

      【解决方案2】:

      也许helm 可以在这里为您提供帮助。 Helm 允许您模板化您的 k8s yaml 文件并将它们捆绑到一个可部署的 k8s 包中。 您的配置文件可能放在 ConfigMaps 中,也可以使用 helm 进行模板化。具体是如何做到的,可以看chart template guide

      在部署时填充这些模板的一种方法是:

      helm upgrade --install my-service /path/to/my/chart/package --set my.value=${MY_VALUE_ENV_VAR}
      

      【讨论】:

      • 谢谢!。除了在运行时指定值,是否可以从 Vault 中获取值,以便自动预填充。
      • @DanielSagayaraj 你的意思是你的 pod 在启动时直接从保险库中提取秘密?在这种情况下,您可以将 consul-template 与专为容器设计的 exec-mode 合并。您可以将 consul-template 文件放在配置映射中,将其挂载到容器中,并在容器启动时让 consul-template 使用 vault 发挥作用。
      猜你喜欢
      • 2019-10-02
      • 2019-07-06
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2021-02-11
      • 1970-01-01
      相关资源
      最近更新 更多