4

为了布莱恩的一生,我该怎么做?

Terraform用于在 GCP 中创建 SQL Server 实例。Root密码和用户密码是随机生成的,然后放入Google Secret Manager。数据库的 IP 通过私有 DNS 区域公开。

我现在如何获取用户名和密码以将数据库访问到我的 K8s 集群?在此处运行 Spring Boot 应用程序。

这是我想到的一个选择:

在我的部署中,我添加了一个initContainer

- name: secrets
  image: gcr.io/google.com/cloudsdktool/cloud-sdk
  args: 
  - echo "DB_PASSWORD=$(gcloud secrets versions access latest --secret=\"$NAME_OF_SECRET\")" >> super_secret.env

好的,现在怎么办?如何从这里将它放入我的应用程序容器中?

还有一些选项bitnami/sealed-secrets,我不喜欢,因为设置Terraform已经在使用并将机密保存在 GCP 中。使用时sealed-secrets我可以跳过使用秘密管理器。与Vault海事组织相同。

4

5 回答 5

5

除了评论中的其他答案和建议之外,我还想推荐两个您可能会感兴趣的工具。

第一个是secret-init

secrets-init是一个简约的初始化系统,旨在作为 PID 1 在容器环境中运行,它与多个秘密管理器服务集成,例如谷歌秘密管理器

第二个是kube-secrets-init

kube-secrets-init是一个 Kubernetes mutating admission webhook,它可以改变任何使用特殊前缀环境变量的 K8s Pod,直接或来自 Kubernetes 作为 Secret 或 ConfigMap。

它还支持与 Google Secret Manager 的集成:

用户可以将 Google 机密名称(前缀为 gcp:secretmanager:)作为环境变量值。将 secrets-init 使用指定名称将任何环境值解析为引用的秘密值。

这是一篇关于它如何工作的好文章。

于 2020-09-17T08:24:24.203 回答
3

如何从这里将它放入我的应用程序容器中?

您可以使用一个来存储秘密,并将相同的卷安装在 init 容器和主容器中,以便与来自 init 容器的主容器共享秘密。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: my-app
    image: my-app:latest
    volumeMounts:
    - name: config-data
      mountPath: /data
  initContainers:
  - name: secrets
    image: gcr.io/google.com/cloudsdktool/cloud-sdk
    args: 
    - echo "DB_PASSWORD=$(gcloud secrets versions access latest --secret=\"$NAME_OF_SECRET\")" >> super_secret.env
    volumeMounts:
    - name: config-data
      mountPath: /data
  volumes:
  - name: config-data
    emptyDir: {}
于 2020-09-16T16:03:10.217 回答
1

使用volumesemptyDir withmedium: Memory来保证秘密不会被持久化。

...
volumes:
      - name: scratch
        emptyDir:
          medium: Memory
          sizeLimit: "1Gi"
...
于 2020-09-16T16:13:29.453 回答
1

您可以使用spring-cloud-gcp-starter-secretmanager从 Spring 应用程序本身加载机密。

文档 - https://cloud.spring.io/spring-cloud-gcp/reference/html/#secret-manager

于 2021-04-29T09:56:50.190 回答
0

如果可以控制图像,则可以更改入口点并使用berglas.

Dockerfile:

FROM adoptopenjdk/openjdk8:jdk8u242-b08-ubuntu  # or whatever you need

# Install berglas, see https://github.com/GoogleCloudPlatform/berglas
RUN mkdir -p /usr/local/bin/
ADD https://storage.googleapis.com/berglas/main/linux_amd64/berglas /usr/local/bin/berglas
RUN chmod +x /usr/local/bin/berglas

ENTRYPOINT ["/usr/local/bin/berglas", "exec", "--"]

现在我们构建容器并对其进行测试:

docker build -t image-with-berglas-and-your-app .
docker run \
    -v /host/path/to/credentials_dir:/root/credentials \
    --env GOOGLE_APPLICATION_CREDENTIALS=/root/credentials/your-service-account-that-can-access-the-secret.json \
    --env SECRET_TO_RESOLVE=sm://your-google-project/your-secret  \
    -ti image-with-berglas-and-your-app env

这应该打印sm://由实际秘密值替换的环境变量。

在 K8s 中,我们使用 Workload Identity 运行它,因此调度 pod 所代表的 K8s 服务帐户需要绑定到有权访问密钥的 Google 服务帐户。

最后,您的 pod 描述将是这样的:

apiVersion: v1
kind: Pod
metadata:
  name: your-app
spec:
  containers:
  - name: your-app
    image: image-with-berglas-and-your-app
    command: [start-sql-server]
    env:
      - name: AXIOMA_PASSWORD
        value: sm://your-google-project/your-secret
于 2022-01-27T18:14:20.530 回答