Проблема с экранированием пароля специальными символами в Kubernetes cloudsql

Я следил за этим руководством по развертыванию приложения Django в кластере Kubernetes. Я создал учетные данные cloudql и экспортировал их, как в учебнике.

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

Однако мой пароль был сгенерирован LastPass и содержит специальные символы, которые в Kubernetes Pod выделены полосами, что делает пароль неверным.

Это мой пароль (изменен, показаны только специальные символы) 5bb4&sL!EB%e

Итак, я пробовал различные способы экспорта этой строки, повторяя ее, всегда показывал правильный пароль, однако в панели управления Kubernetes пароль всегда неверен (также изменен в DevTools, но некоторые символы просто удалены)

введите описание изображения здесь

Вещи, которые я пробовал

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

Эхо всегда хорошо, но kubernetes всегда его раздевает.

Развертывание с skaffold deploy

РЕДАКТИРОВАТЬ:

После подсказки я попытался сохранить пароль в форме кодировки base64, однако я подозреваю, что он применим только к локальной области, так как пароль в Kubernetes Dashboard все тот же, я подозреваю, что мне нужно повторно сгенерировать сертификат, чтобы эта работа работала удаленно. на кластере гке?

введите описание изображения здесь

Значит, переменные env предназначены для локальных, а учетные данные в облачном прокси-сервере sql - это те, которые используются и неправильно интерпретируются? Кстати, где эти файлы?

РЕДАКТИРОВАТЬ2:

Я только что узнал, что действительно кластер gke использует учетные данные json, а не экспортируемые переменные. Конфигурация json уже содержит пароль в кодированной форме base64, ОДНАКО это кодировка строки base64, в которой все еще отсутствуют специальные символы. Похоже, единственный выход - сгенерировать новые учетные данные без специальных символов, это похоже на ошибку, не так ли?


person Josef Korbel    schedule 12.02.2019    source источник


Ответы (1)


Вы должны 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')),

person Paul Annetts    schedule 12.02.2019
comment
Спасибо за быстрый ответ, я сейчас попробую. В этом есть смысл. - person Josef Korbel; 12.02.2019
comment
Отредактировал мой ответ, пожалуйста, посмотрите? - person Josef Korbel; 12.02.2019
comment
Вам нужно будет изменить код Django (settings.py), а затем повторно развернуть приложение Django для нового пароля с новой переменной среды, которую нужно подобрать. Я скорректирую свой ответ, чтобы сделать его более очевидным. - person Paul Annetts; 12.02.2019
comment
Естественно, я сделал и то, и другое. Похоже, что переменные env выбираются из учетных данных json при развертывании в реальном кластере, а не экспортируемых переменных, которые предназначены для локальной разработки. - person Josef Korbel; 12.02.2019