En esta página, se describe el objeto secreto de Kubernetes y su uso en Google Kubernetes Engine.
¿Qué es un objeto secreto?
Los secretos son objetos seguros que almacenan datos sensibles, como contraseñas, tokens OAuth y Llaves SSH en tus clústeres. Almacenar datos sensibles en objetos secretos es más seguro que en el texto sin formato ConfigMaps o en especificaciones de pod. El uso de secretos te permite controlar la manera en que se usan los datos sensibles, y reduce el riesgo de exposición de datos a usuarios no autorizados.
También puedes encriptar secretos en la capa de la aplicación con una clave que administras en Cloud KMS. Para obtener más información, consulta Encriptación de secretos de la capa de la aplicación.
Crea un objeto secreto
Para crear un objeto secreto, ejecuta el comando siguiente:
kubectl create secret [TYPE] [NAME] [DATA]
[TYPE]
puede ser uno de los datos siguientes:
generic
: Crea un objeto secreto a partir de un archivo local, directorio o valor literal.docker-registry
: Crea un objeto secretodockercfg
para usar con un registro de Docker. Se usa para autenticar con los registros de Docker.tls
: Crea un objeto secreto TLS a partir de un par de claves público/privado determinado. Esta clave debe existir con anticipación. El certificado de clave pública debe estar codificada con PEM y coincidir con la clave privada en cuestión.
En la mayoría de los objetos secretos, se usa el tipo generic
.
[DATA]
puede ser uno de los datos siguientes:
- una ruta de acceso a un directorio que contiene uno o más archivos de configuración, indicada mediante las marcas
--from-file
o--from-env-file
- pares clave-valor, cada uno especificado con las marcas
--from-literal
Para obtener más información sobre kubectl create
, consulta la documentación de referencia.
Además, también puedes crear un secreto cuando defines un objeto secreto en un archivo de manifiesto YAML y, luego, implementar el objeto con kubectl create -f [FILE]
. Para obtener un ejemplo, consulta Distribuir credenciales de forma segura con objetos secretos.
Desde archivos
Si deseas crear un objeto secreto a partir de uno o más archivos, usa --from-file
o --from-env-file
. El archivo debe ser de texto sin formato, pero no importa su extensión.
--from-file
Cuando creas el objeto secreto con --from-file
, su valor es el contenido completo del archivo. Si el valor de tu objeto secreto contiene varios pares clave-valor, debes usar --from-env-file
en su lugar.
Puedes pasar un solo archivo o varios archivos:
kubectl create secret [TYPE] [NAME] --from-file [/PATH/TO/FILE] --from-file [/PATH/TO/FILE2]
También puedes pasar un directorio que contenga varios archivos:
kubectl create secret [TYPE] [NAME] --from-file [/PATH/TO/DIRECTORY]
Por ejemplo, con el comando siguiente, se crea un objeto secreto con el nombre credentials
a partir de dos archivos, username.txt
y password.txt
, y configura las claves para username.txt
y password.txt
respectivamente:
kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt
Los valores del objeto secreto están codificados en Base 64 en Kubernetes.
Ejecutar kubectl get secret credentials -o yaml
muestra el resultado siguiente.
apiVersion: v1 data: password.txt: MTIzNAo= username.txt: YWRtaW4K kind: Secret metadata: creationTimestamp: ... name: credentials namespace: default resourceVersion: "2011810" selfLink: /api/v1/namespaces/default/secrets/credentials uid: ... type: Opaque
De manera predeterminada, la clave es el nombre del archivo. Puedes anular la clave si usas la sintaxis extendida para --from-file
:
kubectl create secret [TYPE] [NAME] --from-file=KEY=[/PATH/TO/DIRECTORY]
El ejemplo siguiente es idéntico al anterior, pero configura las claves para username
y password
, en lugar de usar los nombres de archivos.
kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt
--from-env-file
Para cargar varios pares clave-valor en un objeto secreto, debes almacenar los pares clave-valor en uno o más archivos de texto sin formato y cargarlos con --from-env-file
, en lugar de --from-file
. Puedes cargar varios archivos si especificas la marca varias veces. Se aplican las mismas limitaciones que para --from-file
.
Por ejemplo, con el comando siguiente, se crea un objeto secreto denominado credentials
desde un solo archivo, credentials.txt
, que contiene varios pares clave-valor:
# Each of these key-value pairs is loaded into the Secret username=jane password=d7xnNss7EGCFZusG
Los valores del objeto secreto están codificados en Base 64 en Kubernetes.
kubectl create secret generic credentials --from-env-file ./credentials.txt
Ejecutar kubectl get secret credentials -o yaml
muestra el resultado siguiente.
apiVersion: v1
data:
password: ZDd4bk5zczdFR0NGWnVzRw==
username: amFuZQ==
kind: Secret
metadata:
creationTimestamp: 2019-06-04T15:39:27Z
name: credentials
namespace: default
resourceVersion: "14507319"
selfLink: /api/v1/namespaces/default/secrets/credentials
uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque
Limitaciones
kubectl ignora los archivos no regulares, como enlaces simbólicos, dispositivos y barras verticales.
Los subdirectorios también se ignoran; kubectl create secret
no se clasifica en subdirectorios.
Desde valores literales
Si quieres crear un objeto secreto a partir de valores literales, debes usar --from-literal
.
Por ejemplo, con el comando siguiente, se crea un objeto secreto genérico denominado literal-token
con dos pares clave-valor:
kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234
Especifica --from-literal
para cada par clave-valor. Los valores se codifican de forma automática en base64.
Ejecutar kubectl get secret literal-token -o yaml
muestra el resultado siguiente:
apiVersion: v1 data: password: MTIzNA== user: YWRtaW4= kind: Secret metadata: creationTimestamp: ... name: literal-token namespace: default resourceVersion: "2012831" selfLink: /api/v1/namespaces/default/secrets/literal-token uid: ... type: Opaque
En el resultado anterior, observa que password
y user
están codificados en base64.
La codificación en base64 permite que las apps y los servicios que no pueden manejar algunos caracteres resuman la información. Esta codificación no proporciona seguridad.
Cómo usar un objeto secreto
Para usar un objeto secreto con tus cargas de trabajo, puedes especificar variables de entorno que hagan referencia a los valores del objeto secreto o activar un volumen que contenga este objeto.
Para obtener información sobre el uso de los objetos secretos, consulta la sección sobre cómo usar objetos secretos.