在Kubernetes cloudsql中使用特殊字符转义密码的问题

时间:2019-02-12 10:29:17

标签: bash kubernetes google-cloud-sql skaffold

我正在按照this教程将Django App部署到Kubernetes Cluster。我已经创建了cloudsql凭据,并按照教程中的说明导出了

export DATABASE_USER=<your-database-user>
export DATABASE_PASSWORD=<your-database-password>

但是我的密码是由LastPass生成的,并且包含特殊字符,这些特殊字符在Kubernetes Pod中被分条,从而使密码不正确。

这是我的密码(已更改,仅显示特殊字符) 5bb4&sL!EB%e

因此,我尝试了各种导出该字符串的方法,将其回显总是显示正确的密码,但是在Kubernetes Dashboard中,密码始终不正确(也在DevTools中进行了更改,但是只是删除了一些字符)

enter image description here

我尝试过的事情

export DATABASE_PASSWORD=$'5bb4&sL\!EB\%e'
export DATABASE_PASSWORD='5bb4&sL!EB%e'

回声总是很好,但是kubernetes总是在剥离它。

使用skaffold deploy

进行部署

编辑:

提示后,我尝试以base64编码形式存储密码,但是我怀疑它仅适用于本地范围,因为Kubernetes Dashboard中的密码仍然相同,我怀疑我需要重新生成证书才能进行可以在gke集群上远程工作?

enter image description here

因此,env变量用于本地,而云sql代理中的凭据正在被使用和被误解?这些文件在哪里?

EDIT2:

我刚刚发现gke集群确实在使用凭据json而不是导出的变量。配置json已经包含以base64编码形式的密码,但是它是仍缺少特殊字符的字符串的base64编码。看起来唯一的出路是生成没有特殊字符的新凭据,这看起来像个错误,不是吗?

1 个答案:

答案 0 :(得分:2)

您应先base64对密码进行编码,然后再将其传递到窗格中,以使特殊字符得以保留的方式进行编码。

在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')),