Instalaciones de Kubernetes: una guía completa
Kubernetes, una de las plataformas favoritas de la comunidad de desarrolladores, es una herramienta muy utilizada para ejecutar contenedores de Docker en clústeres. Esta potente plataforma ofrece diferentes métodos para instalar y actualizar aplicaciones que se ejecutan en contenedores, lo que proporciona un alto nivel de flexibilidad para distintos escenarios. En Kubernetes, los contenedores se ejecutan en pods, y su instalación se define mediante los «Deployments» de Kubernetes. Esta entrada del blog trata sobre los «Deployments» de Kubernetes, sus tipos, las estrategias de instalación y las 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 dentro de los clústeres. Proporciona actualizaciones a las aplicaciones, garantizando que el número necesario de pods idénticos esté ejecutándose y disponible en todo momento. También ofrece actualizaciones declarativas para los pods y los ReplicaSets. Las instalaciones son una función clave de Kubernetes para automatizar la ampliación, las actualizaciones progresivas y las reversiones.
Una «instalación» es un objeto de Kubernetes que especifica el estado deseado para los pods, y crea y gestiona «ReplicaSets» para garantizar que se mantenga dicho estado. Un «ReplicaSet» gestiona los pods directamente, incluyendo su estado y número. La «instalación» indica a Kubernetes cómo modificar o crear las instancias de pod que contienen los contenedores con las aplicaciones. El estado de la instalación de un pod se describe en un manifiesto.
Los administradores pueden realizar la ampliación del número de pods de réplica de forma eficiente, realizar el despliegue de código de aplicación actualizado con un alto nivel de control y revertir a versiones anteriores de las instalaciones si es necesario. Para la gestión de 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 asociado a dicho pod. Un ReplicaSet, a su vez, tiene un puntero a la instalación que lo creó.
Fundamentos de las instalaciones de Kubernetes
Las instalaciones de Kubernetes se han desarrollado para instalar y ampliar aplicaciones en contenedores en clústeres. Las instalaciones proporcionan una forma declarativa de definir el estado deseado de la aplicación y automatizar el proceso de alcanzar y mantener dicho estado. Los conceptos y componentes fundamentales relacionados con las «instalaciones» de Kubernetes son:
Desired state. 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 van a utilizar y los recursos asignados a cada pod.Declarative configuration. 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 directamente qué hay que hacer, el enfoque declarativo de Kubernetes les permite definir el resultado requerido, y Kubernetes lo conseguirá mediante sus mecanismos internos. El controlador de instalaciones de Kubernetes realiza la supervisión del estado de los nodos y los pods. Si se producen cambios en tiempo real, como un fallo en un pod, este pod puede ser sustituido. Así, Kubernetes realiza la supervisión del estado del clúster en tiempo real y realiza ajustes para que coincida con el estado deseado.ReplicaSet. Un Deployment 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 garantizar que las réplicas de pod especificadas estén ejecutándose en todo momento.Rolling updates. Los Deployments admiten actualizaciones progresivas, lo que permite actualizar la aplicación sin tiempo de inactividad. Kubernetes sustituye gradualmente los pods antiguos por otros nuevos, lo que ayuda a garantizar que la aplicación en contenedores permanezca disponible durante el proceso de actualización de la instalación.Rollback. Si surge algún problema durante una actualización en Kubernetes, puede revertir a una versión anterior de la instalación, restaurando así la aplicación a un estado conocido y correcto.
Configuración declarativa
En Kubernetes, un enfoque declarativo significa que se especifica el estado deseado del sistema, y Kubernetes lleva a cabo las acciones necesarias para alcanzar y mantener ese estado. Se 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.
El enfoque declarativo suele ser el preferido en Kubernetes, ya que permite mantener la consistencia del estado deseado, facilita la automatización y favorece una mejor colaboración y un mejor control de versiones. El enfoque imperativo puede resultar útil para tareas rápidas y puntuales, pero es menos adecuado para la gestión de instalaciones de aplicaciones complejas y a largo plazo.
Cómo funcionan conjuntamente los Deployments, los Pods y los ReplicaSets
En Kubernetes, los Deployments, los Pods y los ReplicaSets son componentes estrechamente relacionados que gestionan de forma conjunta la instalación, la ampliación y el ciclo de vida de las aplicaciones. Es importante comprender la relación entre ellos y saber cómo funcionan conjuntamente en Kubernetes para una configuración adecuada.
- Un
Podes el objeto más sencillo y pequeño de un clúster de 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 recursos compartidos de almacenamiento y el mismo 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
ReplicaSetgarantiza que, en un momento dado, se estén ejecutando un número específico de Pods idénticos. 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, lo que garantiza que se mantengan los pods correctos. Aunque es posible crear y gestionar directamente los ReplicaSets, normalmente son gestionados por Deployments, que proporcionan funciones adicionales. - Un
Deploymentes un objeto de Kubernetes de nivel superior que gestiona los ReplicaSets y proporciona actualizaciones declarativas a las aplicaciones. Las instalaciones permiten a los administradores definir el estado deseado de la aplicación y otros ajustes, tal y como se ha explicado anteriormente.
Al crear o actualizar una instalación, esta crea automáticamente un nuevo ReplicaSet para gestionar los Pods de acuerdo con las especificaciones definidas. Cada vez que se actualiza un Deployment, se crea un nuevo ReplicaSet para gestionar la nueva versión de los Pods, mientras que el ReplicaSet anterior permanece activo hasta que los nuevos Pods se hayan implementado correctamente. Esto garantiza que las actualizaciones se implementen de forma controlada, manteniendo la disponibilidad de la aplicación.
El Deployment gestiona el ciclo de vida de los Pods de forma indirecta a través de sus ReplicaSets. Al definir el estado deseado en el Deployment, se especifican las características y el número de Pods que se desean ejecutar. A continuación, la instalación garantiza este estado gestionando los ReplicaSets adecuados, que a su vez gestionan los Pods.
Así, los Pods son las unidades de ejecución que ejecutan los contenedores, los ReplicaSets garantizan que se ejecute el número necesario de Pods y las instalaciones proporcionan una gestión declarativa y actualizaciones para las aplicaciones mediante el control de los ReplicaSets. Esta estructura jerárquica garantiza que sus aplicaciones sean ampliables, con resiliencia y fáciles de gestionar. Las instalaciones abstraen las complejidades de la gestión directa de los ReplicaSets y los pods, ofreciendo una forma potente de gestionar las actualizaciones y la ampliación de las aplicaciones.
Detalles de la configuración de las instalaciones
El uso de YAML para la configuración de las instalaciones en Kubernetes es una práctica habitual debido a su legibilidad y simplicidad. Kubernetes admite tanto el formato YAML como el JSON para los archivos de configuración, pero YAML se utiliza más ampliamente debido a su sintaxis fácil de entender para los humanos.
YAML (YAML Ain’t Markup Language) es un estándar de serialización de datos que resulta fácil de leer y de escribir. Se utiliza habitualmente para archivos de configuración y para el intercambio de datos entre lenguajes con estructuras de datos diferentes. En Kubernetes, YAML se utiliza para definir el estado deseado de diversos objetos, como instalaciones, servicios, pods y otros. Componentes clave de un archivo de instalación YAML:
apiVersionse utiliza para especificar la versión de la API (por ejemplo, apps/v1) del objeto de Kubernetes.kindespecifica el tipo de objeto de Kubernetes (por ejemplo, Deployment).metadatacontenga metadatos sobre el objeto, como su nombre y sus etiquetas.spec(especificación) se utiliza para definir el estado deseado del objeto de Kubernetes, incluyendo:replicasespecifica el número de réplicas de pod que se deben mantener.selectorespecifica cómo identificar los pods gestionados por la instalación.templatedefine la plantilla del pod, incluyendo metadatos y especificaciones para los pods.containersenumera los contenedores dentro del pod, incluyendo:name: el nombre del contenedorimage: la imagen de Docker que se va a utilizarports: los puertos que se van a exponer
Las diferencias entre YAML y JSON en cuanto a la sintaxis de configuración de una instalación de Kubernetes son:
- YAML es más legible para los humanos, ya que utiliza sangría y pares clave-valor sin llaves ni corchetes.
- 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 en YAML
A continuación, puedes ver un ejemplo de instalación de Kubernetes en formato YAML con detalles para pods y contenedores.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-name
spec:
replicas: 3
selector:
matchLabels:
app: app-name
template:
metadata:
labels:
app: app-name
spec:
containers:
- name: container-name
image: image-name:1.0
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
env:
- name: MY_ENV_VAR
value: "some-value"
volumeMounts:
- mountPath: "/path/volume"
name: volume-name
volumes:
- name: volume-name
persistentVolumeClaim:
claimName: pvc-name
Vamos a explicar cada sección en detalle para que quede más claro. Al configurar estas secciones, puedes definir una instalación de aplicación robusta y ampliable en Kubernetes, asegurándote de que tus pods y contenedores se configuren según tus requisitos.
Secciones clave de configuración
1. Metadatos
metadata:
name: deployment-name
Donde:
name: el nombre de la instalación
2. Spec (Especificación de la instalación)
spec:
replicas: 3
selector:
matchLabels:
app: app-name
Donde:
replicas: el número de réplicas de pod que se deben mantener
selector: define cómo identificar los pods gestionados por la instalación mediante etiquetas
3. Plantilla de pod (Especificación del pod)
template:
metadata:
labels:
app: app-name
spec:
containers:
- name: container-name
image: image-name:1.0
Donde: metadata: Etiquetas para identificar los pods
spec: Configuración de los pods y sus contenedores
Configuración de contenedores
En esta sección, puedes ver las secciones YAML de las instalaciones para configurar los contenedores.
1. Imagen del contenedor
image: image-name:1.0
Donde:
image: la imagen del contenedor que se va a utilizar. Puede incluir una etiqueta (por ejemplo, 1.0) para especificar la versión.
2. Puertos.
ports:
- containerPort: 80
Donde:
containerPort: es el puerto en el que el contenedor escuchará el tráfico
3. Solicitudes y requisitos de recursos
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
Donde:
requests: son los requisitos mínimos necesarios
limits: son los requisitos máximos que puede utilizar el contenedor
4. Variables de entorno
env:
- name: MY_ENV_VAR
value: "some-value"
Donde:
env: define las variables de entorno para el contenedor
5. Montaje de volúmenes
volumeMounts:
- mountPath: "/path/volume"
name: volume-name
Donde:
volumeMounts: especifica los volúmenes que se montarán dentro del contenedor
mountPath: es 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.
volumes:
- name: volume-name
persistentVolumeClaim:
claimName: pvc-name
Donde:
volumes: define los volúmenes disponibles para su montaje
name: el nombre del volumen
persistentVolumeClaim: especifica un PersistentVolumeClaim (PVC) que se utilizará para el volumen
Configuraciones avanzadas
1. Pruebas de actividad y disponibilidad
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Donde:
livenessProbe: comprueba si el contenedor está activo
readinessProbe: se utiliza para comprobar si el contenedor actual está listo para aceptar tráfico
2. Comando y argumentos
command: ["my-command"]
args: ["arg1", "arg2"]
Donde:
command: sustituye el punto de entrada predeterminado del contenedor
args: especifica los argumentos del comando
3. ConfigMaps y secretos
envFrom:
- configMapRef:
name: my-configmap
- secretRef:
name: my-secret
Donde:
envFrom: importa variables de entorno desde un ConfigMap o un secreto
La estrategia de instalación de Kubernetes
Existen múltiples estrategias (tipos) de instalación de Kubernetes, y puedes seleccionar la más eficaz para tu escenario actual. Las aplicaciones empresariales tienen distintos requisitos en cuanto a tiempo de actividad y disponibilidad. Seleccionar la estrategia adecuada te permite evitar el tiempo de inactividad y la interrupción del servicio, así como utilizar los recursos de forma eficaz. A continuación, puedes ver los tipos de instalación de Kubernetes más comunes.
Actualizaciones progresivas y reversiones
Una instalación con actualización progresiva supone la migración de una versión de la aplicación a otra, la más reciente, siguiendo el orden definido. Se pone en marcha un nuevo ReplicaSet con la nueva versión de la aplicación. Las réplicas de la versión anterior se cierran. Como resultado, los pods de la versión anterior se sustituyen por los nuevos. La actualización progresiva permite una transición fluida de las versiones antiguas a las nuevas, pero la operación requiere cierto tiempo para completarse.
Recreación de la instalación
Los pods que se están ejecutando actualmente se cierran y, a continuación, se vuelven a crear con una nueva versión. Esta estrategia de instalación se utiliza habitualmente en entornos de Kubernetes para desarrolladores, donde la actividad de los usuarios no supone un problema. Se produce un tiempo de inactividad cuando se cierra la instalación antigua; la estrategia de recreación de la instalación inicia las nuevas instancias de instalación y vuelve a crear los pods y el estado de la aplicación.
Implementaciones azul-verde
La instalación azul-verde es otra forma de actualizar aplicaciones en Kubernetes, pero con una transición rápida. La instalación azul-verde de Kubernetes supone la ejecución de dos entornos: la versión antigua (azul) y la nueva (verde). Ambas se instalan «en paralelo». Una vez que se ha probado la nueva versión y se ha confirmado su correcto funcionamiento (funciona según lo previsto), se sustituye la etiqueta de versión actualizando el selector de servicio. Esta acción se realiza en un objeto de servicio de Kubernetes que lleva a cabo el equilibrio de carga en un clúster. Después, el tráfico se redirige inmediatamente a la nueva versión.
La estrategia de despliegue «azul-verde» de Kubernetes permite a los administradores realizar implementaciones rápidas sin los problemas que suelen surgir al realizar la transición entre versiones diferentes. Hay que tener en cuenta que la utilización de recursos es mayor, ya que dos entornos se ejecutan en paralelo durante un periodo determinado.
Despliegues «canario»
El despliegue «canario» de Kubernetes consiste en redirigir únicamente a un pequeño grupo de usuarios a la nueva versión de una aplicación en contenedores. La nueva versión se ejecuta en un subconjunto más reducido de pods que la versión anterior que se ha estado ejecutando hasta ese momento. El objetivo principal de las instalaciones «canary» es probar las funciones de las nuevas versiones de la aplicación en un entorno de producción. Si no se detectan errores en la nueva versión, los administradores amplían su escala y la versión anterior se sustituye siguiendo el orden adecuado.
Si surge algún problema después de la instalación de la nueva versión para un pequeño grupo de usuarios, los administradores pueden revertir las instalaciones «canary» a la versión anterior. La ventaja es la posibilidad de probar las nuevas funciones con un grupo reducido de usuarios sin correr el riesgo de que ello afecte negativamente al funcionamiento general del sistema.
Kubernetes: «Recreate Deployment»
Al utilizar la opción «Recreate Deployment», todos los pods se cierran y se sustituyen por la nueva versión. Esta estrategia puede utilizarse cuando la versión antigua y la 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. Una vez finalizado el proceso, el estado de la aplicación queda completamente renovado.
Escalado y gestión
El escalado y la gestión de las instalaciones de Kubernetes son fundamentales para garantizar que tus aplicaciones en contenedores puedan funcionar con cargas de trabajo variables y mantener una alta disponibilidad. Kubernetes proporciona mecanismos robustos tanto para la ampliación manual como para la automatizada, así como herramientas para gestionar las instalaciones de forma eficiente.
Escalado manual
El escalado 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 .
- Aumento de la capacidad:
kubectl scale deployment deployment-name --replicas=10Este comando aumenta el número de réplicas de «my-instalación» a 10.
- Reducción de la capacidad:
kubectl scale deployment deployment-name --replicas=2Este comando reduce el número de réplicas de «my-instalación» a 2.
Autoscalador horizontal de pods (HPA)
El autoscalador horizontal de pods (HPA) ajusta automáticamente el número de réplicas de los pods en función de la utilización de la 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=10Este comando configura un HPA para
deployment-namecon el fin de mantener la utilización de la CPU en torno al 50 %, realizando una ampliación entre 2 y 10 réplicas. - La configuración del HPA en YAML es una forma más avanzada. A continuación se explica un ejemplo de configuración de instalación en YAML para el autoescalado horizontal.
apiVersion: autoscaling/v1kind: HorizontalPodAutoscalermetadata:name: deployment-hpa-namespec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: deployment-nameminReplicas: 2maxReplicas: 10targetCPUUtilizationPercentage: 50Aplica la configuración YAML con:
ubectl apply -f hpa.yaml
Autoescalador vertical de pods (VPA)
El autoescalador vertical de pods (VPA) ajusta automáticamente las solicitudes y los límites de recursos de los pods para que se adapten al uso real. La configuración del VPA en YAML es la siguiente:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: deployment-vpa-name
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: deployment-name
updatePolicy:
updateMode: "Auto"
Para aplicar la configuración YAML, utiliza el comando: kubectl apply -f vpa.yaml
Prácticas recomendadas para las instalaciones de Kubernetes
Una configuración correcta de las instalaciones de Kubernetes garantiza un entorno fiable y eficaz para ejecutar aplicaciones en contenedores. Una configuración incorrecta o una estrategia de gestión de instalaciones inadecuada pueden provocar tiempos de inactividad y pérdida de datos, entre otros problemas. Las prácticas recomendadas para las instalaciones de Kubernetes ayudan a garantizar que tus aplicaciones sean resilientes, ampliables y fáciles de mantener.
Use declarative configuration. Almacena tus configuraciones de Kubernetes en archivos con control de versiones en formato YAML/JSON. Esto facilita la gestión de los cambios y la reversión en caso necesario. Utilizakubectl apply -fpara aplicar estas configuraciones, ya que permite operaciones idempotentes, lo que garantiza que el estado del clúster coincida con los archivos de configuración.Use namespace isolation. Utiliza espacios de nombres para aislar lógicamente los diferentes entornos (por ejemplo, desarrollo, preproducción, producción) y equipos. Esto ayuda a gestionar los recursos y los permisos de forma más eficaz.Resource requests and limits. Define las solicitudes y los límites de recursos para tus pods con el fin de garantizar que dispongan de los recursos necesarios y evitar la contienda por los recursos.Liveness and readiness probes. Configura sondas de actividad (liveness probes) para reiniciar los contenedores que no funcionan correctamente y sondas de disponibilidad (readiness probes) para controlar el tráfico hacia los contenedores.Use labels and selectorspara organizar y seleccionar recursos. Las etiquetas (labels) pueden utilizarse para agrupar recursos por aplicación, entorno, versión, etc.Use ConfigMaps and secrets. Almacena los datos de configuración no confidenciales en ConfigMaps. Almacena los datos confidenciales, incluidas las contraseñas y las claves API, en Secrets.Monitor and log your environment. Implementa la supervisión mediante herramientas como Grafana y Prometheus para comprobar el rendimiento y el estado de tus aplicaciones en contenedores. Utiliza soluciones de registro centralizadas como la pila ELK (Elasticsearch, Logstash, Kibana) o Fluentd para recopilar y analizar los registros.Follow security best practices. Implementa políticas de seguridad de pods (Pod Security Policies) para aplicar los estándares de seguridad en tus pods. Utilice políticas de red para las instalaciones de Kubernetes con el fin de controlar el tráfico entre pods.Prepare for backups and disaster recovery. Haga backups periódicos de sus recursos de Kubernetes y de los datos persistentes. Planifique y pruebe estrategias de recuperación ante desastres para garantizar que las aplicaciones y los servicios puedan restaurarse rápidamente en caso de fallo.
Conclusión
Las instalaciones de Kubernetes desempeñan un papel crucial en la gestión del ciclo de vida de las aplicaciones dentro de un clúster de Kubernetes. Ofrecen un enfoque declarativo para definir el estado deseado de las aplicaciones, incluyendo el número de réplicas, las imágenes de contenedor y los ajustes de configuración. Al realizar la orquestación de los ReplicaSets, los Deployments garantizan que se ejecute el número especificado de Pods y gestionan automáticamente las actualizaciones y las reversiones de forma controlada y fluida. Esto se traduce en una mayor ampliabilidad, resiliencia y facilidad de gestión de las aplicaciones, lo que convierte a los Deployments de Kubernetes en una herramienta esencial para el despliegue y las operaciones de las aplicaciones modernas.