Las respuestas que deberías conocer sobre Kubernetes

2024-07-16

¿Qué es Kubernetes?

Kubernetes (también conocido como K8) es una plataforma de código abierto para automatizar la implementación, escalabilidad y operación de aplicaciones en contenedores.

Los componentes de Kubernetes trabajan juntos para proporcionar un entorno robusto para la ejecución de contenedores.

Desarrollado por Google y posteriormente donado a la Cloud Native Computing Foundation (CNCF), Kubernetes se ha convertido en una herramienta esencial en el ámbito de la orquestación de contenedores.

¿Que problemas comunes existian antes de K8?

Hace un tiempo atrás, cuando las empresas comenzaron a contenerizar sus aplicaciones, se vieron desafiados con múltiples problemas:

Las aplicaciones en general contaban con múltiples servicios, cada uno ejecutandose en su propio contenedor, donde coordinar estos contenedores y gestionar sus ciclos de vida se convirtió en una tarea ardua y propensa a errores.

También a medida que las aplicaciones tenían demandas variables, manejar alta o baja demanda de tráfico se volvió un desafío y escalar manualmente los contenedores para satisfacer la demanda era laborioso y poco fiable.

Otra dificultad era la falta de portabilidad de las aplicaciones entre diferentes entornos. Migrar una aplicación de un entorno on-premise a una nube pública, o entre diferentes proveedores de nube, era una tarea complicada y costosa.

A su vez al trabajar de forma manual, las fallas en contenedores y nodos causaban tiempos de inactividad significativos, afectando la disponibilidad de la aplicación.

Qué solventa Kubernetes

  • Orquestación de Contenedores: Kubernetes facilita la gestión y la orquestación de contenedores, como los proporcionados por Docker.
  • Escalado Automático: Kubernetes ofrece la capacidad de escalar automáticamente la cantidad de instancias de aplicaciones basadas en la carga o la demanda. Puede realizar el escalado horizontal (aumentar o disminuir el número de réplicas) para adaptarse a cambios en la demanda.
  • Gestión de Recursos: Proporciona una gestión eficiente de los recursos del clúster, asignando automáticamente recursos (CPU, memoria, almacenamiento) a las aplicaciones según las necesidades.
  • Servicios y Descubrimiento de Servicios: Facilita la exposición y la descubrimiento de servicios mediante la definición de servicios, que actúan como puntos de acceso para las aplicaciones.
  • Despliegue Rollouts y Rollbacks: Permite realizar implementaciones y actualizaciones de manera controlada mediante estrategias de rollouts y rollbacks. Esto asegura que las actualizaciones sean graduales y reversibles en caso de problemas.
  • Gestión de Configuración y Secretos: Ofrece la capacidad de gestionar configuraciones y secretos de manera segura, separando la configuración del código y permitiendo la actualización de configuraciones sin necesidad de redespliegue.
  • Monitoreo y Registro: Integra funcionalidades para monitorear la salud de las aplicaciones, registrar eventos y proporcionar información valiosa para la solución de problemas.
  • Gestión de Estado: Aunque es conocido por su capacidad para manejar aplicaciones sin estado, Kubernetes también ofrece opciones para gestionar aplicaciones con estado mediante volúmenes persistentes y controladores de almacenamiento.
  • Extensibilidad y Ecosistema: Kubernetes es altamente extensible y cuenta con un rico ecosistema de herramientas, complementos y servicios que amplían sus funcionalidades.

 

¿Cómo funciona Kubernetes?

Un clúster en Kubernetes (K8s) posee un conjunto de nodos que ejecutan aplicaciones en contenedores.

Estos nodos están gestionados por un nodo maestro, y juntos forman la base sobre la que se construyen y operan todas las aplicaciones en contenedores en Kubernetes.

A continuación se presentan en detalle los componentes, el funcionamiento y las características de los clústeres en Kubernetes:

Nodo Master: El maestro es el componente central de Kubernetes y se encarga de la toma de decisiones en el clúster.

