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.

Prueba NAKIVO Backup & Replication

Prueba NAKIVO Backup & Replication

Solicita una versión de prueba gratuita para descubrir todas las funciones de protección de datos de la solución. 15 días gratis. Sin limitaciones de funciones ni de capacidad. No es necesario facilitar un número de tarjeta de crédito.

¿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 Pod es 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 ReplicaSet garantiza 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 Deployment es 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:

  • apiVersion se utiliza para especificar la versión de la API (por ejemplo, apps/v1) del objeto de Kubernetes.
  • kind especifica el tipo de objeto de Kubernetes (por ejemplo, Deployment).
  • metadata contenga 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:
    • replicas especifica el número de réplicas de pod que se deben mantener.
    • selector 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 enumera los contenedores dentro del pod, incluyendo:
      • name: el nombre del contenedor
      • image: la imagen de Docker que se va a utilizar
      • ports: 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=10

    Este 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=2

    Este 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.

  1. El comando para crear un HPA es:

    kubectl autoscale deployment deployment-name --cpu-percent=50 --min=2 --max=10

    Este comando configura un HPA para deployment-name con el fin de mantener la utilización de la CPU en torno al 50 %, realizando una ampliación entre 2 y 10 réplicas.

  2. 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/v1

    kind: HorizontalPodAutoscaler

    metadata:

      name: deployment-hpa-name

    spec:

      scaleTargetRef:

        apiVersion: apps/v1

        kind: Deployment

        name: deployment-name

      minReplicas: 2

      maxReplicas: 10

      targetCPUUtilizationPercentage: 50

    Aplica 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. Utiliza kubectl apply -f para 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 selectors para 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.

Prueba NAKIVO Backup & Replication

Prueba NAKIVO Backup & Replication

Solicita una versión de prueba gratuita para descubrir todas las funciones de protección de datos de la solución. 15 días gratis. Sin limitaciones de funciones ni de capacidad. No es necesario facilitar un número de tarjeta de crédito.

Artículos recomendados