【问题标题】:How to provide Vault secrets for a Flink application custom resource in Kubernetes如何在 Kubernetes 中为 Flink 应用程序自定义资源提供 Vault Secret
【发布时间】:2022-06-21 19:55:47
【问题描述】:

我想为在 Kubernetes 集群中运行的 Apache Flink 作业提供来自 Hashicorp Vault 的机密信息。 这些积分将用于访问用于检查点和保存点的状态后端。状态后端可以是例如 Minio S3 存储。 有人可以为FlinkApplication operator 提供一个工作示例吗?请给出以下设置?

用户名和密码(或访问密钥)的保险柜秘密:

vault kv put vvp/storage/config username=user password=secret
vault kv put vvp/storage/config access-key=minio secret-key=minio123

Flink 应用自定义资源的 k8s manifest:

apiVersion: flink.k8s.io/v1beta1
kind: FlinkApplication
metadata:
  name: processor
  namespace: default
spec:
  image: stream-processor:0.1.0
  deleteMode: None

  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: vvp-flink-job
        vault.hashicorp.com/agent-inject-secret-storage-config.txt: vvp/data/storage/config

  flinkConfig:
    taskmanager.memory.flink.size: 1024mb
    taskmanager.heap.size: 200
    taskmanager.network.memory.fraction: 0.1
    taskmanager.network.memory.min: 10mb
    web.upload.dir: /opt/flink
  jobManagerConfig:
    resources:
      requests:
        memory: "1280Mi"
        cpu: "0.1"
    replicas: 1
  taskManagerConfig:
    taskSlots: 2
    resources:
      requests:
        memory: "1280Mi"
        cpu: "0.1"
  flinkVersion: "1.14.2"
  jarName: "stream-processor-1.0-SNAPSHOT.jar"
  parallelism: 3
  entryClass: "org.StreamingJob"
  programArgs: >
    --name value

flink 应用的 Docker 文件:

FROM maven:3.8.4-jdk-11 AS build
ARG revision

WORKDIR /
COPY    src /src
COPY    pom.xml /

RUN mvn -B -Drevision=${revision} package

# runtime
FROM flink:1.14.2-scala_2.12-java11

ENV FLINK_HOME=/opt/flink

ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 6123 8081
CMD ["help"]

flink-config.yaml 包含以下示例:

# state.backend: filesystem

# Directory for checkpoints filesystem, when using any of the default bundled
# state backends.
#
# state.checkpoints.dir: hdfs://namenode-host:port/flink-checkpoints

# Default target directory for savepoints, optional.
#
# state.savepoints.dir: hdfs://namenode-host:port/flink-savepoints

最终目标是替换硬编码的秘密或以某种方式从保险库中设置它们:

state.backend: filesystem
s3.endpoint: http://minio:9000
s3.path.style.access: true
s3.access-key: minio
s3.secret-key: minio123

谢谢。

【问题讨论】:

  • 您已经为保管库添加了注释的问题是什么,如果 CRD 正在创建部署或 POD,您的注释将在 POD 或部署中,并且您将在文件中获取变量。 learn.hashicorp.com/tutorials/vault/kubernetes-sidecar?in=vault/…
  • 嗨@Harsh Manvar,问题是如何为 Flink 应用程序本身提供 Vault 文件中的变量。是否应该使用 shell 脚本将其附加到 flink-config.yaml 或在 Java/Scala 应用程序运行时通过StreamExecutionEnvironment getExecutionEnvironment(Configuration configuration) 设置? configuration.setString("s3.access-key", accessKey)。我可能已经用这条评论在某种程度上回答了我的问题。
  • 您的意思是最终从保险库到您的 pod 应用程序应该能够使用环境访问变量?正确的? vault 将其作为文件注入 pod 内,但您希望 ti 作为环境变量,因此应用程序从 env 获取它而不是解析它?
  • 实际上这是将其设置为环境的另一种选择。变量,不是吗?我正在考虑从我的 Scala 应用程序中解析 pod 的 secret-storage-config.txt 中提供的保险库机密。
  • 是的,我会写答案而不是解析从 env 获取变量会很容易,但这取决于您的开发计划。您可以将此 txt 文件行作为环境变量注入或解析文件是选项。

标签: kubernetes apache-flink vault


【解决方案1】:

一旦您设置了保管库变量

您可以在部署中添加注释以将变量从保管库中获取到部署

annotations:
        vault.hashicorp.com/agent-image: <Agent image>
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/agent-inject-secret-secrets: kv/<Path-of-secret>
        vault.hashicorp.com/agent-inject-template-secrets: |2

          {{- with secret "kv/<Path-of-secret>" -}}

          #!/bin/sh
          set -e

          {{- range $key, $value := .Data.data }}
          export {{ $key }}={{ $value }}
          {{- end }}

          exec "$@"
          {{- end }}
        vault.hashicorp.com/auth-path: auth/<K8s cluster for auth>
        vault.hashicorp.com/role: app

这将在您的 POD 中创建文件。

当你的应用程序运行时,它应该首先执行这个文件,然后环境变量将被注入到 POD。

因此,保管库注释将创建一个文件,与您获得的 txt 相同,但相反,我们将这样做

{{- range $key, $value := .Data.data }}
       export {{ $key }}={{ $value }}
{{- end }}

它会在 key & value 之前保留并注入 export。现在该文件是一种 shell 脚本,一旦它在应用程序启动时被执行,它将向 OS 级别注入变量。

将此文件保存在 reop 中并将其添加到 Docker ./bin/runapp

#!/bin/bash
if [ -f '/vault/secrets/secrets' ]; then
  source '/vault/secrets/secrets'
fi
node <path-insnide-docker>/index.js #Sorry dont know scala or Java

package.json

"start": "./bin/runapp",

Dockerfile

ADD ./bin/runapp ./
EXPOSE 4444
CMD ["npm", "start"]

您的 Vault 注入文件将类似于 /vault/secrets/secrets 或您配置的路径的内部 pod。

#!/bin/sh
set -e
export development=false
export production=true
exec "$@"

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多