【问题标题】:Kubernetes: how to avoid duplicating env in multiple deployments?Kubernetes:如何避免在多个部署中重复 env?
【发布时间】:2017-10-10 22:45:28
【问题描述】:

我有 4 个 Kubernetes/Helm 部署(web、emailworker、jobworker、sync),它们都需要共享完全相同的 spec.template.spec.containers[].env 密钥。 env 键非常大,我想避免在每个部署中复制/粘贴它,例如:

# ...
env:
- name: NODE_ENV
  value: "{{ .Values.node_env }}"
- name: BASEURL
  value: "{{ .Values.base_url }}"
- name: REDIS_HOST
  valueFrom:
    secretKeyRef:
      name: secret-redis
      key: host
- name: KUE_PREFIX
  value: "{{ .Values.kue_prefix }}"
- name: DATABASE_NAME
  value: "{{ .Values.database_name }}"
- name: DATABASE_HOST
  valueFrom:
    secretKeyRef:
      name: secret-postgres
      key: host
- name: DATABASE_USER
  valueFrom:
    secretKeyRef:
      name: secret-postgres
      key: username
- name: DATABASE_PASSWORD
  valueFrom:
    secretKeyRef:
      name: secret-postgres
      key: password
- name: AWS_KEY
  valueFrom:
    secretKeyRef:
      name: secret-bucket
      key: key
- name: AWS_SECRET
  valueFrom:
    secretKeyRef:
      name: secret-bucket
      key: secret
- name: AWS_S3_BUCKET
  valueFrom:
    secretKeyRef:
      name: secret-bucket
      key: bucket
- name: AWS_S3_ENDPOINT
  value: "{{ .Values.s3_endpoint }}"
- name: INSTAGRAM_CLIENT_ID
  valueFrom:
    secretKeyRef:
      name: secret-instagram
      key: clientID
# ...

这可以通过 yaml、Helm 或 Kubernetes 实现吗?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    于是我找到了一个使用 Helm 命名模板的解决方案:https://github.com/kubernetes/helm/blob/master/docs/chart_template_guide/named_templates.md

    我创建了一个文件templates/_env.yaml,内容如下:

    {{ define "env" }}
                - name: NODE_ENV
                  value: "{{ .Values.node_env }}"
                - name: BASEURL
                  value: "{{ .Values.base_url }}"
                - name: REDIS_HOST
                  valueFrom:
                    secretKeyRef:
                      name: secret-redis
                      key: host
                - name: KUE_PREFIX
                  value: "{{ .Values.kue_prefix }}"
                - name: DATABASE_NAME
                  value: "{{ .Values.database_name }}"
                - name: DATABASE_HOST
                  valueFrom:
                    secretKeyRef:
                      name: secret-postgres
                      key: host
                - name: DATABASE_USER
                  valueFrom:
                    secretKeyRef:
                      name: secret-postgres
                      key: username
                - name: DATABASE_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: secret-postgres
                      key: password
                - name: AWS_KEY
                  valueFrom:
                    secretKeyRef:
                      name: secret-bucket
                      key: key
                - name: AWS_SECRET
                  valueFrom:
                    secretKeyRef:
                      name: secret-bucket
                      key: secret
                - name: AWS_S3_BUCKET
                  valueFrom:
                    secretKeyRef:
                      name: secret-bucket
                      key: bucket
                - name: AWS_S3_ENDPOINT
                  value: "{{ .Values.s3_endpoint }}"
                - name: INSTAGRAM_CLIENT_ID
                  valueFrom:
                    secretKeyRef:
                      name: secret-instagram
                      key: clientID
    {{ end }}
    

    这是我在templates/deployment.yaml 文件中使用它的方法:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: somedeployment
      # ...
    spec:
      template:
        # ...
        metadata:
          name: somedeployment
        spec:
          # ...
          containers:
            - name: container-name
              image: someimage
              # ...
              env:
                {{- template "env" . }}
    

    【讨论】:

      【解决方案2】:

      看看ConfigMap。这允许将配置收集到一个资源中并用于多个部署。

      无需乱用任何模板。

      【讨论】:

      猜你喜欢
      • 2020-02-17
      • 2012-06-17
      • 2012-02-19
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多