Kubernetes Deployments: Una Guía Completa
Kubernetes, un favorito en la comunidad de desarrolladores, es una plataforma ampliamente utilizada para ejecutar contenedores Docker en clusters. Esta potente plataforma ofrece diferentes métodos para instalar y actualizar aplicaciones que se ejecutan en contenedores, proporcionando así un alto nivel de flexibilidad para diferentes escenarios. En Kubernetes, los contenedores se ejecutan en pods, y su instalación se define mediante Kubernetes Deployments. Esta entrada del blog trata sobre las instalaciones de Kubernetes, sus tipos, estrategias de instalación y prácticas recomendadas.
¿Qué es una instalación de Kubernetes?
Una instalación en Kubernetes es un objeto de recurso que gestiona la instalación y el ciclo de vida de las aplicaciones en contenedores en clústeres. Proporciona actualizaciones a las aplicaciones, garantizando que el número necesario de pods idénticos se esté ejecutando y esté disponible en todo momento. También proporciona actualizaciones declarativas para Pods y ReplicaSets. Las instalaciones son una función clave de Kubernetes para automatizar la ampliación, las actualizaciones y las reversiones.
La instalación es un objeto de Kubernetes que especifica el estado deseado para los Pods, y crea y gestiona ReplicaSets para garantizar que se mantiene este estado. Un ReplicaSet gestiona directamente los Pods, incluyendo su estado y número. La instalación indica a Kubernetes cómo modificar o crear las instancias Pod que contienen contenedores con aplicaciones. El estado de la instalación de Pods se describe en un manifiesto.
Los administradores pueden ampliar el número de réplicas de forma eficiente, realizar la implantación del código de aplicación actualizado con un alto nivel de control y volver a versiones anteriores de las implantaciones en caso necesario. Para gestionar las instalaciones de Kubernetes, los administradores utilizan la herramienta de línea de comandos kubectl en Linux y otros sistemas operativos compatibles. Cada pod creado con una instalación tiene un ReplicaSet relacionado con este pod. Un ReplicaSet, a su vez, tiene un puntero a la instalación que creó este ReplicaSet.
Fundamentos de la instalación de Kubernetes
Las instalaciones de Kubernetes se desarrollan para instalar y ampliar aplicaciones en contenedores en clústeres. Las instalaciones proporcionan una forma declarativa de definir el estado deseado de su aplicación y automatizar el proceso de alcanzar y mantener ese estado. Los conceptos y componentes fundamentales relacionados con las instalaciones de Kubernetes son:
- Estado deseado. La instalación define el estado deseado de una aplicación, como el número de réplicas de un pod, las imágenes de contenedor que se utilizarán y los recursos asignados a cada pod.
- Configuración declarativa. Las instalaciones suelen utilizar un enfoque declarativo, en el que los administradores especifican el estado en un archivo JSON o YAML. Mientras que el enfoque imperativo permite a los administradores establecer qué hacer directamente, el enfoque declarativo en Kubernetes permite a los administradores definir el resultado requerido, y Kubernetes lo logrará con sus mecanismos internos. El controlador de instalación de Kubernetes supervisa el estado de los nodos y pods. Si se producen cambios en tiempo real, como el fallo de un pod, éste puede ser sustituido. De este modo, Kubernetes supervisa el estado del clúster en tiempo real y realiza ajustes para ajustarse al estado deseado.
- ReplicaSet. Una instalación gestiona un ReplicaSet. El ReplicaSet crea y elimina pods según sea necesario para mantener el número deseado de réplicas. Este enfoque permite a Kubernetes asegurarse de que las réplicas de pod especificadas se están ejecutando en un momento dado.
- Actualizaciones continuas. Las instalaciones son compatibles con las actualizaciones continuas, que permiten actualizar la aplicación sin tiempo de inactividad. Kubernetes sustituye gradualmente los pods antiguos por pods nuevos, lo que ayuda a garantizar que la aplicación en contenedor permanezca en estado disponible durante el proceso de actualización de la instalación.
- Reversión. Si algo va mal durante una actualización en Kubernetes, puede volver a una versión anterior de la instalación, restaurando la aplicación a un buen estado conocido.
Configuración declarativa
En Kubernetes, un enfoque declarativo significa que usted especifica el estado deseado del sistema, y Kubernetes toma las acciones necesarias para alcanzar y mantener ese estado. Usted describe el objetivo final mediante archivos de configuración (normalmente escritos en YAML o JSON), y Kubernetes trabaja continuamente para garantizar que el estado real coincida con el estado deseado.
En general, en Kubernetes se prefiere el enfoque declarativo porque puede mantener la coherencia de estado deseada, facilitar la automatización y admitir una mejor colaboración y control de versiones. El enfoque imperativo puede ser útil para tareas rápidas y ad hoc, pero es menos adecuado para gestionar implantaciones de aplicaciones complejas y a largo plazo.
Cómo funcionan conjuntamente las instalaciones, los Pods y los ReplicaSets
En Kubernetes, Deployments, Pods y ReplicaSets son componentes estrechamente relacionados que gestionan colectivamente la instalación, la ampliación y el ciclo de vida de las aplicaciones. Es importante entender la relación entre ellos y saber cómo funcionan juntos en Kubernetes para una configuración adecuada.
- Un Pod es el objeto más simple y pequeño de un clúster Kubernetes y representa una única instancia de un proceso en ejecución. Un Pod puede contener uno o más contenedores que comparten los mismos volúmenes de almacenamiento y espacio de nombres de red. Los pods son efímeros por diseño, ya que pueden crearse y destruirse según sea necesario para ajustarse al estado deseado especificado por objetos de nivel superior como las instalaciones.
- Un ReplicaSet garantiza que un número determinado de Pods idénticos se estén ejecutando en un momento dado. Gestiona la creación y eliminación de Pods para mantener el número deseado de réplicas. Cada ReplicaSet utiliza selectores de etiquetas para identificar y gestionar los Pods bajo su control, garantizando el mantenimiento de los Pods correctos. Aunque se pueden crear y gestionar directamente ReplicaSets, normalmente se gestionan mediante instalaciones, que ofrecen funciones adicionales.
- Una instalación es un objeto Kubernetes de nivel superior que gestiona ReplicaSets y proporciona actualizaciones declarativas a las aplicaciones. Las instalaciones permiten a los administradores definir el estado necesario de su aplicación y otros ajustes, como se ha explicado anteriormente.
Al crear o actualizar una instalación, se crea automáticamente un nuevo ReplicaSet para gestionar los Pods de acuerdo con las especificaciones definidas. Cada vez que se actualiza una instalación, se crea un nuevo ReplicaSet para gestionar la nueva versión de los Pods, mientras que el antiguo ReplicaSet permanece hasta que los nuevos Pods se despliegan con éxito. Esto garantiza que las actualizaciones se apliquen de forma controlada, manteniendo la disponibilidad de las aplicaciones.
La instalación gestiona el ciclo de vida de los Pods indirectamente a través de sus ReplicaSets. Al definir el estado deseado en la instalación, se especifican las características y el número de Pods que se desean ejecutar. A continuación, la instalación garantiza este estado mediante la gestión de los ReplicaSets adecuados, que a su vez gestionan los Pods.
Así, los Pods son las unidades de ejecución que ejecutan contenedores, los ReplicaSets garantizan que se ejecuta el número necesario de Pods, y los Deployments proporcionan gestión declarativa y actualizaciones para las aplicaciones mediante el control de los ReplicaSets. Esta estructura jerárquica garantiza que sus aplicaciones sean escalables, resilientes y fáciles de gestionar. Las instalaciones abstraen las complejidades de la gestión directa de ReplicaSets y pods, ofreciendo una potente forma de gestionar las actualizaciones y la ampliación de las aplicaciones.
Detalles de la configuración de instalación
El uso de YAML para la configuración de la instalación en Kubernetes es una práctica común debido a su legibilidad y simplicidad. Kubernetes es compatible con los formatos YAML y JSON para los archivos de configuración, pero YAML es el más utilizado debido a su sintaxis fácil de usar.
YAML (YAML Ain’t Markup Language) es un estándar de serialización de datos legible y fácil de escribir. Se utiliza habitualmente para archivos de configuración e intercambio de datos entre lenguajes con estructuras de datos diferentes. En Kubernetes, YAML se utiliza para definir el estado deseado de varios objetos, incluyendo instalaciones, servicios, pods y más.
Componentes clave de un archivo YAML de instalación:
- apiVersion se utiliza para especificar la versión de la API (por ejemplo, apps/v1) del objeto Kubernetes.
- kind especifica el tipo de objeto Kubernetes (por ejemplo, instalación).
- contiene metadatos sobre el objeto, como su nombre y etiquetas.
- spec (especificación) se utiliza para definir el estado deseado del objeto Kubernetes, incluyendo:
- réplicas especifica el número de réplicas de pods a mantener.
- especifica cómo identificar los pods gestionados por la instalación.
- template define la plantilla del pod, incluyendo metadatos y especificaciones para los pods.
- containers lista los contenedores dentro del pod, incluyendo:
- Nombre: el nombre del contenedor.
- image: la imagen docker a utilizar
- puertos: los puertos a exponer
Las diferencias entre YAML y JSON para la sintaxis de configuración de instalación de Kubernetes son:
- YAML es más legible, ya que utiliza sangrías y pares clave-valor sin corchetes ni llaves.
- JSON utiliza una estructura más rígida con llaves ({}) y corchetes ([]), lo que lo hace menos legible para configuraciones complejas.
Normalmente se prefiere YAML para las instalaciones de Kubernetes.
Ejemplo de instalación de YAML
A continuación, puede ver un ejemplo de instalación de Kubernetes en formato YAML con configuraciones detalladas para pods y contenedores.
apiVersion: apps/v1
tipo: Instalación
metadatos:
Nombre: Nombre-del-despliegue
espec:
Réplicas: 3
selector:
matchLabels:
aplicación: app-name
plantilla:
metadatos:
etiquetas:
aplicación: app-name
espec:
contenedores:
– Nombre: contenedor-nombre
imagen: image-name:1.0
puertos:
– containerPort: 80
recursos:
peticiones:
memoria: «128Mi»
CPU: «250m»
límites:
memoria: «256Mi»
CPU: «500m»
env:
– Nombre: MY_ENV_VAR
valor: «algún-valor»
volumeMounts:
– mountPath: «/ruta/volumen»
Nombre: Nombre del volumen
volúmenes:
– Nombre: nombre-volumen
persistentVolumeClaim:
claimName: pvc-name
Vamos a explicar cada sección en detalle para que quede más claro. Configurando estas secciones, puede definir una instalación de aplicaciones robusta y escalable en Kubernetes, asegurándose de que sus pods y contenedores están configurados según sus requisitos.
Secciones clave de configuración
1. Metadatos
metadatos:
Nombre: deployment-name
Dónde:
Nombre: el nombre de la instalación
2. Spec (especificación de instalación)
spec:
Réplicas: 3
selector:
matchLabels:
app: app-name
Where:
replicas: el número de réplicas de pods a mantener
selector: define cómo identificar los pods gestionados por el despliegue mediante etiquetas
3.- Réplicas de pods : el número de réplicas de pods a mantener. Plantilla Pod (Especificación Pod)
template:
metadatos:
etiquetas:
aplicación: app-name
espec:
contenedores:
– Nombre: contenedor-nombre
image: image-name:1.0
Where:
metadata: etiquetas para identificar los pods
spec: configuración para los pods y sus contenedores
Configuración de contenedores
En esta parte, puedes ver las secciones YAML de las instalaciones para configurar los contenedores.
1. Imagen contenedora
imagen: nombre-imagen:1.0
donde:
imagen: la imagen contenedora a utilizar. Puede incluir una etiqueta (por ejemplo, 1.0) para especificar la versión.
2. puertos.
puertos:
– containerPort: 80
Donde:
containerPort: el puerto en el que el contenedor escuchará el tráfico
3. Solicitudes y límites de recursos
resources:
peticiones:
memoria: «128Mi»
CPU: «250m»
límites:
memoria: «256Mi»
cpu: «500m»
Dónde:
requisitos: los recursos mínimos necesarios
límites: los recursos máximos que puede utilizar el contenedor
4. Variables de entorno
env:
– Nombre: MY_ENV_VAR
valor: «algún-valor»
Donde:
env: define variables de entorno para el contenedor
5. Montajes de volumen
volumeMounts:
– mountPath: «/ruta/volumen»
Nombre: volume-name
Donde:
volumeMounts: especifica los volúmenes a montar dentro del contenedor
mountPath: la ruta dentro del contenedor donde se montará el volumen.
Configuración de volúmenes
La sección de volúmenes se encarga de configurar los volúmenes.
volúmenes:
– Nombre: nombre-volumen
persistentVolumeClaim:
claimName: pvc-name
Donde:
volumes: define los volúmenes disponibles para ser montados
name: el nombre del volumen
persistentVolumeClaim: especifica un PersistentVolumeClaim (PVC) a utilizar para el volumen.
Configuraciones avanzadas
1. Sondas de liveness y readiness
livenessProbe:
httpGet:
ruta: /salud
puerto: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
ruta: /listo
puerto: 8080
initialDelaySeconds: 5
periodSeconds: 10
Donde:
livenessProbe: comprueba si el contenedor está vivo
readinessProbe: se utiliza para comprobar si el contenedor actual está preparado para aceptar tráfico
2. Comando y argumentos
command: [«mi-comando»]
args: [«arg1», «arg2»]
Donde:
command: anula el punto de entrada por defecto del contenedor
args: especifica los argumentos para el comando
3. ConfigMaps y secretos
envFrom:
– configMapRef:
Nombre: my-configmap
– secretRef:
nombre: mi-secreto
donde:
envFrom: importa variables de entorno de un ConfigMap o secreto
Estrategia de instalación de Kubernetes
Existen múltiples estrategias (tipos) de instalación de Kubernetes, y puede seleccionar la más eficaz para su escenario actual. Las aplicaciones empresariales tienen distintos requisitos de tiempo de actividad y disponibilidad. Seleccionar la estrategia adecuada le permite evitar tiempos de inactividad e interrupciones del servicio, así como utilizar los recursos con eficacia. A continuación, puede ver los tipos de instalación de Kubernetes más comunes.
Actualizaciones renovables y reversiones
Una instalación de actualización continua supone la migración de una versión de la aplicación a otra, la más reciente, en el orden definido. Se lanza un nuevo ReplicaSet con la nueva versión de la aplicación. Se terminan las réplicas de la versión antigua. Como resultado, los pods de la versión antigua se sustituyen por los nuevos. La actualización continua permite pasar sin problemas de las versiones antiguas a las nuevas, pero la operación requiere cierto tiempo para completarse.
Volver a instalar la instalación
Los pods que se están ejecutando actualmente se terminan y luego se vuelven a crear con una nueva versión. Esta estrategia de instalación se utiliza habitualmente en entornos Kubernetes para desarrolladores en los que la actividad del usuario no es un problema. Se produce un tiempo de inactividad cuando se cierra la instalación antigua, la estrategia de volver a instalar inicia las nuevas instancias de instalación y vuelve a crear los pods y el estado de la aplicación.
Instalaciones azul y verde
La instalación Blue-Green es otra forma de actualizar aplicaciones en Kubernetes pero con una transición rápida. La instalación de Kubernetes Blue-Green presupone la ejecución de dos entornos: la versión antigua (azul) y la versión nueva (verde). Ambos se instalan «uno al lado del otro» o en paralelo. Una vez que se prueba la nueva versión y se confirma su correcto funcionamiento (funciona según lo previsto), se sustituye la etiqueta de la versión actualizando el selector de servicios. Esta acción se realiza para un objeto Servicio Kubernetes que está realizando el equilibrio de carga en un clúster. Después de eso, el tráfico pasa inmediatamente a la nueva versión.
La estrategia de instalación de Kubernetes Blue-Green permite a los administradores realizar una rápida implantación sin los problemas causados por las diferentes versiones al realizar la transición entre ellas. Conserve en mente que la utilización de recursos es más alta porque dos ambientes están corriendo en paralelo por un cierto periodo.
Instalaciones de Canary
La instalación canaria de Kubernetes presupone el enrutamiento de sólo un pequeño grupo de usuarios a la nueva versión de una aplicación en contenedor. La nueva versión se ejecuta en un subconjunto más pequeño de pods que la versión anterior que se ha estado ejecutando hasta ese momento. El objetivo principal de las instalaciones canarias es probar las funciones de las nuevas versiones de las aplicaciones en un entorno de producción. Si faltan errores en la nueva versión, los administradores la amplían y la versión anterior se sustituye en el orden correspondiente.
Si algo va mal después de la instalación de la nueva versión para un pequeño grupo de usuarios, los administradores pueden revertir las instalaciones de canary a la versión anterior. La ventaja es la posibilidad de probar las nuevas funciones en un grupo reducido de usuarios sin riesgo de que repercutan negativamente en el funcionamiento general del sistema.
Volver a instalar Kubernetes
Cuando se utiliza Recreate Deployment, todos los pods se terminan y se sustituyen por la nueva versión. Esta estrategia puede utilizarse cuando las versiones antigua y nueva no pueden ejecutarse simultáneamente. El tiempo de inactividad depende del tiempo necesario para cerrar la aplicación antigua e iniciar la nueva en contenedores. Al finalizar, el estado de la aplicación se renueva por completo.
Ampliación y gestión
La ampliación y gestión de las instalaciones de Kubernetes son cruciales para garantizar que sus aplicaciones en contenedores puedan funcionar con cargas de trabajo variables y mantener una alta disponibilidad. Kubernetes proporciona mecanismos sólidos para la ampliación tanto manual como automatizada, así como herramientas para gestionar las ampliaciones de forma eficiente.
Ampliación manual
La ampliación manual se utiliza para ajustar manualmente el número de réplicas (instancias) de su aplicación mediante la herramienta de línea de comandos kubectl.
- Ampliación:
kubectl scale instalación-nombre–replicas=10
Esta orden aumenta a 10 el número de réplicas de mi instalación.
- Ampliación:
kubectl scale instalación-nombre–replicas=2
Esta orden reduce el número de réplicas de mi instalación a 2.
Autoescalador horizontal de cápsulas (HPA)
El Autoescalador Horizontal de Pods (HPA) ajusta automáticamente el número de réplicas de pods en función de la utilización de CPU observada u otras métricas seleccionadas.
- El comando para crear un HPA es:
kubectl autoscale deployment deployment-name –cpu-percent=50–min=2–max=10
Este comando instala un HPA para nombre-despliegue para mantener la utilización de CPU en torno al 50%, con una ampliación entre 2 y 10 réplicas.
- La configuración HPA en YAML es una forma más avanzada. A continuación se explica un ejemplo de configuración de instalación YAML para el autoescalado horizontal.
apiVersion: autoscaling/v1
tipo: HorizontalPodAutoscaler
metadatos:
Nombre: deployment-hpa-name
espec:
scaleTargetRef:
apiVersion: apps/v1
tipo: Instalación
Nombre: Nombre-del-despliegue
minReplicas: 2
maxReplicas: 10
porcentajeUtilizaciónCPobjetivo: 50
Aplicar la configuración YAML con:
ubectl aplicar -f hpa.yaml
Autoescalador vertical (VPA)
El Vertical Pod Autoscaler (VPA) ajusta automáticamente las solicitudes de recursos y los límites de los pods para que coincidan con el uso real. La configuración VPA en YAML es la siguiente:
apiVersion: autoscaling.k8s.io/v1
tipo: VerticalPodAutoscaler
metadatos:
Nombre: deployment-vpa-name
espec:
targetRef:
apiVersion: «apps/v1»
tipo: Instalación
Nombre: Nombre-del-despliegue
updatePolicy:
updateMode: «Auto»
Para aplicar la configuración YAML, utilice el comando:
kubectl apply -f vpa.yaml
Prácticas recomendadas para la instalación de Kubernetes
La configuración correcta de las implantaciones de Kubernetes garantiza un entorno satisfactorio y fiable para ejecutar aplicaciones en contenedores. Una configuración incorrecta o una estrategia de gestión de la instalación incorrecta pueden provocar tiempos de inactividad, pérdida de datos, entre otros problemas. Las prácticas recomendadas para las instalaciones de Kubernetes ayudan a garantizar que sus aplicaciones sean resilientes, escalables y mantenibles.
- Utilice la configuración declarativa. Almacene sus configuraciones de Kubernetes en archivos con control de versiones en formato YAML/JSON. Esto facilita la gestión de los cambios y su reversión en caso necesario. Utilice kubectl apply -f para aplicar estas configuraciones, ya que permite realizar operaciones idempotentes, garantizando que el estado del clúster coincide con los archivos de configuración.
- Utilizar el aislamiento del espacio de nombres. Utilice espacios de nombres para aislar lógicamente los distintos entornos (por ejemplo, desarrollo, montaje, producción) y equipos. Esto ayuda a gestionar los recursos y los permisos de forma más eficaz.
- Solicitudes y límites de recursos. Defina solicitudes y límites de recursos para sus pods con el fin de garantizar que disponen de los recursos necesarios y evitar la contención de recursos.
- Sondas de actividad y disponibilidad. Configure las sondas de vida para reiniciar los contenedores que no funcionen correctamente y las sondas de disponibilidad para controlar el tráfico a los contenedores.
- Utilice etiquetas y selectores para organizar y seleccionar recursos. Las etiquetas pueden utilizarse para agrupar recursos por aplicación, entorno, versión, etc.
- Utilizar ConfigMaps y secretos. Almacene datos de configuración no sensibles en ConfigMaps. Almacene datos confidenciales, como contraseñas y claves API, en Secretos.
- Supervise y registre su entorno. Implemente la supervisión mediante herramientas como Grafana y Prometheus para comprobar el rendimiento y la salud de sus aplicaciones en contenedores. Utilice soluciones de registro centralizadas como la pila ELK (Elasticsearch, Logstash, Kibana) o Fluentd para recopilar y analizar registros.
- Siga las prácticas recomendadas en materia de seguridad. Implemente políticas de seguridad de los pods para hacer cumplir las normas de seguridad en sus pods. Utilice políticas de red en las instalaciones de Kubernetes para controlar el tráfico entre pods.
- Prepara los backups y la recuperación ante desastres. Implemente backups regulares de sus recursos Kubernetes y datos persistentes. Planifique y pruebe estrategias de recuperación ante desastres para garantizar que las aplicaciones y los servicios puedan restablecerse rápidamente en caso de fallo.
Conclusión
Las instalaciones de Kubernetes desempeñan un rol crucial en la gestión del ciclo de vida de las aplicaciones dentro de un clúster Kubernetes. Proporcionan un enfoque declarativo para definir el estado deseado de las aplicaciones, incluido el número de réplicas, las imágenes contenedoras y los ajustes de configuración. Mediante la orquestación de ReplicaSets, las instalaciones garantizan que se ejecuta el número especificado de Pods y gestionan automáticamente las actualizaciones y reversiones de forma controlada y sin problemas. Esto se traduce en una mayor escalabilidad, resiliencia y facilidad de gestión de las aplicaciones, lo que convierte a las instalaciones de Kubernetes en una herramienta esencial para la implantación y las operaciones de las aplicaciones modernas.