Secreto

En esta página, se describe el objeto secreto en Kubernetes y su uso en Google Kubernetes Engine (GKE).

¿Qué es un 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 mediante 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 secreto

Creas un objeto secreto con kubectl create secret:

kubectl create secret type name data

En el ejemplo anterior, se ilustra lo siguiente:

  • 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 secreto dockercfg 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.

  • name es el nombre del secreto que estás creando.

  • 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 marcas --from-literal

Para obtener más información sobre kubectl create, consulta la documentación de referencia.

Como alternativa, para crear un objeto secreto, puedes definir un objeto secreto en un archivo de manifiesto YAML y, también, implementar el objeto mediante el siguiente comando:

kubectl create -f file-name.yaml

Para obtener un ejemplo, consulta Distribuye 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, mediante el siguiente comando se crea un objeto secreto llamado credentials a partir de dos archivos, username.txt y password.txt, y se establecen las claves en 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 Base64 en Kubernetes.

Cuando se ejecuta kubectl get secret credentials -o yaml, se muestra la salida 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

En el siguiente ejemplo, se crea un objeto secreto llamado credentials a partir de dos archivos, username.txt y password.txt, y se establecen las claves como username y password, en lugar de usarse los nombres de archivo:

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 siguiente comando, se crea un objeto secreto llamado credentials a partir de 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 Base64 en Kubernetes.

kubectl create secret generic credentials --from-env-file ./credentials.txt

Cuando se ejecuta kubectl get secret credentials -o yaml, se muestra la salida 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.

Próximos pasos