如何在运行时在 flink-conf.yaml 中注入条目以安全地传递机密?

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

我正在使用 Flink Kubernetes Operator 在 Kubernetes 中运行 Flink 应用程序,我需要安全地传递 Datadog 报告器的 Datadog API 密钥。挑战在于该密钥需要包含在

flink-conf.yaml
文件中,该文件存储在 ConfigMap 中,并且将机密存储在 ConfigMap 中并不安全。

我还创建了一个 JIRA 票证,建议使用环境变量来传递此 API 密钥,但此功能可能不会向后移植到早期版本的 Flink。

所以此时我的想法是在运行时以某种方式将 API 密钥注入到

flink-conf.yaml
中。
这可行吗?还有其他选择吗?

更新:我尝试将其作为

FLINK_PROPERTIES
env 传递,但这不起作用,未报告指标。

containers:
  - name: flink-main-container
    env:
      - name: FLINK_PROPERTIES
        value: "metrics.reporter.dghttp.apikey: key"
java kubernetes apache-flink
1个回答
0
投票

在 Kubernetes 中,有很多方法可以将敏感信息注入到应用程序部署中。下面提到了其中一些

  1. 使用 Kubernetes 秘密。使用 Kubernetes Secrets,而不是在 flink-conf.yaml 中显式输入 API 密钥。您可以按照以下步骤操作:

创建 Kubernetes Secret 来存储您的 Datadog API 密钥:

$kubectl create secret generic datadog-secret --from-literal=api_key=<your_datadog_api_key>

将 Secret 安装为 Flink 作业中的环境变量。更新您的 Flink 部署 YAML 以包含环境变量:

containers:
  - name: flink-main-container
    env:
      - name: DATADOG_API_KEY
        valueFrom:
          secretKeyRef:
            name: datadog-secret
            key: api_key

在运行时将 API Key 注入到 flink-conf.yaml 中。您可以编写一个 init 容器,在执行 Flink 作业之前从环境变量中读取 API 密钥并将其存储在 flink-conf.yaml 文件中。这是如何实现这一目标的简单示例:

initContainers:
  - name: init-flink-config
    image: alpine
    command: ['sh', '-c', 'echo "metrics.reporter.dghttp.apikey: $DATADOG_API_KEY" >> /path/to/flink-conf.yaml']
    env:
      - name: DATADOG_API_KEY
        valueFrom:
          secretKeyRef:
            name: datadog-secret
            key: api_key
    volumeMounts:
      - name: flink-conf-volume
        mountPath: /path/to/
  1. 使用Helm进行配置。如果您使用 Helm 部署 Flink 应用程序,则可以使用 Helm 模板声明机密并将其注入到您的设置中。

  2. 为 Flink 容器创建自定义入口点脚本,该脚本在启动时修改 flink-conf.yaml 并从环境变量插入 API 密钥。

  3. 使用边车容器。如果您希望保持干净的分离,可以使用 sidecar 容器进行配置注入。这可能会侦听机密的更改并根据需要更新 flink-conf.yaml。请参阅文档 Kubernetes Secrets 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.