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, я добавляю здесь инструкции о том, как сделать это шаг за шагом:

  1. Установите krew отсюда https://krew.sigs.k8s.io/docs/user-guide/setup/install/ (пропустите этот шаг, если он у вас уже есть)

  2. Установите плагин для модификации секрета:

    kubectl krew install modify-secret

  3. Выполните следующую команду или добавьте ее в~/.zshrcили~/.bashrc:

    export XDG_CONFIG_HOME=~/

  4. Добавьте следующее в ~/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

Другие вопросы по тегам