Kubernetes生成dynamicconfiguration文件
我想根据从envvariables收集的值( ex.redis_host
)生成dynamicconfiguration文件(redis,数据库),这些variables在服务和服务之间会有所不同,并将其放在特定的位置( config/redis.yml
)。
我将如何能够实现它?
dynamicconfiguration文件生成可以包括创build
-
configuration文件结构 :
例如redis.yaml的configuration文件可能会用于开发,登台和生产环境。 例如:
分期
${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}
-
configuration文件内容 :
configuration文件的内容可以再次被dynamic填充。
我们可以使用helm生成config-templates
或者config-file-structure
,并将它们挂载在pod内部的必要位置(比如config / redis.yaml)。然后这些configuration模板可以使用容器上的实用程序转换/渲染成适当的文件运行。
使用以下方法可以实现基于environment / environment_variables的configuration文件的dynamic创build。
Bash方式 (使用eval
和cat
):
-
使用以下内容创build一个名为
inator
的文件#!/bin/bash eval "cat <<EOF $(<$1) EOF " | tee $1 >/dev/null
-
使inator成为可执行文件,并将其放置在Docker镜像中,并将其作为ENTRYPOINT脚本执行
-
考虑到env varibles在avod / container中是可用的
例如:分期
$ 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的方式 :
dockerize是一个实用工具,可以简化在Docker容器中运行的应用程序。 它在内部使用go模板来填充环境variables中的configuration文件。
看看这个博客文章环境variables模板了解更多信息。
也许掌舵人可以帮助你在这里。 Helm允许你模拟你的k8s yaml文件并将它们绑定到一个可部署的k8s包中。 您的configuration文件可能被放置在ConfigMaps中,也可以用helm进行模板化。 在图表模板指南中可以看到详细的操作过程。
在部署时填充这些模板的一种方法是:
helm upgrade --install my-service /path/to/my/chart/package --set my.value=${MY_VALUE_ENV_VAR}