kubernetes: изменить секрет, используя cli?
Как я могу изменить значения в kubernetes
секрет с помощью кли?
Я создал секрет с kubernetes create secret generic
, но, похоже, нет способа изменить секрет. Например, чтобы добавить новое секретное значение или изменить секретное значение в нем.
Я предполагаю, что могу перейти на "низкий уровень", написать yaml-файл и сделать kubectl edit
но я надеюсь, что есть более простой способ.
(Я использую kubernetes 1.2.x
)
15 ответов
Самый прямой (и интерактивный) способ должен быть выполнен kubectl edit secret <my secret>
, Бежать kubectl get secrets
если вы хотите увидеть список секретов, которыми управляет Кубернетес.
Если вы предпочитаете неинтерактивное обновление, это один из способов сделать это:
kubectl get secret mysecret -o json | jq '.data["foo"]="YmFy"' | kubectl apply -f -
Обратите внимание, что YmFy
является base64-закодированным bar
строка. Если вы хотите передать значение в качестве аргумента, jq
позволяет вам сделать это:
kubectl get secret mysecret -o json | jq --arg foo "$(echo bar | base64)" '.data["foo"]=$foo' | kubectl apply -f -
Мне удобнее пользоваться jq
но yq
Также следует выполнить работу, если вы предпочитаете формат yaml.
Когда я почувствовал необходимость изменить секрет, я приземлился здесь.
Вот самый удобный способ, который я нашел для редактирования (однострочного) секрета.
Это развивает 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 - номера строк первой и последней строки значения.
Исходя из ответа Скивза:
Base64 закодирует ваше значение:echo -n 'encode_My_Password' | base64
Откройте секрет в режиме редактирования:kubectl edit secret my-secret
Откроется редактор по умолчанию, заменит значение выходного ключа или добавит новую строку и новый ключ с закодированным значением. Сохраните и закройте файл. Обновленное значение или новая пара "ключ-значение" теперь добавлены к секрету.
Самый простой способ из командной строки:
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
ключ и закодированные значения в качестве последней пары ключ-значение в этом секрете.
Я реализовал kubectl
плагин только для этого.
Для установки с помощью krew
kubectl krew update
kubectl krew install modify-secret
Запустить это
kubectl modify-secret xyz -n kube-system
Демо
<img src="https://github.com/rajatjindal/kubectl-modify-secret/raw/master/demo/usage.gif" alt="using kubectl-modify-secret plugin" style="max-width:100%;">
Простой способ: удалить и воссоздать секрет
Посмотрев на все эти ответы, для моих нужд лучшим решением было удалить и воссоздать:
kubectl delete secret generic
kubectl create secret generic # or whatever ..
Если вы хотите сделать это жестко:
С помощью
edit
изменить
docker-registry
секрет
Я пришел к этому вопросу, чтобы изменить секрет стиля "docker-registry".
Просто отредактируйте его с помощью
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='my@email.com'
Я мог бы отредактировать его, я понял, посмотрев на другие различные ответы здесь, как это можно сделать - я включаю свои заметки сюда на случай, если они помогут другим.
Перечислите секреты:
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
и введите новое правильное значение.
Но удаление и воссоздание - более простой вариант.
Рекомендации:
Добавьте новый ключ к существующему секрету.
kubectl patch secret $SECRET_NAME --type=json \
-p='[{
"op" : "add" ,
"path" : "/data/'$KEY'" ,
"value" : "'$(base64 <<< "$VALUE")'"
}]'
Обновить существующий ключ в секрете
kubectl patch secret $SECRET_NAME --type=json \
-p='[{
"op" : "replace" ,
"path" : "/data/'$KEY'" ,
"value" : "'$(base64 <<< "$VALUE")'"
}]'
Я смог найти толькоreplace
операция в документации, без упоминания операции. Тем не менее, похоже, что он соответствует RFC 6902 , поэтому я протестировал его с помощьюadd
и это работает нормально. Я ожидаю, что другие операции, определенные в RFC 6902, также будут работать, хотя я их не проверял.
использоватьstringData
вместоdata
чтобы указать незакодированные данные:
kubectl patch secret my_secret_name -p="{\"stringData\":{\"secret_key\": \"my secret\"}}"
Перед редактированием секретов с помощью kubectl...
Я настоятельно рекомендую использовать k9s (не только для этой цели, но и как легкий инструмент управления K8s CLI).
Как вы можете видеть ниже (игнорируйте все белые прямоугольники), когда контекст вашего кластера установлен на терминале, вы просто вводите
k9s
и вы попадете в хороший терминал, где вы сможете проверить все ресурсы кластера.
Просто введите
":"
и введите имя ресурса ( в данном случае секреты ), которое появится в середине экрана.
Затем вы можете выбрать секрет с помощью стрелок вверх и вниз и ввести
e
для редактирования (зеленая стрелка):
Самый быстрый способ, который я нашел:
# 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
Всегда получайте копию секретов перед редактированием -kubectl get secrets <your-secret-name> -n <namespace> -o yaml > mysecret.yaml
Теперь вы можете отредактировать команду запуска редактирования, чтобы отредактировать свой секрет -kubectl edit secrets <your-secret-name> -n <namespace>
или вы можете сделать копию вашегоmysecret.yaml
файл и выйдите из секретов внутри этого и запустите -
kubectl apply -f mysecret.yaml
Убедитесь, что вы декодируете и кодируете с помощью base64 для просмотра и добавления секретов соответственно.
Безусловно, самый простой способ сделать это — поддерживать местную.env
файл для каждого из ваших секретов.
например
MY_SECRET=something
PASSWORD=anotherthing
Просто беги
kubectl create secret generic <name> --from-env-file=.env
А когда вам нужно его изменить - просто удалите его и снова запустите указанную выше команду.
Не возиться сbase64
Вот мой один лайнер:
$ kubectl get secrets/my-secret -o yaml | yq '.dataStrings = (.data | map_values(@base64d)) | del(.data)' | vipe | yq '.data = (.dataStrings | map_values(@base64)) | del(.dataStrings)' | kubectl apply -f -
Если вам интересно, как это сделать с помощьюk9s
, я добавляю здесь инструкции о том, как сделать это шаг за шагом:
Установите krew отсюда https://krew.sigs.k8s.io/docs/user-guide/setup/install/ (пропустите этот шаг, если он у вас уже есть)
Установите плагин для модификации секрета:
kubectl krew install modify-secret
Выполните следующую команду или добавьте ее в
~/.zshrc
или~/.bashrc
:export XDG_CONFIG_HOME=~/
Добавьте следующее в ~/k9s/plugin.yml
plugin:
edit-secret:
shortCut: Ctrl-X
confirm: false
description: "Edit Decoded Secret"
scopes:
- secrets
command: kubectl
background: false
args:
- modify-secret
- --namespace
- $NAMESPACE
- --context
- $CONTEXT
- $NAME