如何在配置映射中秘密添加 API 密钥?

How to add API key confidentially inside config map?

我是 K8s 新手。我正在尝试将 Datadog 代理部署到我的集群以收集日志,这是通过 ConfigMap 实现的。

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-cm
data:
  fluent-bit.conf: |
    [SERVICE]
        Parsers_File     parsers.conf
    
    [INPUT]
        name              tail
        path              /tmp/app.log
        parser            nginx

    [OUTPUT]
        Name           datadog
        Match          *
        Host           http-intake.logs.datadoghq.com
        TLS            off
        apikey         <API key to be used confidentially>
        dd_service     abcd
        dd_source      abcd
        dd_tags        env:dev

  parsers.conf: |
    [PARSER]
        Name   nginx
        Format regex
        Regex ^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*))" "(?<agent>[^\"]*)"(?: "(?<target>[^\"]*))"$
        Time_Key time
        Time_Format %d/%b/%Y:%H:%M:%S %z

我不想将 API 键添加为纯文本。我可以使用秘密吗?请提出实现这一目标的方法。

P.S: 我需要使用config map来添加Datadog agent,因此无法替换config map。

理论上您可以Secret as a environment variable,然后使用 ConfigMap 将其传递给 Pod。

apiVersion: v1
kind: Secret
metadata:
  name: fluentbit-secret-test
type: Opaque
data:
  apikey: <base64 encoded api key>
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-cm
data:
  fluent-bit.conf: |
...
        apikey         $FLUENTBIT_API_KEY
...
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-test
spec:
  containers:
  - name: test
    image: nginx
    env:
      - name: FLUENTBIT_API_KEY
        valueFrom:
          secretKeyRef:
            name: fluentbit-secret-test
            key: apikey

但是,您必须记住,Kubernetes Secrets 默认情况下不加密,仅进行 base64 编码。具有 API 访问权限的任何人都可以检索或修改 Secret,任何具有 etcd

访问权限的人也可以