Introducción a Kubernetes Secrets

Introducción a Kubernetes Secrets

  • ITOps y DevOps
6 min de lectura Actualizado Jan 17, 2019

Puntos clave: Kubernetes Secrets almacena de forma segura datos sensibles, como contraseñas y tokens, evitando la exposición en texto plano. Esta guía explica cómo Crea y gestiona secretos, incluyendo su utiliza como variables de entorno o volúmenes en pods.

  • Los secretos pueden crearse manualmente o automáticamente por Kubernetes.
  • Se puede acceder en pods mediante montajes de volumen o variables de entorno.

En esta entrada del blog, vamos a hablar de sons secretos de K8, incluyendo:

  • ¿Qué secretos son
  • Cómo Crea un secreto
  • Cómo trabajar con secretos

Supongo que tú tienes un conocimiento básico de Kubernetes y conceptos como pod, despliegue, servicio, etc. Para seguir el ritmo, te necesitarás tener kubectl y minikube instalados.

¿Cuál es un secreto de K8s?

Un secreto, como su nombre indica, está cualquier información que deba mantenerse confidencial, como contraseña, token, etc. Técnicamente tú puedes poner las credenciales directamente en la especificación de un pod en texto plano, pero hacerlo no está muy seguro, como te puedes imaginar. Para resolver esto, Kubernetes tiene el concepto de secretos donde tú puedes almacenar tu información sensible de forma segura y también controlar cómo la consume un pod.

¿Cómo Crea secretos?

En general, tanto el usuario como el propio Kubernetes pueden Crea un secreto. Si todos te necesitan están para acceder a la API de forma segura, entonces K8s puede Crea automáticamente un secreto adjunto a una cuenta de servicio que contenga credenciales para acceder a la API. Esta están la forma recomendada de acceder a la API. En la situación en la que necesitemos Crea nuestro propio secreto para otros usos, también podemos hacerlo. Por ejemplo, tenemos un pod ejecutando nuestra aplicación que necesita acceder a otro sistema con el nombre de usuario "example-user" y la contraseña "example-password", ¿cómo Crea el secreto y Obtén que nuestro pod reconozca y utilize las credenciales? Podemos Crea manualmente o con un archivo yaml o "kubectl Crea".

Crea manualmente un secreto

Para Crea secreto manualmente, primero debemos convertir la cadena a base64.

    $ echo -n 'example-user' | base64
4oCYZXhhbXBsZS11c2Vy4oCZ

$ echo -n 'example-password' | base64
4oCYZXhhbXBsZS1wYXNzd29yZOKAmQ==

Luego Crea un archivo yaml (example.yaml) con nuestras especificaciones secretas.

    apiVersion: v1
kind: Secret
metadata:
  name: demo
type: Opaque
data:
  username: 4oCYZXhhbXBsZS11c2Vy4oCZ
  password: 4oCYZXhhbXBsZS1wYXNzd29yZOKAmQ==

Podemos comprobar si se creó un secreto

    $ kubectl get secret
NAME                  TYPE                                  DATA      AGE
default-token-v8gqd   kubernetes.io/service-account-token   3         6m
demo                  Opaque                                2         11s

Como te puede Ve tenemos un secreto generado por el sistema y el que acabamos de crear. También podemos describir nuestro secreto solo para Haz asegurarnos de que no están en texto claro.

    Type:  Opaque

Data
====
username:  18 bytes
password:  22 bytes

Crea secreto con kubectl

También podemos Crea secreto de un archivo que contenga las credenciales. Por ejemplo, podríamos Crea el mismo secreto guardando el nombre de usuario en un archivo llamado username.txt y la contraseña en password.txt. Luego podemos ejecutar "kubectl Crea secret generic demo-creds --from-file=./username.txt --from-file=./password.txt".

¿Cómo utilizar el secreto?

Hay dos formas de consumir sons el secreto que creamos arriba:

  • Volumen de datos
  • Variable env

Vamos a demostrar ambos con un ejemplo sencillo.

Consumir secreto en un volumen

Para consumir secreto en un volumen, primero debemos Haz asegurarnos de que el volumen están definido en el manifiesto del pod y que el nombre del secreto están especificado para que ese contenedor pueda utilizarlo. También podemos hacer cosas como cambiar la ruta de los archivos y los permisos.

    apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    volumeMounts:             #We mount our volume
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:                    #We use the volume and defined our secret
  - name: foo
    secret:
      secretName: demo

Podemos Ve que nuestro secreto está en utiliza

    Volumes:
  foo:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  demo
    Optional:    false
  default-token-v8gqd:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-v8gqd
    Optional:    false

Ahora, para verificar que el secreto están lo que definimos arriba, podemos utilizar "kubectl exec" para Obtén el contenedor y comprobar.

    $ kubectl exec -ti mypod bash
root@mypod:/data# cat /etc/foo/username 
'Example-user'
root@mypod:/data# cat /etc/foo/password 
‘example-password’

Podemos Ve que el contenedor en el pod está usando las credenciales que creamos arriba. A continuación, Veamos cómo es usando el mismo secreto en la variable ambiental.

Consumir secreto en la variable env

    apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME        
        valueFrom:
          secretKeyRef:
            name: demo                #Name of secret
            key: username             #secret key
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: demo
            key: password
  restartPolicy: Never

Como te puede Ve, en lugar de los volúmenes, son definiendo env[].valueFrom.secretKeyRef haciendo referencia a la clave en el secreto. Ve Veamos cómo es este pod después de crearlo.

    root@secret-env-pod:/data# env | grep SECRET
SECRET_PASSWORD='example-password'
SECRET_USERNAME='example-user'

Consejos finales para los secretos de K8s

Algunas cosas más a tener en cuenta:

  • Cuando te actualizar el secreto que ya están consumido, Kubelet se asegura de que la clave están se actualice automáticamente.
  • Un pod no están el único objeto que usa un secreto, otras partes del sistema también pueden utilizar un secreto.
  • Un secreto puede ser consumido por más de una cápsula.

Recursos adicionales

Para más información sobre Kubernetes, explora estos recursos:

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de ITOps y DevOps

¿Te interesa saber más de BMC?

El Brief están nuestro correo mensual sobre el mainframe y la orquestación empresarial: investigación, historias de clientes, noticias de productos, eventos.

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Tú te has suscrito a The Brief

El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.