我应该为每个环境变量使用 configMap 吗?
Should I use configMap for every environment variable?
我现在正在使用 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 也可以,但它有一些优点:
- 您可以在运行时更新这些值,而无需更新部署。这意味着您可能不需要重新启动您的应用程序 (pods)。如果您不使用配置映射,则每次更新值时,您的应用程序(或 Pod)都将被重新创建。
- 关注点分离,即部署配置和外部值分离
我觉得这主要是个人品味问题;但我通常一直避免在此类情况下使用 ConfigMap。
env:
{{- range $k, $v := .Values.environmentVariables }}
- name: {{ quote $k }}
value: {{ quote $v }}
{{- end }}
您通常需要一个单一的真实来源,而 Helm 可以是这样的:您不希望出现这样的情况:有人在 Helm 之外编辑了 ConfigMap,并且重新部署破坏了本地更改。因此,与部署规范相比,ConfigMap "more editable" 的价值并不大。
原则上(如@Hazim 所述)您可以在不重新启动容器的情况下更新 ConfigMap 内容,但本质上无法更新 运行 容器中的环境变量,并且重新启动容器是如此例行公事,以至于这样做一次应该不重要。
除了关于将配置与 pods 分开的要点之外,ConfigMap 的一个优点是它允许您使变量的值可供其他 Pods 或不一定属于一部分的应用程序访问你的图表。
虽然它确实增加了一些额外的复杂性,但对于何时使用 ConfigMap 可能会有很大的偏好因素。由于您的 ConfigMap 键是环境变量的名称 you could simplify your Deployment a little by using 'envFrom'
我现在正在使用 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 也可以,但它有一些优点:
- 您可以在运行时更新这些值,而无需更新部署。这意味着您可能不需要重新启动您的应用程序 (pods)。如果您不使用配置映射,则每次更新值时,您的应用程序(或 Pod)都将被重新创建。
- 关注点分离,即部署配置和外部值分离
我觉得这主要是个人品味问题;但我通常一直避免在此类情况下使用 ConfigMap。
env:
{{- range $k, $v := .Values.environmentVariables }}
- name: {{ quote $k }}
value: {{ quote $v }}
{{- end }}
您通常需要一个单一的真实来源,而 Helm 可以是这样的:您不希望出现这样的情况:有人在 Helm 之外编辑了 ConfigMap,并且重新部署破坏了本地更改。因此,与部署规范相比,ConfigMap "more editable" 的价值并不大。
原则上(如@Hazim 所述)您可以在不重新启动容器的情况下更新 ConfigMap 内容,但本质上无法更新 运行 容器中的环境变量,并且重新启动容器是如此例行公事,以至于这样做一次应该不重要。
除了关于将配置与 pods 分开的要点之外,ConfigMap 的一个优点是它允许您使变量的值可供其他 Pods 或不一定属于一部分的应用程序访问你的图表。
虽然它确实增加了一些额外的复杂性,但对于何时使用 ConfigMap 可能会有很大的偏好因素。由于您的 ConfigMap 键是环境变量的名称 you could simplify your Deployment a little by using 'envFrom'