在布莱恩的一生中,我该怎么做?
Terraform
用于在GCP中创建SQL Server实例。
根密码和用户密码是随机生成的,然后放入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
IMO相同。
答案 0 :(得分:1)
如何从这里将其放入我的应用程序容器?
您可以使用volume来存储密钥,并将相同的卷安装在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: {}
答案 1 :(得分:1)
将volumes
的{{1}}与medium: Memory
一起使用,以确保不会保留机密。
...
volumes:
- name: scratch
emptyDir:
medium: Memory
sizeLimit: "1Gi"
...
答案 2 :(得分:1)
在评论中的其他答案和建议之外,我想提出两个您可能会发现有趣的工具。
第一个是secret-init:
secrets-init
是一个设计为PID 1的简约初始化系统 内部容器环境,并与 多重机密管理员服务,例如Google Secret Manager
第二个是kube-secrets-init:
kube-secrets-init
是一个Kubernetes变异入网卷, 会突变使用特殊前缀环境的所有K8s Pod 直接或来自Kubernetes的Secret或ConfigMap变量。
它还支持与Google Secret Manager集成:
用户可以将Google秘密名称(以gcp:secretmanager:
前缀)作为环境变量值。 secrets-init
将使用指定名称将任何环境值解析为引用的机密值。
这里有一个很好的article。
答案 3 :(得分:1)
您可以使用 spring-cloud-gcp-starter-secretmanager
从 Spring 应用程序本身加载机密。
文档 - https://cloud.spring.io/spring-cloud-gcp/reference/html/#secret-manager