【问题标题】:How to provision environment specific application configuration with kubernetes如何使用 Kubernetes 提供特定于环境的应用程序配置
【发布时间】:2015-11-03 08:47:32
【问题描述】:

我们正在将我们的 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
  ...

【问题讨论】:

  • 拥有一个 config/application.yml 文件是否可行,并将其放入您的 docker 映像中,并为所有类型的 pod 使用相同的映像,然后通过改变来控制要使用的环境rails 的 -e 参数?比如:.spec.container[].command: ["rails" "server" "-e", "production"]
  • 这基本上就是我们现在正在做的事情。我们通过设置RUN_ENV 环境变量来指定kubernetes 配置中的参数。所以我认为最好的做法是坚持使用 Rails 方式?
  • 我对 Rails 没有任何经验,所以我不能说。
  • 我们正在计划一个名为“ConfigData”的功能,它允许您将文件存储在 apiserver 上并将它们挂载到您的容器中。那是github.com/kubernetes/kubernetes/pull/6477 的问题,认为它很长。我们还讨论了一些更简单的事情,例如:github.com/kubernetes/kubernetes/issues/13610 -- 如果这些问题看起来有用,请随时 +1
  • 感谢 Eric 的建议和主题。看来我们已经在遵循最佳实践(基本上正如您所提到的 - config/application.yml 中的一个文件)。这些线程看起来很有趣,我会仔细阅读它们并考虑是否值得放弃当前的方法

标签: provisioning kubernetes


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 2017-05-20
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2018-01-20
    • 2018-12-14
    相关资源
    最近更新 更多