Kubernetes - 每个环境的不同设置

时间:2017-04-12 20:13:52

标签: kubernetes

我们有一个在GKE Kubernetes上运行的应用程序,它希望auth url(用户将通过他的浏览器重定向)作为环境变量传递。

我们在每个环境中使用不同的命名空间

所以我们当前的pod配置看起来像这样:

  env:
    - name: ENV
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: AUTH_URL
      value: https://auth.$(ENV).example.org 

所有工作都令人惊讶,我们可以拥有任意数量的动态环境,我们只需要应用-f config.yaml,它可以完美地工作而无需更改单个配置文件且没有任何第三方脚本。

现在生产我们想要使用不同的域,因此一般模式https://auth.$(ENV).example.org不再起作用。

我们有哪些选择?

  1. 由于配置在git repo中,因此为prod环境
  2. 创建一个单独的分支
  3. 有一个默认的ConfigMap和一个特定的prod环境,并通过一些脚本运行它(如果存在prod-config.yaml然后使用它,否则使用config.yaml) - 但是这种方法我们不能使用kubectl直接了
  4. 将此配置移至应用程序级别,并为prod env设置单独的配置文件 - 但这种情况与12factor应用程序有关吗?
  5. 其他...?

2 个答案:

答案 0 :(得分:6)

这似乎是使用helm的理想机会!

这很容易上手,只需将分蘖安装到群集中即可。

Helm让您能够创建"图表" (可以像软件包一样),可以安装到您的集群中。你可以很容易地模拟这些。作为一个例子,你可能有config.yaml看起来像这样:

env:
  - name: AUTH_URL
    value: {{ .Values.auth.url }} 

然后,在掌舵图表中,您有values.yaml,其中包含网址的默认值,例如:

auth:
  url: https://auth.namespace.example.org

您可以使用带有helm的--values选项指定每个环境values.yaml文件,甚至可以使用helm上的--set标志在使用helm install时覆盖它们。< / p>

查看文档here,了解有关值和模板如何在helm中工作的信息。它似乎非常适合您的用例

答案 1 :(得分:2)

jaxxstorms的回答很有帮助,我只想添加对你提议的选项意味着什么:

  
      
  1. 由于配置在git repo中,因此为prod环境创建一个单独的分支。
  2.   

我不建议在GIT中使用单独的分支,因为分支的目的是允许同时编辑相同的数据,但你拥有的是不同的数据(群集的不同配置)。

  
      
  1. 有一个默认的ConfigMap和一个特定的prod环境,并通过一些脚本运行它(如果存在prod-config.yaml然后使用它,   否则使用config.yaml) - 但是使用这种方法我们不能使用kubectl   直接了
  2.   

使用Helm可以更优雅地解决这个问题。您可以使用helm为不同的环境生成不同的文件,而不是脚本。你可以使用kubectl(使用最终文件,我也会检查GIT btw。)。

  
      
  1. 将此配置移至应用程序级别,并为prod env提供单独的配置文件 - 但这种情况与12factor应用程序有关吗?
  2.   

这是一个意见问题但我总体上建议按应用程序和技术拆分部署。例如,当我部署一个运行3个不同应用程序AB和C的集群,并且每个应用程序需要Nginx,CockroachDB和Go应用程序服务器时,我将拥有9个配置文件,这使我可以单独部署或更新每个技术。应用程序上下文。这对于允许在诸如Jenkins之类的CI服务器中进行单独的部署操作并且遵循一般的关注点分离非常重要。

  
      
  1. 其他...?
  2.   

请参阅jaxxstorms关于Helm的回答。