Kubernetes: изменить секрет с помощью kubectl?

Как я могу изменить значения в Kubernetes secret с помощью kubectl?

Я создал секрет с помощью kubernetes create secret generic, но, похоже, нет способа изменить секрет. Например, чтобы добавить к нему новое секретное значение или изменить в нем секретное значение.

Я предполагаю, что могу перейти на «низкий уровень», написать yaml-файл и выполнить kubectl edit, но я надеюсь, что есть более простой способ.

(Я использую kubernetes 1.2.x)


person gabor    schedule 12.05.2016    source источник


Ответы (8)


Самый прямой (и интерактивный) способ - выполнить kubectl edit secret <my secret>. Запустите kubectl get secrets, если хотите увидеть список секретов, которыми управляет Kubernetes.

person Timo Reimann    schedule 12.05.2016
comment
извините, просто чтобы уточнить, ваш ответ - нет, такого способа не существует, верно? - person gabor; 16.05.2016
comment
Извините, если я недостаточно ясно выразился: я говорю, что есть способ, выполнив команду kubectl edit, которую я показал в своем ответе. Для меня kubectl - это интерфейс командной строки (инструмент); если вы искали что-то другое, дайте мне знать. - person Timo Reimann; 17.05.2016
comment
... если вы хотите напрямую редактировать данные в кодировке base64. - person ibotty; 14.09.2017
comment
echo -n "admin" | base64 и добавьте результат в ваш .yaml файл (команда kubectl edit) - person Saksow; 22.11.2017
comment
Есть способ попроще. Ознакомьтесь с моим ответом. - person Aalex Gabi; 13.03.2020
comment
Почему кубернеты это навязывают? Зачем нужна эта кодировка base64? Для двоичных значений необходимо представить их значение в текстовой форме, но я предполагаю, что большинство секретов - это текст ascii или utf8. - person theferrit32; 11.08.2020

Если вы предпочитаете неинтерактивное обновление, вот один из способов сделать это:

kubectl get secret mysecret -o json | jq '.data["foo"]="YmFy"' | kubectl apply -f -

Обратите внимание, что YmFy - это строка bar в кодировке base64. Если вы хотите передать значение в качестве аргумента, jq позволяет это сделать:

kubectl get secret mysecret -o json | jq --arg foo "$(echo bar | base64)" '.data["foo"]=$foo' | kubectl apply -f -

Мне удобнее использовать jq, но yq тоже подойдет, если вы предпочитаете формат yaml.

person vdimitrov    schedule 12.09.2018
comment
без добавления новой строки после эха добавьте -n optin kubectl get secret mysecret -o json | jq --arg foo "$(echo -n bar | base64)" '.data["foo"]=$foo' | kubectl apply -f - - person vitaliytv; 07.01.2019
comment
Вот еще один вариант: kubectl get secret mysecret -o json | jq '.data."foo" |= ("bar" | @base64)' | kubectl apply -f - - person Mika Riekkinen; 24.09.2020
comment
Для длинных строк команда base64 включает разрывы строк каждые 76 символов, что нарушает декодирование на k8s для длинных строк. Предлагаю добавить -w 0 в конец. Итак, последняя команда - kubectl get secret mysecret -o json | jq --arg foo "$(echo -n bar | base64 -w 0)" '.data["foo"]=$foo' | kubectl apply -f - source: superuser.com/questions/1225134/ - person Ali Husseinat; 22.12.2020

Поскольку мне нужно было изменить секрет, я приземлился здесь.

Вот самый удобный способ, который я нашел для редактирования (однострочного) секрета.

Это уточняет kubectl edit secret <my secret> Тимо Реймана выше.

kubectl edit secret <my secret> (в моем случае) вызовет vi.

Теперь я перемещаю курсор в место после двоеточия секрета, который хочу отредактировать.

Затем я нажимаю r и [enter], которые помещают значение в кодировке base64 в отдельную строку.

Теперь я ввожу :. ! base64 -D, который декодирует текущую строку.

После внесения изменений в значение я ввожу :. ! base64, который закодирует измененное значение.

Нажатие k [shift]J снова объединит секретное имя и его новое значение.

:wq запишет новый секретный файл и выйдет из vi.

PS Если секрет имеет многострочное значение, включите номера строк (:set nu) и после изменения декодированного значения используйте A,B ! base64, где A и B - номера строк первой и последней строки Значение.

PPS Я только что на собственном горьком опыте узнал, что base64 будет получать текст для кодирования с добавленной новой строкой :( Если это не проблема для ваших значений - хорошо. В противном случае мое текущее решение состоит в том, чтобы отфильтровать это с помощью: .!perl -pe chomp | base64

person Skeeve    schedule 26.02.2019
comment
Для перекодирования многострочного секрета я предлагаю визуальный режим vim и . ! base64 -w0. - person user1202136; 08.03.2021

Исходя из ответа Скивза:

Base64 закодирует ваше значение:
echo -n 'encode_My_Password' | base64
Откройте секрет в режиме редактирования:
kubectl edit secret my-secret

Откроется редактор по умолчанию, заменит значение выходящего ключа или добавит новую строку и новый ключ с закодированным значением. Сохраните и закройте файл. К секрету добавлено обновленное значение или новая пара "ключ-значение".

person ShivB    schedule 27.12.2019

Самый простой способ из командной строки:

echo "This is my secret" | base64 | read output;kubectl patch secret my_secret_name -p="{\"data\":{\"secret_key\": \"$output\"}}" -v=1

Он закодирует значение This is my secret и обновит ваш my_secret_name секрет, добавив ключ secret_key и закодированные значения в качестве последней пары ключ-значение в этом секрете.

person Skrypter    schedule 28.05.2020

Я реализовал kubectl плагин только для этого.

Для установки с помощью krew

kubectl krew update
kubectl krew install modify-secret

Чтобы запустить

kubectl modify-secret xyz -n kube-system

Демо

с использованием плагина kubectl-modify-secret

person Rajat Jindal    schedule 05.12.2019
comment
Теперь это настоящий ответ! - person Kingdon; 02.09.2020

Простой способ: удалить и воссоздать секрет

Посмотрев на все эти ответы, для моих нужд лучшим решением было удалить и воссоздать:

kubectl delete secret generic
kubectl create secret generic # or whatever .. 

Если вы хотите сделать это жестко:

Использование edit для изменения docker-registry секрета

Я пришел к этому вопросу, чтобы изменить секрет стиля docker-реестра.
Простое редактирование его с помощью kubectl edit secret казалось чревато трудностями, поскольку я не знал, как выглядит секретное значение.

Я создал его с помощью команды типа kubectl create secret docker-registry generic-registry-secret --docker-server=docker.server --docker-username='my-cloud-usernname' --docker-password='my-auth-token' --docker-email='[email protected]'

Я мог бы отредактировать его, я понял, посмотрев на другие различные ответы здесь, как это можно сделать - я включаю свои заметки сюда на случай, если они помогут другим.

Список секретов: kubectl get secrets
Подробная информация о конкретном секрете: kubectl describe secrets/generic-registry-secret
Получить значение секрета: kubectl get secret generic-registry-secret -o jsonpath={.data}
Расшифровать секретное значение: сначала получить все, что находится между map [.dockerconfigjson: и], а затем выполнить:
echo "x9ey_the_secret_encoded_value_here_X0b3=" | base64 --decode

Затем я мог взять из этого конкретное значение токена аутентификации, которое я искал, и заменить его новым. А затем пропустите эту новую полную строку через | base 64, чтобы получить кодировку base 64, и теперь я могу, наконец, уверенно изменить значение с помощью kubectl edit secret generic-registry-secret и ввести новое правильное значение.

Но удаление и воссоздание - более простой вариант.


Ссылки:

person kris    schedule 15.11.2020

Самый быстрый способ, который я нашел:

# You need a version of micro that includes this commit https://github.com/zyedidia/micro/commit/9e8d76f2fa91463be660737d1de3bff61258c90d
kubectl get secrets my-secret -o json | jq -r .data.config | base64 -d | micro | base64 -w 0 | xclip -selection clipboard && kubectl edit secrets my-secret

И используя функцию bash, которую вы можете поместить в свой профиль:

function ks-edit { kubectl -n $1 get secrets $2 -o json | jq -r '.data."'$3'"' | base64 -d | micro | base64 -w 0 | xclip -selection clipboard && kubectl -n $1 edit secrets $2; }

Вы можете назвать это так:

ks-edit <namespace> <secret> <key>
person Aalex Gabi    schedule 13.03.2020
comment
Не думаю, что кто-то захочет устанавливать и использовать дополнительные ресурсы вроде micro :) - person Skrypter; 28.05.2020