Kubernetes 部署 YAML 中链接机密的问题

问题描述 投票:0回答:1

描述

块引用

我正在尝试使用 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
kubernetes-helm kubernetes-secrets secretsmanager
1个回答
0
投票

Helm 的

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 }}
© www.soinside.com 2019 - 2024. All rights reserved.