【发布时间】:2017-12-15 11:28:26
【问题描述】:
我想根据从环境变量中收集的值 (ex.redis_host) 生成动态配置文件(redis、数据库),这些值会因服务而异,并将其放在特定位置 (config/redis.yml)。
我将如何实现它?
【问题讨论】:
标签: docker kubernetes kubernetes-helm
我想根据从环境变量中收集的值 (ex.redis_host) 生成动态配置文件(redis、数据库),这些值会因服务而异,并将其放在特定位置 (config/redis.yml)。
我将如何实现它?
【问题讨论】:
标签: docker kubernetes kubernetes-helm
动态配置文件生成可以包括创建
配置文件结构:
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}
配置文件内容:
配置文件的内容可以再次动态填充。
我们可以使用 helm 生成 config-templates 或 config-file-structure 并将它们安装在 pod 内所需的位置(例如 config/redis.yaml )。然后可以使用实用程序将这些配置模板转换/渲染为适当的文件容器运行时间。
根据 environment/environment_variables 动态创建配置文件可以通过以下方式实现。
Bash 方式(使用 eval 和 cat):
创建一个名为inator的文件,内容如下
#!/bin/bash
eval "cat <<EOF
$(<$1)
EOF
" | tee $1 >/dev/null
将 inator 设为可执行文件并将其放在 docker 映像中并作为 ENTRYPOINT 脚本执行
考虑到环境变量在吊舱/容器内是可用的
例如: 分期
$ 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 了解更多信息。
【讨论】:
也许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}
【讨论】: