Я унаследовал настройку Kubernetes/Docker и случайно разбил модуль, изменив что-то, связанное с паролем БД.
Я пытаюсь устранить эту проблему.
У меня нет большого опыта работы с Kubernetes или Docker, поэтому я все еще учусь, как что-то делать.
Я полагаю, что значение содержится внутри учетных данных db-user-pass, которые являются секретом непрозрачного типа.
Я описываю это:
kubectl describe secrets/db-user-pass
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 16 bytes
username: 13 bytes
но я понятия не имею, как получить какие-либо данные из этого секрета. Пример на сайте Kubernetes, кажется, предполагает, что у меня будет строка в кодировке base64, но я даже не могу этого понять. Как мне получить значение для этого?
Идеально! Спасибо. Если вы хотите написать это как ответ, я приму это.
kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'. Это дает наилучшие результаты, но требует зависимости jq.
для точек в json см. это: github.com/kubernetes/kubernetes/issues/23386


Это связь, который вы, возможно, ищете.
Секреты Kubernetes требуют, чтобы секреты были предоставлены в формате с кодировкой base64, который может быть создан с использованием двоичного кода base64 в случае дистрибутивов Linux.
Пример:
echo "hello" | base64
aGVsbG8K
Kubernetes декодирует кодировку base64, когда мы передаем секретный ключ как переменную среды или монтируем как том.
Добавьте параметр --decode для декодирования секрета из base64.
echo "aGVsbG8K" | base64 --decode выведет helloВы можете использовать kubectl get secrets/db-user-pass -o yaml или -o json, где вы увидите username и password в кодировке base64. Затем вы можете скопировать значение и расшифровать его с помощью чего-то вроде echo <ENCODED_VALUE> | base64 -D (Mac OS X).
Более компактный однострочный для этого:
kubectl get secrets/db-user-pass --template = {{.data.password}} | base64 -D
и аналогично для имени пользователя:
kubectl get secrets/db-user-pass --template = {{.data.username}} | base64 -D
Примечание: в GNU/Linux флаг base64 — это -d, а не -D.
согласно base64 на centos7 команда base64 -d не -D
-D также недоступен для Ubuntu 18
Этот ответ был опубликован кем-то на Mac OS. -d — подходящий аргумент для декодирования в Linux.
Этот шаблон не работает, если ключ внутри секрета содержит точку (например, credentials.json). Рабочий вариант: kubectl get secrets/secret-name --template = "{{index .data \"credentials.json\" | base64decode}}". Также обратите внимание на использование base64decode Go вместо base64 ОС, чтобы он работал под любой ОС.
Нет смысла заставлять это работать на любой ОС, так как докер действительно работает только в Linux. Я обновил ответ для работы с bash и сделал пометку об OS/X и zsh.
Во-первых, получите секрет от etcd, запросив сервер API с помощью kubectl.
kubectl get secret db-user-pass -o yaml
Это даст вам секрет в кодировке base64 в формате yaml.
Как только у вас есть файл yaml, декодируйте их, используя
"base64 --decode"
Окончательная команда будет выглядеть так:
Не забудьте флаг -n в команде echo
echo -n "jdddjdkkdkdmdl" | base64 --decode
Я бы предложил использовать эту удобную команду. Он использует мощность go-шаблоны. Он перебирает все значения, декодирует их и печатает вместе с ключом. Он также обрабатывает не заданные значения.
kubectl get secret name-of-secret -o go-template='
{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'
## In your case it would output
# password: decoded_password
# username: decoded_username
Если вам не нравятся шаблоны go, вы можете использовать разные форматы вывода, например. yaml или json, но это выведет секреты, закодированные base64.
Это самый надежный ответ.
Кто-нибудь понял синтаксис, чтобы заставить это работать в PowerShell? Если я помещаю шаблон в файл и использую --go-template-file, он работает. Но --go-template ведет себя иначе (выдает разные ошибки о неожиданном том или ином). Даже при правильном выходе из строки (что, честно говоря, болезненно).
Использование: kubectl get secret name-of-secret -o go-template='{{range $k,$v := .data}}{{printf \"%s: \" $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{\"\n\"}}{{end}}' Обратите внимание на экранированные двойные кавычки.
Для более простого декодирования вы можете использовать такой инструмент, как ксд, который сделает для вас декодирование base64.
kubectl get secrets/db-user-pass -o yaml | ksd
или используя https://github.com/elsesiy/kubectl-view-секрет
kubectl view-secret secrets/db-user-pass
Я люблю этот плагин и рекомендую его.
Если у вас есть jq (запрос json), это работает:
kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'
ПРИМЕЧАНИЕ:
db-user-pass это название секрета k8s.data — это переменная внутри, которая содержит секретное значениеЭто работает! Обратите внимание, что для этого требуется jq 1.6 или выше (который не установлен в базовой версии на некоторых системах) и могут возникнуть проблемы с github.com/stedolan/jq/issues/47.
Это дает наилучший результат!
Спасибо за эту замечательную командную строку, результат волшебный
на убунту 18+
kubectl get secrets/db-user-pass --template = {{.data.password}} | base64 -d
У меня не работает. В версии 1.18.5 я получаю «<нет значения>» при использовании --template = {{.data.password}} в качестве параметра.
Я использую один и тот же каждый день, у меня есть разные кластеры версий 1,17, 1.18,1.19 и 1.20, и он все еще работает для меня.
Кубернет 1.11+
kubectl get secrets/db-user-pass --template='{{.data.password | base64decode }}'
Если ваши секретные ключи содержат тире (-) или точку (.):
kubectl get secret db-user-pass -o=go-template='{{index .data "password"}}' | base64 -d
Поскольку в нашем секрете argocd-cluster есть точка с admin.password внутри data, этот подход с использованием go-template был единственным решением, которое сработало для нас. Вот наша команда: kubectl -n argocd get secret argocd-cluster -o=go-template='{{index .data "admin.password"}}' | base64 -d; echo.
Расширение решения @Břetislav Hájek (большое спасибо за это).
Если вам нужно получить его по метке, вам нужно добавить дополнительную команду range для перебора возвращенных элементов.
$ LABEL_FILTER = "app.kubernetes.io/name=mysql-chart"
$ kubectl get secret -l "$LABEL_FILTER" -o go-template='
{{range $i := .items}}{{range $k,$v := $i.data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}{{end}}'
mysql_password: ...
mysql_root_password: ...
mysql_user: ...
С баш. Это работает под управлением Ubuntu 18.04 и Kubernetes 1.18.5.
kubectl -n metallb-system get secrets memberlist -o json | grep secretkey | grep -v f:s | awk -F '"' '{print$4}' |base64 --decode; echo
Этот один лайнер используется для получения закодированного файла kubeconfig из секрета и создания из него файла для динамического использования в задании ci, например:
kubectl get secret YOUR_SECRET -o json | grep -oP '(?<=\"YOUR_SECRET_KEY\": \")[^\"]*' | base64 --decode > ./YOUR_KUBECONFIG_FILE_NAME
Этот вариант jsonpath работает для меня на OSX.
kubectl get secrets/db-user-pass -o jsonpath = "{.data.username}" | base64 -d
Чтобы получить секрет с точкой в имени.
kubectl get secrets/tls -o jsonpath = "{.data['tls\.crt']}" | base64 -d
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
Это должно работать на всех платформах с kubectl 1.11+.
kubectl get secrets/db-user-pass --template='{{.data.password | base64decode}}'
И если вы хотите получить все ключи, значения
kubectl get secrets/db-user-pass --template='{{ range $key, $value := .data }}{{ printf "%s: %s\n" $key ($value | base64decode) }}{{ end }}'
Минимальный инструмент командной строки nodejs (гитхаб)
npm i -g kusd
kubectl get secret your-secret -o yaml | kusd
Попробуйте
kubectl get secret db-user-pass -o yaml, который выводит его в форме YAML и обычно включает закодированные секретные значения.