Como posso atualizar um segredo no Kubernetes quando ele é gerado a partir de um arquivo?

97

Eu criei um segredo usando kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Se eu gostaria de atualizar os valores - como posso fazer isso?

Chris Stryczynski
fonte

Respostas:

242

Isso deve funcionar:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Janos Lenart
fonte
21
Eu gosto do uso inteligente da saída para yaml e aplicar o comando. +1
Kevin Mansel
10
Na versão mais recente do k8s, você precisará fornecer --save-configao kubectl create secretpara evitar um aviso de CLI.
David House de
fyi, sintaxe recente (setembro de 2019) que funcionou para tls secret: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -os certificados estavam em texto simples.
ldg
63

Você pode excluir e recriar imediatamente o segredo:

kubectl delete secret production-tls
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt

Coloquei esses comandos em um script, na primeira chamada você recebe um aviso sobre o segredo (ainda não) existente, mas funciona.

PJMeisch
fonte
3
o que acontece com os pods enquanto o segredo é excluído?
BrunoJCM
4
Os pods em execução do @BrunoJCM não são afetados, não importa se eles obtêm os segredos por meio de variáveis ​​env ou montados como volumes. Se um pod foi iniciado no momento em que não havia segredo, ocorreu um erro; portanto, a resposta de Janos é o caminho preferido a seguir.
PJMeisch
2
Sim, entendo, usar applyfaz muito mais sentido, obrigado!
BrunoJCM
Isso não estava funcionando para mim porque eu esqueci o--namespace=kube-system
Souradeep Nanda
depende de qual namespace você deseja adicionar o segredo, se não for o padrão , é claro que você deve adicionar o argumento de namespace.
PJMeisch de
8

Como alternativa, você também pode usar jqo operador 's =ou |=para atualizar os segredos rapidamente.

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq '.data["tls.key"] |= "$TLS_KEY"' \
        | jq '.data["tls.crt"] |= "$TLS_CRT"' \
        | kubectl apply -f -

Embora possa não ser tão elegante ou simples quanto a kubectl create secret generic --dry-runabordagem, tecnicamente, esta abordagem está realmente atualizando os valores em vez de excluí-los / recriá-los. Você também precisará dos comandos jqand base64(ou openssl enc -base64) disponíveis, tré um utilitário Linux comumente disponível para aparar novas linhas finais.

Veja aqui mais detalhes sobre a jqatualização do operador |=.

Devy
fonte
1

Como não fui capaz de responder à resposta de Devy acima, eu gosto porque preservará a Propriedade, onde excluir e recriar tem o potencial de perder qualquer informação extra no registro. Estou adicionando isso para as pessoas mais novas que podem não entender imediatamente o soro de que suas variáveis ​​não estão sendo interpoladas.

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq ".data[\"tls.key\"] |= \"$TLS_KEY\"" \
        | jq ".data[\"tls.crt\"] |= \"$TLS_CRT\"" \
        | kubectl apply -f -

Isso me levou a tentar usar o método 'patch' de kubectl, que também parece funcionar.

kubectl \
        patch \
        secret \
        production-tls \
        -p "{\"data\":{\"tls.key\":\"${TLS_KEY}\",\"tls.crt\":\"${TLS_CRT}\"}}"

Obrigado Devy pela resposta que melhor atendeu às minhas necessidades.

CJ Maahs
fonte
0

Para casos mais específicos, você pode precisar especificar seu namespace de que o certificado precisa ser renovado e excluir o antigo.

**For deletion of the cert **
kubectl delete secret -n `namespace`

**For creation of new cert to specific namespace **
kubectl create secret {your-cert-name} --key /etc/certs/{name}.com.key --cert /etc/certs/{name}.com.crt -n {namespace} ```
JohnBegood
fonte
0

Eu usei este e funcionou como um encanto:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

docker-server = https://index.docker.io/v1/ (para DockerHub)

Para mais detalhes: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line

Itay Ben Shmuel
fonte