我在关注 this将 Django 应用程序部署到 Kubernetes 集群的教程。我已经创建了 cloudsql 凭据并按照教程将它们导出
export DATABASE_USER=<your-database-user>
export DATABASE_PASSWORD=<your-database-password>
然而,我的密码是由 LastPass 生成的,并且包含特殊字符,这些字符在 Kubernetes Pod 中被删除,从而使密码不正确。
这是我的密码(已更改,仅显示特殊字符)
5bb4&sL!EB%e
所以我尝试了各种导出这个字符串的方法,回显出来总是显示正确的密码,但是在 Kubernetes Dashboard 中密码总是不正确(也在 DevTools 中更改,但只是删除了一些字符)
我尝试过的事情
export DATABASE_PASSWORD=$'5bb4&sL\!EB\%e'
export DATABASE_PASSWORD='5bb4&sL!EB%e'
echo 总是好的,但 kubernetes 总是剥离它。
使用
skaffold deploy
进行部署编辑:
提示后,我尝试以 base64 编码形式存储密码,但是我怀疑它仅适用于本地范围,因为 Kubernetes Dashboard 中的密码仍然相同,我怀疑我需要重新生成证书才能远程工作在 gke 集群上?
那么 env 变量是用于本地的,而云 sql 代理中的凭据是那些被使用和误解的变量?顺便说一下,那些文件在哪里?
编辑2:
我刚刚发现 gke 集群确实使用凭据 json 而不是导出的变量。配置 json 已经包含 base64 编码形式的密码,但是它是字符串的 base64 编码,仍然缺少特殊字符。看起来唯一的出路是生成没有特殊字符的新凭据,这看起来像一个错误,不是吗?
最佳答案
您应该base64
在将密码传递到 pod 之前对密码进行编码,以便以可以保留的方式对特殊字符进行编码。
在 bash 中,您可以使用以下命令执行此操作:
export DATABASE_PASSWORD=`echo [ACTUAL_PASSWORD_HERE] | base64`
然后,您需要确保 Django 应用程序
settings.py
在将密码应用于其内部变量之前使用 base64 解码。因此,在您链接到的教程中,该行
'PASSWORD': os.getenv('DATABASE_PASSWORD'),
需要更改为:
'PASSWORD': base64.b64decode(os.getenv('DATABASE_PASSWORD')),
关于bash - Kubernetes cloudsql 中使用特殊字符转义密码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54647972/