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?

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 -

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.


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 |=.


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.


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} ```

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.