¡Hola, Habreros! Kubernetes es uno de los elementos clave del ecosistema de la nube moderna. Esta tecnología asegura la fiabilidad, escalabilidad y resistencia de la virtualización de contenedores. John Arundel y Justin Domingus hablan sobre el ecosistema de Kubernetes y presentan soluciones probadas para problemas cotidianos. Paso a paso, construirás tu propia aplicación orientada a la nube y crearás la infraestructura para su soporte, configurarás el entorno de desarrollo y un canal de implementación continua que te será útil en tus próximos proyectos.
• Comenzarás a trabajar con contenedores y Kubernetes desde lo básico: no se requiere experiencia previa para aprender sobre el tema. • Lanzarás tus propios clústeres o elegirás un servicio gestionado de Kubernetes de Amazon, Google, etc. • Aplicarás Kubernetes para gestionar el ciclo de vida del contenedor y el consumo de recursos. • Optimizarás clústeres en cuanto a costo, rendimiento, resiliencia, capacidad y escalabilidad. • Aprenderás las mejores herramientas para desarrollar, probar y desplegar tus aplicaciones. • Aprovecharás prácticas de la industria actuales para garantizar la seguridad y el control. • Implementarás principios de DevOps en la empresa para que los equipos de desarrollo actúen de manera más ágil, rápida y eficiente.
¿Para quién es el libro?
El libro es más relevante para los empleados de los departamentos de administración, responsables de servidores, aplicaciones y servicios, así como para desarrolladores que estén construyendo nuevos servicios en la nube o migrando aplicaciones existentes a Kubernetes y a la nube. No te preocupes, no necesitas saber trabajar con Kubernetes y contenedores: aquí te enseñaremos todo.
Los usuarios experimentados de Kubernetes también encontrarán mucho valor: se examinan temas como RBAC, implementación continua, gestión de datos confidenciales y observabilidad. Esperamos que en las páginas del libro haya algo interesante para ti, independientemente de tus habilidades y experiencia.
¿Qué preguntas responde el libro?
Durante la planificación y redacción del libro, discutimos sobre tecnologías en la nube y Kubernetes con cientos de personas, interactuando tanto con líderes y expertos de la industria como con completos principiantes. A continuación se presentan algunas preguntas cuyas respuestas les gustaría ver en esta publicación.
- «Me interesa saber por qué debería dedicar tiempo a esta tecnología. ¿Qué problemas me ayudará a resolver a mí y a mi equipo?»
- «Kubernetes parece interesante, pero tiene una barrera de entrada bastante alta. Preparar un ejemplo simple no es complicado, pero la administración y depuración posteriores son intimidantes. Nos gustaría recibir consejos confiables sobre cómo la gente gestiona clústeres de Kubernetes en condiciones reales y con qué problemas es probable que nos enfrentemos».
- «Sería útil un consejo subjetivo. El ecosistema de Kubernetes ofrece demasiadas opciones para equipos principiantes. Cuando se puede hacer lo mismo de varias maneras, ¿cómo entender cuál es la mejor? ¿Cómo tomar una decisión?»
Y, probablemente, la pregunta más importante de todas es:
- «¿Cómo usar Kubernetes sin afectar el funcionamiento de mi empresa?»
Fragmento. Configuración y objetos Secret
La capacidad de separar la lógica de la aplicación de Kubernetes de su configuración (es decir, de cualquier valor o ajuste que pueda cambiar con el tiempo) es muy útil. Los valores de configuración generalmente incluyen parámetros destinados a un entorno específico, direcciones DNS de servicios externos y credenciales para autenticación.
Por supuesto, todo esto se puede colocar directamente en el código, pero ese enfoque no es lo suficientemente flexible. Por ejemplo, si se necesita cambiar un valor de configuración, tendría que recompilar y desplegar su código de nuevo. Una solución mucho mejor sería separar la configuración del código y leerla desde un archivo o variables de entorno.
Kubernetes proporciona varias maneras diferentes de gestionar la configuración. En primer lugar, puede pasar valores a la aplicación a través de variables de entorno especificadas en la especificación del pod (ver la sección «Variables de entorno» en la pág. 192). En segundo lugar, los datos de configuración se pueden almacenar directamente en Kubernetes, utilizando objetos ConfigMap y Secret.
En este capítulo, exploraremos detalladamente estos objetos y consideraremos algunos enfoques prácticos para la gestión de configuraciones y datos confidenciales utilizando una aplicación de demostración.
Actualización de las envolturas de los pods al cambiar la configuración
Supongamos que en su clúster hay un despliegue y desea cambiar algunos valores en su ConfigMap. Si utiliza un chart de Helm (ver sección "Helm: gestor de paquetes para Kubernetes" en la p. 102), se puede detectar automáticamente el cambio de configuración y reiniciar sus envolturas de pods con un elegante truco. Agregue la siguiente anotación a la especificación de su despliegue:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
| sha256sum }}Ahora la plantilla de despliegue contiene un hash de control de los parámetros de configuración: cuando se cambien los parámetros, el hash se actualizará. Si se ejecuta el comando helm upgrade, Helm detectará que la especificación del despliegue ha cambiado y reiniciará todas las envolturas de pods.
Datos confidenciales en Kubernetes
Ya sabemos que el objeto ConfigMap proporciona un mecanismo flexible para almacenar y acceder a datos de configuración en el clúster. Sin embargo, la mayoría de las aplicaciones tienen información que es secreta y confidencial: por ejemplo, contraseñas o claves API. Se pueden almacenar en ConfigMap, pero esta solución no es ideal.
En su lugar, Kubernetes ofrece un objeto de tipo especial diseñado para almacenar datos confidenciales: Secret. A continuación, veremos un ejemplo de cómo se puede aplicar este objeto en nuestra aplicación de demostración.
Para empezar, eche un vistazo al manifiesto de Kubernetes para el objeto Secret (ver hello-secret-env/k8s/secret.yaml):
apiVersion: v1
kind: Secret
metadata:
name: demo-secret
stringData:
magicWord: xyzzy
En este ejemplo, la clave secreta magicWord tiene el valor xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). La palabra xyzzy es muy útil en el mundo de la computación. De modo similar a ConfigMap, en el objeto Secret se pueden colocar muchas claves y valores. Aquí, por simplicidad, usamos solo un par "clave-valor".
Uso de objetos Secret como variables de entorno
Al igual que ConfigMap, el objeto Secret se puede hacer accesible en el contenedor como variables de entorno o como archivo en su disco. En el siguiente ejemplo, asignaremos a una variable de entorno un valor del Secret:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-env
ports:
- containerPort: 8888
env:
- name: GREETING
valueFrom:
secretKeyRef:
name: demo-secret
key: magicWordEjecute el siguiente comando en el repositorio demo para aplicar los manifiestos:
kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configurado
secreto "demo-secret" creadoComo antes, redirija el puerto local a la implementación para ver el resultado en su navegador:
kubectl port-forward deploy/demo 9999:8888
Reenviando desde 127.0.0.1:9999 -> 8888
Reenviando desde [::1]:9999 -> 8888Al abrir la dirección :9999/ deberías ver lo siguiente:
La palabra mágica es "xyzzy"
Escribiendo objetos Secret en archivos
En este ejemplo, conectaremos el objeto Secret al contenedor como un archivo. El código está en la carpeta hello-secret-file del repositorio demo.
Para conectar Secret como un archivo, utilizaremos la siguiente implementación:
spec:
containers:
- name: demo
image: cloudnatived/demo:hello-secret-file
ports:
- containerPort: 8888
volumeMounts:
- name: demo-secret-volume
mountPath: "/secrets/"
readOnly: true
volumes:
- name: demo-secret-volume
secret:
secretName: demo-secretAl igual que en la subsección "Crear archivos de configuración a partir de objetos ConfigMap" en la p. 240, creamos un volumen (en este caso es demo-secret-volume) y lo conectamos al contenedor en la sección de especificaciones de volumeMounts. En el campo mountPath se indica /secrets, por lo que Kubernetes creará en esta carpeta un archivo por cada par "clave - valor" definido en el objeto Secret.
En nuestro ejemplo, solo definimos un par "clave - valor" llamado magicWord, por lo que el manifiesto creará en el contenedor un archivo /secrets/magicWord con datos confidenciales, disponible únicamente para lectura.
Si se aplica este manifiesto de la misma manera que en el ejemplo anterior, debería producirse el mismo resultado:
La palabra mágica es "xyzzy"
Lectura de objetos Secret
En la sección anterior, utilizamos el comando kubectl describe para mostrar el contenido de ConfigMap. ¿Se puede hacer lo mismo con Secret?
kubectl describe secret/demo-secret
Nombre: demo-secret
Namespace: default
Etiquetas:
Anotaciones:
Tipo: Opaque
Datos
====
magicWord: 5 bytesObserve que los propios datos no se muestran. Los objetos Secret en Kubernetes tienen el tipo Opaque: esto significa que su contenido no se muestra en la salida de kubectl describe, registros y terminal, lo que previene la divulgación accidental de información confidencial.
Para ver la versión codificada de datos confidenciales en formato YAML, utilice el comando kubectl get:
kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaquebase64
¿Qué es eHl6enk=, que no se parece en nada a nuestro valor original? En realidad, es un objeto Secret presentado en codificación base64. Base64 es un esquema de codificación de datos binarios arbitrarios en forma de cadena de caracteres.
Dado que la información confidencial puede ser binaria y no estar disponible para su salida (como en el caso de una clave de cifrado TLS), los objetos Secret siempre se almacenan en formato base64.
El texto beHl6enk= es una versión de nuestra palabra secreta xyzzy, codificada en base64. Esto se puede verificar ejecutando el comando base64 --decode en la terminal:
echo "eHl6enk=" | base64 --decode
xyzzyPor lo tanto, aunque Kubernetes le protege de la salida accidental de datos confidenciales en la terminal o en los archivos de registro, si tiene permisos para leer objetos Secret en un espacio de nombres específico, se pueden obtener en formato base64 y luego decodificarse.
Si necesita codificar algún texto en base64 (por ejemplo, para incluirlo en un Secret), utilice el comando base64 sin argumentos:
echo xyzzy | base64
eHl6enkKAcceso a objetos Secret
¿Quién puede leer y editar objetos Secret? Esto se determina mediante RBAC, un mecanismo de control de acceso (lo discutiremos en detalle en la sección 'Introducción a la gestión de acceso basado en roles' en la página 258). Si está utilizando un clúster donde el sistema RBAC no está presente o desactivado, todos sus objetos Secret están disponibles para cualquier usuario y contenedor (más adelante explicaremos que no debe haber un clúster de producción sin RBAC).
Cifrado pasivo de datos
¿Y qué hay de aquellos que tienen acceso a la base de datos etcd, donde Kubernetes almacena toda su información? ¿Pueden leer datos confidenciales sin permisos para leer objetos Secret a través de la API?
A partir de la versión 1.7, Kubernetes soporta el cifrado pasivo de datos. Esto significa que la información confidencial dentro de etcd se almacena en disco de forma cifrada y no puede ser leída incluso por quienes tienen acceso directo a la base de datos. Para su descifrado se requiere una clave, que solo posee el servidor API de Kubernetes. En un clúster correctamente configurado, el cifrado pasivo debe estar habilitado.
Puede comprobar si el cifrado pasivo está activado en su clúster de la siguiente manera:
kubectl describe pod -n kube-system -l component=kube-apiserver | grep encryption
--experimental-encryption-provider-config=...Si no ve la bandera experimental-encryption-provider-config, el cifrado pasivo no está habilitado. Al utilizar Google Kubernetes Engine u otros servicios de gestión de Kubernetes, sus datos son cifrados mediante otro mecanismo, por lo que la bandera estará ausente. Consulte con su proveedor de Kubernetes si el contenido de etcd está cifrado.
Almacenamiento de datos confidenciales
Existen recursos de Kubernetes que nunca deben eliminarse del clúster: por ejemplo, objetos importantes como Secret. Puede proteger un recurso de la eliminación utilizando una anotación proporcionada por el gestor de Helm:
kind: Secret
metadata:
annotations:
"helm.sh/resource-policy": keepEstrategias de gestión de objetos Secret
En el ejemplo de la sección anterior, los datos confidenciales se protegían del acceso no autorizado inmediatamente después de ser guardados en el clúster. Sin embargo, en los archivos de manifiestos se almacenaban como texto plano.
Nunca debe colocar información confidencial en archivos que estén bajo un sistema de control de versiones. ¿Cómo administrar y almacenar de forma segura dicha información antes de aplicarla al clúster de Kubernetes?
Puede elegir cualquier herramienta o estrategia para trabajar con datos confidenciales en sus aplicaciones, pero aún así necesitará responder al menos las siguientes preguntas.
- ¿Dónde almacenar los datos confidenciales para que sean altamente disponibles?
- ¿Cómo hacer que los datos confidenciales sean accesibles para sus aplicaciones activas?
- ¿Qué debe suceder con sus aplicaciones cuando reemplaza o edita datos confidenciales?
Sobre los autores
John Arundel es un consultor con 30 años de experiencia en la industria informática. Ha escrito varios libros y trabaja con muchas empresas de diferentes países, asesorándolas en temas de infraestructura en la nube y Kubernetes. En su tiempo libre, le gusta surfear, dispara razonablemente bien y toca el piano de manera aficionada. Vive en una encantadora cabaña en Cornwall, Inglaterra.
Justin Domingus es un ingeniero de administración de sistemas que trabaja en un entorno DevOps con Kubernetes y tecnologías en la nube. Le gusta pasar tiempo al aire libre, beber café, atrapar cangrejos y estar frente a la computadora. Vive en Seattle, Washington, junto a su maravilloso gato y su esposa, que también es su mejor amiga, Edriann.
» Para más detalles sobre el libro, puedes consultar
»
»
Para los usuarios de Habr, descuento del 25% con el cupón — Kubernetes
Tras el pago de la versión en papel del libro, se envía el libro electrónico por correo electrónico.
Fuente: habr.com