El maestro gestiona y coordina las operaciones en los nodos, asegurándose de que el estado actual coincida con el estado deseado definido en los archivos de configuración. Incluye varios subcomponentes:

  • API Server (kube-apiserver): Expone la API de Kubernetes. Es el punto de entrada para todas las operaciones en el clúster.
  • etcd: Almacén de datos consistente y altamente disponible utilizado para almacenar la configuración del clúster y el estado.
  • Controller Manager (kube-controller-manager): Implementa controladores que gestionan el estado del clúster y responden a los cambios en la topología del clúster.
  • Scheduler (kube-scheduler): Asigna nodos a los pods según las restricciones y requisitos de recursos.

Nodos (Nodes): Un clúster de Kubernetes consta de uno o más nodos, que son las máquinas físicas o virtuales que forman parte del clúster. Cada nodo ejecuta los siguientes componentes:

  • Kubelet: Agente que comunica con el maestro y gestiona los contenedores en el nodo.
  • Kube-proxy: Mantiene las reglas de red en los nodos y realiza el balanceo de carga para los servicios del clúster.
  • Container Runtime: Software que ejecuta y gestiona los contenedores, como Docker o containerd.

 

Pods: Un pod es la unidad más pequeña en Kubernetes y representa un grupo de uno o más contenedores que comparten el mismo espacio de red y almacenamiento. Los contenedores en un pod se ejecutan en el mismo nodo y comparten recursos.

Grafico de como funciona Kubernetes

¿Qué son los objetos en K8?

En Kubernetes, los "objetos" son representaciones declarativas de los recursos que deseas crear o gestionar en el clúster.

Cada objeto describe un estado deseado para el clúster y especifica los parámetros necesarios para alcanzar ese estado.

Los objetos son fundamentales para definir, configurar y operar aplicaciones en Kubernetes.

Los objetos que tiene Kubernetes son los siguientes:

Pod: La unidad más pequeña que posee  Kubernetes. Representa un conjunto de contenedores que comparten almacenamiento y red. Pueden ejecutar una aplicación o un conjunto de microservicios.

Service: Define un conjunto lógico de pods y una política para acceder a ellos. Permite la exposición de servicios y la comunicación entre componentes de la aplicación dentro y fuera del clúster.

ReplicaSet: Garantiza que un número específico de réplicas de un pod esté siempre en ejecución. Se utiliza para mantener la disponibilidad y escalabilidad de las aplicaciones.

Deployment: Proporciona actualizaciones declarativas para aplicaciones y facilita el escalado y la actualización. Gestiona réplicas y actualizaciones de manera controlada y sin tiempo de inactividad.

ConfigMap: Almacena configuraciones no confidenciales en el clúster, como variables de entorno, archivos de configuración o datos de configuración.

Secret: Almacena información confidencial, como contraseñas o claves API. Los datos en los secretos se almacenan de forma segura en el clúster.

Ingress: Define reglas para el enrutamiento del tráfico HTTP y HTTPS a servicios basados en la URL solicitada. Facilita la exposición de servicios web y gestiona las rutas de acceso.

Namespace: Permite dividir un clúster en múltiples clústeres virtuales. Proporciona aislamiento y organización, permitiendo que diferentes equipos o proyectos coexistan en el mismo clúster.

PersistentVolume y PersistentVolumeClaim: Permiten la gestión de almacenamiento persistente en el clúster. Los PersistentVolumes representan el almacenamiento físico, mientras que los PersistentVolumeClaims son solicitudes de almacenamiento realizado por los pods.

Ejemplos de Yamls de Objetos

Cuando un programador trabaja con Kubernetes, puede configurar diversos aspectos de sus aplicaciones y entornos a través de archivos YAML. Estos archivos son la forma principal de definir y describir los recursos en Kubernetes.

Aquí hay algunos ejemplos de cómo configurar mediante archivos YAML en un entorno de Kubernetes:

Pods: Se puede  especificar los contenedores que deben ejecutarse juntos en un pod, junto con detalles como volúmenes y configuraciones de red:

apiVersion: v1
kind: Pod
metadata:
  name: mi-pod
spec:
  containers:
  - name: mi-contenedor
    image: mi-imagen:tag

Servicios: Se puede  configurar un servicio para exponer un conjunto de pods y definir el tipo de servicio (ClusterIP, NodePort, LoadBalancer).

