如何使用 kubernetes 提供特定于环境的应用程序配置

How to provision environment specific application configuration with kubernetes

我们正在将 ruby 微服务迁移到 kubernetes,我们过去常常在 config/application.yml 中保存特定于环境的配置。使用 kubernetes,您可以为每个服务创建特定于环境的文件,例如config/kubernetes/production.yml 等等

虽然 kubernetes pod 配置文件能够保存环境变量,但似乎您不能真正在其中保存结构化数据。

例如,在application.yml中我们有

development: &development
  process:
    notifier:
      type: 'terminal-notifier'
  ...

production: &production
  process:
    notifier:
      type: 'airbrake'
      api_key: 'xxxx'
      host: 'xxx.xxx.com'
  ...

使用 kubernetes 继续这种做法并在 application.yml 中分解环境是否合理,或者 kubernetes 是否有一些其他最佳实践来为 pod 提供结构化配置?

请注意,在迁移所有服务之前,我们基本上必须保持这样的配置:

kubernetes_staging:
  <<: *staging
  ...

您可以通过几种方式做到这一点,一种是在单个文件中继续执行您正在做的事情,另一种是使用标签来指定要使用哪个环境的配置,另一种是使用名称空间。我个人推荐命名空间,这样你可以为每个可能旋转相同 pods 的环境拥有单独的 .yml 文件,但配置不同,所以要做到这一点,你将拥有 staging、prod 等命名空间.命名空间也是让同一个 kubernetes 集群具有暂存和生产概念的好方法。此外,您可以为某些命名空间指定权限。

这是关于命名空间的文档https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/design/namespaces.md