我正在使用 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"
在 Kubernetes 中,有很多方法可以将敏感信息注入到应用程序部署中。下面提到了其中一些
创建 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/