apiVersion: v1
kind: Service
metadata:
  name: mi-servicio
spec:
  selector:
    app: mi-aplicacion
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

Deployment(Despligues): Se puede configurar un controlador de despliegue para gestionar la implementación y escalado de aplicaciones.

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: mi-despliegue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mi-aplicacion
  template:
    metadata:
      labels:
        app: mi-aplicacion
    spec:
      containers:
      - name: mi-contenedor
        image: mi-imagen:tag

Volúmenes Persistentes: se puede configurar el almacenamiento persistente para que los datos sobrevivan a la vida de un pod.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mi-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi 

Secretos: se puede configurar secretos para almacenar información sensible como contraseñas o claves API.

apiVersion: v1
kind: Secret
metadata:
  name: mi-secreto
type: Opaque
data:
  username: <secret-username>
  password: <secret-password> 

Ingress: se pueden configurar reglas de tráfico y rutas para exponer servicios HTTP y HTTPS.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mi-ingress
spec:
  rules:
  - host: mi-aplicacion.com
    http:
      paths:
      - path: /ruta
        pathType: Prefix
        backend:
          service:
            name: mi-servicio
            port:
              number: 80

Namespaces

En Kubernetes, un Namespace es una forma de dividir un clúster en varios clústeres virtuales. Se utiliza para crear ámbitos de aislamiento y segmentación dentro de un mismo clúster. Cada Namespace proporciona su propio entorno de recursos y nomenclatura, lo que permite que diferentes equipos o proyectos compartan un clúster de Kubernetes sin interferir entre sí.

A continuación, se detallan algunas de las funciones y usos de los Namespaces:

Aislamiento y Organización: Los Namespaces permiten dividir un clúster en entornos virtuales, proporcionando aislamiento entre los recursos de diferentes equipos, proyectos o aplicaciones. Esto facilita la organización y gestión de recursos en un clúster compartido.

Evitar Conflictos de Nombres: Los Namespaces evitan conflictos de nombres al permitir que recursos con los mismos nombres coexistan en diferentes Namespaces. Por ejemplo, puedes tener un servicio llamado "mi-servicio" en dos Namespaces diferentes sin conflictos.

Control de Acceso (RBAC): Los Namespaces pueden utilizarse en conjunto con el control de acceso basado en roles (RBAC) para definir políticas de acceso a recursos específicos en un Namespace. Esto permite restringir o permitir el acceso a recursos según las necesidades del equipo que utiliza el Namespace.

Gestión de Recursos: Cada Namespace tiene su propio conjunto de recursos, como pods, servicios, volúmenes persistentes, etc. Esto permite asignar cuotas y límites específicos para los recursos dentro de un Namespace, asegurando un uso equitativo de los recursos del clúster.

Despliegues Multitenancy: Los Namespaces facilitan la implementación de entornos multitenancy, donde múltiples usuarios o equipos comparten un clúster de Kubernetes de manera eficiente y segura.

Facilita la Gestión: Para equipos que gestionan múltiples aplicaciones o entornos, el uso de Namespaces facilita la identificación y el acceso a los recursos específicos de cada aplicación o proyecto.


Sobre Mentores Tech

En Mentores Tech, ofrecemos una variedad de servicios de capacitación y asesorías personalizadas diseñadas para ayudarte a alcanzar tus objetivos profesionales. Desde cursos intensivos hasta mentorías uno a uno, te proporcionamos las herramientas que necesitas para tener éxito en el mundo de la tecnología.

Además, en nuestra página web www.mentorestech.com encontrarás una amplia gama de recursos gratuitos que te ayudarán a seguir aprendiendo y creciendo. ¡Visítanos y descubre cómo podemos ayudarte a conseguir el trabajo de tus sueños en tecnología!

Últimas publicaciones

Red Flags en tu trabajo y como saber cuando debes irte

02/09/2024

Ver articulo

Herramientas SAST que todo Developer debería conocer

26/08/2024

Ver articulo

¿Por qué es importante trackear tus logros en tu trabajo?

20/08/2024

Ver articulo
Whatsapp Mentores Tech