目录
背景
各种成熟软件的官方container image中,大多包含了默认的配置文件,在真正的生产部署中,一定需要灵活的方法管理这些配置文件,以满足下列需求:
- 能修改默认配置文件
- 对配置文件进行版本管理
- 修改配置文件能自动触发 rolling update
helm 作为 container 的编排工具,可以满足以上的需求,虽然有些有些并不那么直接。我们以 helm 官方的 cassandra chart (incubator repo)为基础,看看如何实现以上三个需求。
修改配置文件
配置文件可简单看做一堆配置项(Key: value) 的集合,在安装 chart 时作为参数传入并设置到 deployment 中。这是典型的给 helm chart 传参的过程,因此自然想到可以使用 chart values file – values.yaml
来存储你自定义的配置文件,通过下面的传递途径把值传入到container 中:
cassandra chart 使用的 cassandra image 默认包含了下面一系列必备配置文件。其中,像 cassandra.yaml
这样的核心配置文件是我们在部署过程中常需要修改的,而且,修改后需要重启 cassandra instance 才能生效。
> kubectl exec po/cassandra-01-1 -- ls /etc/cassandra/
cassandra-env.ps1 hotspot_compiler
cassandra-env.sh jvm.options
cassandra-jaas.config logback-tools.xml
cassandra-rackdc.properties logback.xml
cassandra-topology.properties metrics-reporter-config-sample.yaml
cassandra.yaml README.txt
commitlog_archiving.properties triggers
cqlshrc.sample
默认实现
官方 cassandra chart 中也确实提供了这种实现方式,你可以通过修改 values.yaml
中的这个参数,来覆盖container中的默认配置文件。
parameter | Description | Default |
---|---|---|
configOverrides |
Overrides config files in /etc/cassandra dir | {} |
如果你想覆盖哪个 config file,你必须在 configOverrides
这个参数下面,以该 config file 的名字为 key 粘贴上整个 config file 的内容,例如,以 cassandra.yaml
为例,你需要在 values.yaml
中添加如下内容:
# values.yaml
...
## Cassandra config files overrides
configOverrides:
cassandra.yaml: |
# Cassandra storage config YAML
# NOTE:
# See http://wiki.apache.org/cassandra/StorageConfiguration for
# full explanations of configuration directives
# /NOTE
# The name of the cluster. This is mainly used to prevent machines in
# one logical cluster from joining another.
cluster_name: cassandra
...
(整个config file的内容比如全部出现在这里)
...
只是这种修改的方法比较笨拙,由于 default helm chart 默认覆盖了整个 /etc/cassandra
path,因此,你必须把所有 cassandra 启动必须的 config file 的所有内容都填入 values.yaml/configOverride
下,否则的话,该文件将不会出现在 container 中。首先,对于绝大多数我们不需要修改的配置文件,把默认内容贴在这完全是无意义的工作。其次,这会产生一个非常庞大的 values.yaml
file,非常不便于维护。
更优雅的实现
针对上面的实现,我希望对现有 chart 做两点改进
- 只传入自定义的文件。无需修改的,自动使用 container 自带的默认配置文件。
- 自定义的配置文件存放在一个单独目录下,而不是堆放在
values.yaml
中。
实现方法,把你自定义的配置文件存放在 chart 根目录的 ./configs
文件夹下。在 values.yaml/configOverride
下以数组形式列出所有你希望覆盖的配置文件。整个数据传递过程变为:
你可以从这里浏览本文使用的 sample_chart。
values.yaml