描述
块引用
我正在尝试使用 Kubernetes 和 Helm 部署应用程序。我的目标是将环境变量从 Kubernetes Secret 链接到我的部署。但是,我在尝试正确设置环境变量时遇到了问题。
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.dockerRegistry }}{{ .Values.image.repository }}{{ .Values.image.imageName }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: "SECURITY_SSL_CA"
value: {{ .Values.env.SECURITY_SSL_CA | quote }}
- name: "CA_TXT_FILE"
value: {{ .Values.env.CA_TXT_FILE | quote }}
- name: "CA_FILE"
value: {{ .Values.env.CA_FILE | quote }}
- name: "SECURITY_SSL_KEY"
value: {{ .Values.env.SECURITY_SSL_KEY | quote }}
- name: "KEY_TXT_FILE"
value: {{ .Values.env.KEY_TXT_FILE | quote }}
- name: "KEY_FILE"
value: {{ .Values.env.KEY_FILE | quote }}
- name: "SN_USER"
value: {{ .Values.env.SN_USER | quote }}
- name: "SN_PASSWORD"
value: {{ .Values.env.SN_PASSWORD | quote }}
- name: "SECURITY_SSL_CERTIFICATE"
value: {{ .Values.env.SECURITY_SSL_CERTIFICATE | quote }}
- name: "CRT_TXT_FILE"
value: {{ .Values.env.CRT_TXT_FILE | quote }}
- name: "CRT_FILE"
value: {{ .Values.env.CRT_FILE | quote }}
以下是我用来链接秘密的方法
---
secretName: certificate-secrets
env:
SECURITY_SSL_CA: 'YmFzZTY0ZW5jb2RlZHZhbHVlMQ=='
CA_TXT_FILE: 'YmFzZTY0ZW5jb2RlZHZhbHVlMg=='
CA_FILE: 'YmFzZTY0ZW5jb2RlZHZhbHVlMw=='
SECURITY_SSL_KEY: 'YmFzZTY0ZW5jb2RlZHZhbHVlNA=='
KEY_TXT_FILE: 'YmFzZTY0ZW5jb2RlZHZhbHVlNQ=='
KEY_FILE: 'YmFzZTY0ZW5jb2RlZHZhbHVlNg=='
SN_USER: 'YmFzZTY0ZW5jb2RlZHZhbHVlNw=='
SN_PASSWORD: 'YmFzZTY0ZW5jb2RlZHZhbHVlOA=='
SECURITY_SSL_CERTIFICATE: 'YmFzZTY0ZW5jb2RlZHZhbHVlOQ=='
CRT_TXT_FILE: 'YmFzZTY0ZW5jb2RlZHZhbHVlMTA=='
CRT_FILE: 'YmFzZTY0ZW5jb2RlZHZhbHVlMTE=='
---
Secret Definition
Below is the method I have used for linking the secret:
apiVersion: v1
kind: Secret
metadata:
name: {{ .Values.secretName }}
labels:
{{- include "snp.labels" . | nindent 4 }}
data:
SECURITY_SSL_CA: {{ .Values.env.SECURITY_SSL_CA | quote }}
CA_TXT_FILE: {{ .Values.env.CA_TXT_FILE | quote }}
CA_FILE: {{ .Values.env.CA_FILE | quote }}
SECURITY_SSL_KEY: {{ .Values.env.SECURITY_SSL_KEY | quote }}
KEY_TXT_FILE: {{ .Values.env.KEY_TXT_FILE | quote }}
KEY_FILE: {{ .Values.env.KEY_FILE | quote }}
SN_USER: {{ .Values.env.SN_USER | quote }}
SN_PASSWORD: {{ .Values.env.SN_PASSWORD | quote }}
SECURITY_SSL_CERTIFICATE: {{ .Values.env.SECURITY_SSL_CERTIFICATE | quote }}
CRT_TXT_FILE: {{ .Values.env.CRT_TXT_FILE | quote }}
CRT_FILE: {{ .Values.env.CRT_FILE | quote }}
this is the deployment file
---
My Helm Template
Here’s the Helm template I’m using for the container spec in my deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
env:
- name: SECURITY_SSL_CA
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: SECURITY_SSL_CA
- name: CA_TXT_FILE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: CA_TXT_FILE
- name: CA_FILE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: CA_FILE
- name: SECURITY_SSL_KEY
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: SECURITY_SSL_KEY
- name: KEY_TXT_FILE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: KEY_TXT_FILE
- name: KEY_FILE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: KEY_FILE
- name: SN_USER
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: SN_USER
- name: SN_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: SN_PASSWORD
- name: SECURITY_SSL_CERTIFICATE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: SECURITY_SSL_CERTIFICATE
- name: CRT_TXT_FILE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: CRT_TXT_FILE
- name: CRT_FILE
valueFrom:
secretKeyRef:
name: {{ .Values.secretName }}
key: CRT_FILE
quote
函数非常简单:它接受给定的字符串,并在其前后放置一个双引号字符。 如果您的字符串具有嵌入换行符或本身包含双引号之类的内容,则这可能不会产生有效的 YAML 输出。
您可以做的一件安全的事情是使用 YAML 块标量 语法。 如果在值所在位置使用
|
字符,则以下缩进行将组合在一起形成多行字符串。 在 Helm 中,您应该使用 indent
函数来一致缩进字符串的所有行;因为这也会缩进第一行,所以包含 indent
调用的行本身不应缩进。
spec:
containers:
- env:
- name: "SECURITY_SSL_CA"
value: |
{{ .Values.env.SECURITY_SSL_CA | indent 14 }}
toYaml
将任意结构转换为 YAML。 该结构将正确缩进,但从第一列开始,因此您将再次需要将其indent
移动到正确的位置。
看起来您的 Helm 值结构有一个键
env
包含任意环境变量映射,而您只是试图将它们全部复制出来。 这里的一种方法可能是使用 range
语句来迭代 .Values.env
;对于每个键值对,使用 name:
和 value:
键生成字典;然后用 toYaml
进行序列化。
spec:
containers:
- env:
{{- range $k, $v := .Values.env }}
- {{ dict "name" $k "value" $v | toYaml | indent 12 | trim }}
{{- end }}