环境变量中 Kubernetes Secret 的值似乎不正确

问题描述 投票:0回答:2

我正在将一个测试应用程序部署到本地计算机 (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 定义中是否遗漏了某些内容?

kubernetes minikube
2个回答
1
投票

秘密值应该是base64编码的。使用

 的输出代替 
test

echo -n 'test' | base64

附注Secret 的类型应该是

Opaque
,而不是
Generic


0
投票

您可以使用

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.

© www.soinside.com 2019 - 2024. All rights reserved.