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:
Guía Kubernetes
- ¿Qué es Kubernetes (K8s)? Un tutorial básico de Kubernetes
- Mejores prácticas de Kubernetes para mejorar la eficiencia del clúster
- Mejores Prácticas: Cómo Diseñar Aplicaciones para Kubernetes
- Kubernetes Pods: Una introducción
- Kubernetes ReplicaSets: Una breve introducción
- Despliegues de Kubernetes completamente explicados
- Cómo utilizar y gestionar los DaemonSets de Kubernetes
- Cómo funcionan los servicios de Kubernetes
- Uso de Kubernetes Port, TargetPort y NodePort
- Creación y uso de ConfigMaps en Kubernetes
- Introducción a Kubernetes Secrets
- Fundamentos de las redes de Kubernetes
- Explicación de Kubernetes Ingress
- Introducción a las Listas de Helm de Kubernetes
- ¿Qué están el patrón de operador Kubernetes?
- Despliegue de PostgreSQL como un StatefulSet en Kubernetes
- Definición de Recursos Personalizados (CRDs) de Kubernetes Explicada
- 3 Patrones Kubernetes para aplicaciones nativas en la nube
- Explicación de los recursos de cómputo de Kubernetes
- Kubernetes Security for DevOps Pipelines
- Uso de spinnaker con Kubernetes para entrega continua
- Multi-Clústeres Kubernetes: Cómo y por qué utilizarlos
- Monitorización de Kubernetes: Una guía completa
- Kubernetes vs Docker: Una comparación rápida
- Kubernetes vs Docker Swarm: Comparando herramientas de orquestación de contenedores
- Kubernetes vs OpenShift: ¿Cuál es la diferencia?
- Certificaciones Kubernetes: Cómo y por qué Obtén la certificación
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.