kubernetes 为多个环境定义环境变量的干净方式

时间:2021-03-08 14:37:45

标签: kubernetes kubernetes-helm

我正在使用一个网络应用程序,我们将它部署到多个环境;生产、暂存、多个 QA 环境,甚至必要时的一些开发人员环境。我们正在从弹性 beanstalk 迁移到 kubernetes,并尝试以尽可能干净的方式设置 config/yaml 文件。问题是,我们为每个环境定义了一个 yaml 文件,其中包含一些秘密,并且由于大量复制/粘贴而变得有点难以维护。以下是文件/内容的示例:

免责声明 - 这项工作主要由 DevOps 团队完成,我是一名网络工程师,试图帮助他们,所以我会尽量回答任何问题,但我可能会没有所有正确的答案

文件夹结构:

- k8s // root folder
 - deployment.yaml
 - production
   - production-params.yaml
 - staging
   - staging-1-params.yaml
   - staging-2-params.yaml
   - qa-1-params.yaml
 - developers
   - some-dev-params.yaml

每个 *-params.yaml 文件的内容几乎相同,让我们看几个例子。

production-params.yaml

apiVersion: 'kubernetes-client.io/v1'
kind: ExternalSecret
metadata:
  name: prod-params
spec:
  backendType: systemManager
  data:
    - key:  /xxx/production/ENV_VAR_1
      name: ENV_VAR_1
    - key:  /xxx/production/ENV_VAR_2
      name: ENV_VAR_2
    - key:  /xxx/production/ENV_VAR_3
      name: ENV_VAR_3
    - key:  /xxx/production/ENV_VAR_4
      name: ENV_VAR_4

staging-1-params.yaml

apiVersion: 'kubernetes-client.io/v1'
kind: ExternalSecret
metadata:
  name: prod-params
spec:
  backendType: systemManager
  data:
    - key:  /xxx/staging1/ENV_VAR_1
      name: ENV_VAR_1
    - key:  /xxx/staging1/ENV_VAR_2
      name: ENV_VAR_2
    - key:  /xxx/staging1/ENV_VAR_3
      name: ENV_VAR_3
    - key:  /xxx/staging1/ENV_VAR_4
      name: ENV_VAR_4

和所有其他 params 文件都是这样,只有“key”中的文件路径发生变化,但几乎相同。有什么方法可以让这些变得更动态或更干净?我不是 devops/k8s 专家并且做了一些研究,似乎 Helm 在这里可能会有所帮助,但不确定如何使用它来解决这个问题。我读了一个有点帮助的教程,但我仍然感到困惑。如果有人知道任何资源或在过去解决了这个问题,我将非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

这正是 Helm 擅长的替代品。如果你写了一个 Helm 图表,你可以使用它的模板语法来填充 YAML 的特定部分:

# templates/external-secret.yaml
apiVersion: 'kubernetes-client.io/v1'
kind: ExternalSecret
metadata:
  name: prod-params
spec:
  backendType: systemManager
  data:
    - key:  /xxx/{{ .Values.environment }}/ENV_VAR_1
      name: ENV_VAR_1
    - key:  /xxx/{{ .Values.environment }}/ENV_VAR_2
      name: ENV_VAR_2
{{/* etc. */}}

然后您可以为每个环境提供一个 YAML 设置文件:

# production.yaml
environment: production
# staging-1.yaml
environment: staging-1

在部署应用程序时,您可以提供这些文件之一作为命令行选项,模板引擎可以看到该文件的内容为 .Values

helm install the-app . -f staging-1.yaml

这种方法可以让您将所有“相同”的内容放在 templates 目录中,并将每个环境不同的所有内容放在每个环境的 YAML 值文件中。