我有两个独立的 Kubernetes 集群,它们将分别用于暂存环境和生产环境。我想为将要提交到每个集群的 Kubernetes API 对象提供 YAML 清单,但其中一些对象在两个环境之间的配置会略有不同。
作为一个虚构但说明性的示例,想象在每个集群上运行一个内部 Docker 注册表,一个使用 S3 作为存储后端,一个使用 GCS 后端。注册表容器可以接受这些配置值作为环境变量或从文件中读取,这两者都是 Kubernetes 清单支持的,但是我应该如何为每个环境填充这些值呢?
本质上,我想要的是一种使清单看起来像这样的方法,其中$()
语法是在提交清单时将在服务器上发生的变量插值:
---
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: foo
env:
- name: bar
value: $(etcdctl get /path/to/bar)
我可以编写使用占位符作为值的模板,然后处理模板,从某个外部源中提取实际值,以生成实际提交给集群的最终清单。但是,我想我会先问一下,以防已经存在执行此操作的工具,或者有一些我不知道的受 Kubernetes 支持的方式来执行此操作。为了使用 Kubernetes,这似乎是许多人需要做的事情。
我的其他想法包括在主机节点上使用 etcd、confd 和脚本的某种组合,但这开始进入主机配置管理领域,我想不惜一切代价避免。我正在使用 CoreOS,主机完全通过 coreos-cloudinit 进行配置。换句话说,没有在创建节点时未定义的主机系统上进行任何操作,因此像 Ansible 这样的传统配置管理工具已经不复存在。
我知道 Kubernetes 的秘密系统,但其中一些变量值可能非常大,而且大多数都不是秘密。