Secretos

En esta página, se describe el objeto Secret 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 claves 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 Secret

Puedes crear un objeto secreto con la línea de comandos o un archivo YAML.

kubectl

Para crear un secreto, ejecuta el siguiente comando:

kubectl create secret SECRET_TYPE SECRET_NAME DATA

Reemplaza lo siguiente:

  • SECRET_TYPE: el tipo de secreto, que puede ser uno de los 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 ya debe existir. 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 secreto, se usa el tipo generic.

  • SECRET_NAME: es el nombre del secreto que se crea.

  • DATA: Los datos que se agregarán al secreto, que pueden ser uno de los 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.

Archivo YAML

Para crear un secreto con un archivo YAML, define un objeto secreto en el archivo y, luego, implementa el objeto con el siguiente comando:

kubectl create -f FILE_NAME.yaml

Para obtener un ejemplo, consulta Distribuye credenciales de forma segura con objetos secretos.

Crea secretos a partir de 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.

Crea un objeto secreto con --from-file

Cuando creas el objeto secreto con --from-file, su valor es el contenido del archivo. Si el valor de tu objeto secreto contiene varios pares clave-valor, debes usar --from-env-file en su lugar.

Puedes pasar uno o varios archivos:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_FILE1 \
  --from-file PATH_TO_FILE2

Reemplaza lo siguiente:

  • SECRET_TYPE: el tipo de secreto, que puede ser uno de los 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 ya debe existir. 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 secreto, se usa el tipo generic.

  • SECRET_NAME: es el nombre del objeto secreto que se crea.

  • PATH_TO_FILE: es la ruta de acceso al archivo.

También puedes pasar un directorio que contenga varios archivos:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_DIRECTORY

Reemplaza PATH_TO_DIRECTORY por la ruta al directorio.

Por ejemplo, con el siguiente comando, se crea un objeto secreto de tipo generic llamado 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 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. En este ejemplo, las claves son password.txt y username.txt. Puedes anular la clave predeterminada si usas la sintaxis extendida en la marca --from-file:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file=KEY_NAME=PATH_TO_DIRECTORY

Reemplaza KEY_NAME por el nombre que deseas establecer para la clave.

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

kubectl create secret generic credentials \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

Crea un objeto secreto con--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.

En el siguiente ejemplo, se crea un objeto secreto de tipo generic llamado credentials desde un solo archivo, credentials.txt, que contiene varios pares clave-valor.

  1. Crea el archivo credentials.txt:

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

  2. Crea el Secreto

    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 symlinks, dispositivos y canalizaciones. 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, el siguiente comando crea un objeto secreto de tipo generic llamado 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 este resultado, password y user están codificados en Base 64. 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 los objetos secretos, consulta Cómo usar objetos secretos.

Qué sigue