¿Cómo puedo actualizar un secreto en Kubernetes cuando se genera a partir de un archivo?

97

He creado un secreto usando kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Si quisiera actualizar los valores, ¿cómo puedo hacer esto?

Chris Stryczynski
fuente

Respuestas:

241

Esto debería funcionar:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Janos Lenart
fuente
21
Me gusta el uso inteligente de la salida para yaml y aplicar el comando. +1
Kevin Mansel
10
En la última versión de k8s, deberá proporcionar --save-configa kubectl create secretpara evitar una advertencia de CLI.
David House
Fyi, sintaxis reciente (septiembre de 2019) que funcionó 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 -los certificados estaban en texto sin formato.
ldg
63

Puede eliminar y recrear inmediatamente el secreto:

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

Pongo estos comandos en una secuencia de comandos, en la primera llamada recibes una advertencia sobre el secreto (aún no) existente, pero esto funciona.

PJMeisch
fuente
3
¿Qué sucede con las vainas mientras se elimina el secreto?
BrunoJCM
4
Los pods en ejecución de @BrunoJCM no se ven afectados, sin importar si obtienen los secretos a través de variables env o se montan como volúmenes. Si un pod que comencé en el tiempo mientras no hay secreto, se encuentran con un error; por lo tanto, la respuesta de Janos es el camino preferido a seguir.
PJMeisch
2
Sí, ya veo, usar applytiene mucho más sentido, ¡gracias!
BrunoJCM
Esto no --namespace=kube-system
funcionó
depende del espacio de nombres al que desee agregar el secreto, si no es el predeterminado, por supuesto, debe agregar el argumento del espacio de nombres.
PJMeisch
8

Alternativamente, también puede usar jq's =or |=operator para actualizar secretos sobre la marcha.

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 -

Aunque puede que no sea tan elegante o simple como el kubectl create secret generic --dry-runenfoque, técnicamente, este enfoque realmente actualiza los valores en lugar de eliminarlos / recrearlos. También necesitará los comandos jqy base64(o openssl enc -base64) disponibles,tr es una utilidad de Linux comúnmente disponible para recortar las nuevas líneas finales.

Consulte aquí para obtener más detalles sobre el jqoperador de actualización |=.

Devy
fuente
1

Como no pude responder a la respuesta de Devy anterior, lo que me gusta porque preservará la Propiedad donde eliminar y recrear tiene el potencial de perder cualquier información adicional en el registro. Estoy agregando esto para las personas más nuevas que quizás no entiendan de inmediato por qué sus variables no están siendo 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 -

Esto me llevó a intentar utilizar el método 'parche' de kubectl, que también parece funcionar.

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

Gracias Devy por la respuesta que mejor cubrió mis necesidades.

CJ Maahs
fuente
0

Para casos más específicos, es posible que deba especificar su espacio de nombres para que el certificado deba renovarse y eliminar el anterior.

**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
fuente