我应该为每个环境变量使用configMap吗?

时间:2018-11-27 09:10:38

标签: kubernetes kubernetes-helm

我现在正在使用头盔。我的项目就是这样:

values.yaml:

environmentVariables:
  KEY1: VALUE1
  KEY2: VALUE2

configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ template "myproject.fullname" . }}
data:
{{- range $k, $v := .Values.environmentVariables }}
  {{ $k }}: {{ $v | quote }}
{{- end }}

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ template "myproject.fullname" . }}
spec:
  template:
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
{{- range $k, $v := .Values.environmentVariables }}
            - name: {{ $k }}
              valueFrom:
                configMapKeyRef:
                  name: {{ template "myproject.fullname" $ }}
                  key: {{ $k }}
{{- end }}
...

但是现在,我真的很困惑。我真的需要这个configmap吗?对环境变量使用configmap有什么好处?

3 个答案:

答案 0 :(得分:2)

即使您不使用configmap,它也可以工作,但是它具有一些优点:

  • 您可以在运行时更新值,而无需更新部署。这意味着您可能不需要重新启动应用程序(pod)。如果您不使用配置映射,则每次更新该值时,都会重新创建您的应用程序(或pod)。
  • 关注点分离,即部署配置和外部值分开

答案 1 :(得分:2)

除了关于将配置与Pod分开的要点外,ConfigMap的一个优点是它使您可以使变量的值可供未必属于图表的其他Pod或应用访问。

它确实增加了一些额外的复杂性,并且在何时使用ConfigMap方面可能会有很大的偏好。由于您的ConfigMap键是环境变量you could simplify your Deployment a little by using 'envFrom'

的名称

答案 2 :(得分:1)

我觉得这很大程度上取决于品味;但对于这种情况,我通常会避免使用ConfigMap。

env:
{{- range $k, $v := .Values.environmentVariables }}
  - name: {{ quote $k }}
    value: {{ quote $v }}
{{- end }}

通常,您需要一个单一的事实来源,而Helm可能是:您不希望有人在Helm之外编辑了ConfigMap,而重新部署会破坏本地更改。因此,与部署规范相比,ConfigMap的“可编辑性”并没有太多价值。

原则上(如@Hazim所述),您可以在不重新启动容器的情况下更新ConfigMap内容,但是本质上不能在正在运行的容器中更新环境变量,并且重新启动容器是如此常规,以至于一次执行就没什么大不了