Kubernetes Secret 未以编码格式存储在环境变量中

问题描述

我是 Kubernetes 的初学者。我创建了一个秘密文件并在部署 yaml 文件中引用了它。

app-secret.yaml

apiVersion: v1
kind: Secret
Metadata:
  name: app-secret
data:
  username: YWRtaW4=
  password: YWRtaW4=

deploy.yaml

env:
          - name: DEPLOY_ENV
            value: ${env}
          - name: NAMESPACE_NAME
            valueFrom:
                fieldRef:
                  fieldpath : Metadata.namespace
          - name: APP_USERNAME
            valueFrom:
                secretKeyRef:
                  name: app-secret
                  key: username
          - name: APP_PASSWORD
            valueFrom:
                secretKeyRef:
                  name: app-secret
                  key: password

在使用命令 kubectl get secret pod-54rfxd -n dev-ns -o json 时,它仅以编码格式打印用户名和密码。当我使用命令 kubectl exec pod-54rfxd -n dev-ns -- printenv 查询环境变量列表时,它给出了以下结果。

APP_USERNAME=admin
APP_PASSWORD=admin

为什么它不是环境变量中的编码格式。你能告诉我原因吗?是否可以用编码格式?

解决方法

在您创建密钥时,密钥以 base64 编码 格式存储。默认情况下,将密钥添加或注入到 pod 或部署 Kubernetes 中,使用 base64 解码密钥,因此您从 OS 获取纯文本作为环境变量。

还有一些其他选项可以在休息而不是编码加密

https://cloud.google.com/kubernetes-engine/docs/how-to/encrypting-secrets

https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contengencryptingdata.htm

是否可以编码格式?

您可以做的是将已编码的 .env 文件保存到 secret 中,然后将该文件挂载到应用程序可以访问 .env 文件的部署路径中,同时对其中的内容进行编码。

kubectl exec pod-54rfxd -n dev-ns --printenv

这个命令可能只有你有集群管理员权限才能运行,否则其他人不能访问pod内部。