我正在将一个测试应用程序部署到本地计算机 (minikube) 上的 kubernetes 上,并尝试通过环境变量将数据库连接详细信息传递到部署中。
我使用两种方法传递这些详细信息 -
ConfigMap
和 Secret
。用户名 (DB_USERNAME
) 和连接 URL (DB_URL
) 通过 ConfigMap
传递,而数据库密码作为秘密 (DB_PASSWORD
) 传递。
我的问题是,虽然通过
ConfigMap
传递的值很好,但秘密中的 DB_PASSWORD
显得很混乱 - 就像存在一些编码问题(见下图)。
我的部署yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
envFrom:
- configMapRef:
name: gweb-cm
- secretRef:
name: password
我的
ConfigMap
和Secret
yaml
apiVersion: v1
data:
DB_URL: jdbc:mysql://mysql/test?serverTimezone=UTC
DB_USERNAME: webuser
SPRING_PROFILES_ACTIVE: prod
SPRING_DDL_AUTO: create
kind: ConfigMap
metadata:
name: gweb-cm
---
apiVersion: v1
kind: Secret
metadata:
name: password
type: Generic
data:
DB_PASSWORD: test
不确定我的 Secret 定义中是否遗漏了某些内容?
秘密值应该是base64编码的。使用
的输出代替
test
echo -n 'test' | base64
附注Secret 的类型应该是
Opaque
,而不是 Generic
您可以使用
data
键或 stringData
键指定 Kubernetes Secret 值。
当您使用 data
键时,您必须以 Base64 编码值。当您使用 stringData
键时,Kubernetes 会为您将值编码为 base64。
stringData
对于人类来说更方便,但不能以这种方式传递二进制数据。在这些情况下,您必须使用 data
并编码为 base64。
您也可以结合使用这两种方法。
以下两个清单是等效的。 第一个使用
data
键:
apiVersion: v1
kind: Secret
metadata:
name: password
type: Opaque
data:
DB_PASSWORD: dGVzdA== # output from: `echo -n test | base64`
第二个清单使用
stringData
键:
apiVersion: v1
kind: Secret
metadata:
name: password
type: Opaque
stringData:
DB_PASSWORD: test
参见文档 秘密 | Kubernetes.