如何从 ConfigMap 中的变量中检索密码并在 kubernetes 部署中使用它们

How retrive passwords from varibales in ConfigMap and use them in kubernetes deployment

我有简单的 logstash 部署,我喜欢在 Kubernetes 中秘密存储敏感密码我将使用秘密,我想将它从 env vars 拉到 logstash 配置中。 问题是我需要在 ConfigMap

中获取变量
apiVersion: v1
kind: ConfigMap
metadata:
  name: logstash-config
  namespace: elastic-foo
data:
  logstash.yml: |
    http.host: "0.0.0.0"
    path.config: /usr/share/logstash/pipeline
  logstash.conf: |
    # all input will come from filebeat, no local logs
    input {
      s3 {
        "access_key_id" => ${access_key_id_pass}
        "secret_access_key" => ${secret_access_key_pass}
      }
    }
    filter {
    }
    output {
      stdout { codec => rubydebug }
      elasticsearch {
        index => "logstash-%{[@metadata]}"
        hosts => [ "http://xxxxxxxxx.svc:9200" ]
        user => ${user_name}
        password => ${password_pass}
      }
    }

这就是yml的秘密:

apiVersion: v1
kind: Secret
metadata:
  name: elastic-secret
  namespace: elasticxxxx
stringData:
  elasticsearch-password: xxxxx
  elasticsearch-user: xxxx
  access-key-id: xxxx
  secret-access-key: xxxxx

这个例子不起作用,我在 kube scerts 中有密码,环境变量在容器中。

可以在另一个环境变量中引用一个环境变量,前提是被引用的变量在引用它的变量之前声明。 Kubernetes 与分辨率无关。解析发生在容器中(参见 here)。

据我所知,目前无法从 ConfigMap 中引用 Secret。您可以尝试做的是在部署中使用 envFrom.

一个接一个地引用
kind: Deployment
spec:
  spec:
    containers:
    - name: container-name
      # [...]
      envFrom:
      - secretRef:
          name: elastic-secret
      - configMapRef:
          name: logstash-config

或逐个指定环境变量以确保它们以正确的顺序加载。

kind: Deployment
spec:
  spec:
    containers:
    - name: container-name
      env:
        - name: access_key_id_pass
          valueFrom:
            secretKeyRef:
              name: elastic-secret
              key: access-key-id
        # followed by the other secrets, then the configMapRefs...

这样您还可以根据您的 logstash-config 的要求命名环境变量。