Skip to content

Licea11/kubernetes

Repository files navigation

Arquitectura de Alta Disponibilidad de Kubernetes

Descripción Técnica

Este documento describe la arquitectura técnica, ventajas y mejoras de seguridad implementadas en nuestra solución de alta disponibilidad de Kubernetes. Esta implementación proporciona una plataforma robusta, escalable y resiliente.

Aspectos Destacados de la Arquitectura

Nuestra arquitectura emplea un diseño multi-master verdadero con los siguientes componentes clave:

  • Plano de Control Multi-Master: Tres nodos dedicados al plano de control con estado sincronizado
  • Balanceo de Carga HAProxy: Enrutamiento TCP y HTTP de alto rendimiento con manejo avanzado de conexiones
  • Runtime Containerd: Runtime de contenedores optimizado para compatibilidad con Kubernetes
  • Cilium CNI: Red mejorada con eBPF para mayor seguridad y rendimiento
  • MetalLB: Balanceo de carga para bare-metal para exposición de servicios
  • Istio Service Mesh: Gestión avanzada de tráfico, seguridad y observabilidad

Arquitectura de Red Avanzada

  1. Cilium CNI con eBPF: Nuestra implementación aprovecha las capacidades eBPF de Cilium que proporciona:

    • Aplicación de políticas de red a nivel de kernel
    • Enrutamiento directo de servicios sin la sobrecarga de kube-proxy
    • Observabilidad avanzada con registros de flujo y métricas
    • Latencia reducida a través de rutas de paquetes optimizadas
  2. Optimización de HAProxy:

    • Configurado para más de 1M de conexiones concurrentes
    • Ajuste avanzado de búferes (búferes de 32KB)
    • Procesamiento multi-hilo (32 hilos de trabajo)
    • Monitoreo inteligente de salud del backend con intervalos de 3 segundos
    • Optimización de persistencia de sesión con enrutamiento basado en origen
  3. Mejoras de Rendimiento TCP: La implementación incluye optimizaciones TCP a nivel de kernel:

    • Ventana de recepción TCP aumentada (16MB)
    • Modo TCP de baja latencia habilitado
    • Backlog SYN optimizado (262,144 vs 128 en despliegues típicos de 1.28)
    • Expansión de la tabla de seguimiento de conexiones para cargas de trabajo de alta densidad

Avances en Seguridad

  1. Optimizaciones de Seguridad de Containerd:

    • Imagen sandbox correctamente configurada (registry.k8s.io/pause:3.9)
    • Integración de SystemdCgroup para mejor aislamiento de recursos
    • Perfiles seccomp mejorados con filtrado de syscall compatible con
  2. Autenticación y Autorización Modernas:

    • RBAC con adecuada separación de responsabilidades
    • Soporte para autenticación basada en tokens con validación mejorada
    • Capacidades de rotación de certificados
  3. Mejoras de Seguridad de Red:

    • Las políticas de red de Cilium proporcionan microsegmentación sin la sobrecarga de iptables
    • Cifrado transparente para comunicación pod-a-pod
    • Políticas de seguridad basadas en DNS

Eficiencia de Recursos

La arquitectura está diseñada para una utilización óptima de recursos:

  1. Componentes del Plano de Control Dimensionados Correctamente:

    • Asignación cuidadosa de CPU/memoria para kube-apiserver
    • Configuración optimizada de recursos de etcd para mejor rendimiento
    • Consumo reducido de CPU del planificador a través de algoritmos mejorados
  2. Distribución Inteligente de Carga:

    • Agrupación de conexiones HAProxy reduce la carga del servidor API
    • Distribución equilibrada de componentes del plano de control entre maestros
    • Caché optimizada para reducir la presión sobre etcd
  3. Eficiencia Operativa:

    • Gestión simplificada de certificados
    • Capacidades mejoradas de registro y diagnóstico
    • Técnicas de despliegue auto-reparables

Arquitectura de Implementación

Los siguientes diagramas ilustran los componentes arquitectónicos clave:

Arquitectura del Plano de Control

flowchart TD
    subgraph subGraph0["Control-plane masters"]
        D["Master 1<hr><br>10.1.1.101<br>kube-apiserver<br>etcd líder<br>controller-mgr<br>scheduler<br>HAProxy local"]
        E["Master 2<hr><br>10.1.1.102<br>kube-apiserver<br>etcd seguidor<br>controller-mgr<br>scheduler<br>HAProxy local"]
        F["Master 3<hr><br>10.1.1.103<br>kube-apiserver<br>etcd seguidor<br>controller-mgr<br>scheduler<br>HAProxy local"]
    end
    A["Cliente / kubectl"] -- TCP :6443 --> B["IP Virtual 10.1.1.201"]
    B --> C["HAProxy VM"]
    C -- "round-robin" --> D & E & F
Loading

Arquitectura HAProxy

flowchart TD
    subgraph clients["Clientes"]
        client1["Cliente API / kubectl<hr><br>Aplicaciones Kubernetes<br>Solicitudes administrativas"]
        client2["Cliente HTTP<hr><br>Aplicaciones Web<br>Solicitudes de usuario"]
        client3["Cliente Interop<hr><br>Servicios Externos<br>Comunicación entre servicios"]
    end
    
    VIP["IP Virtual<hr><br>10.1.1.201<br>maxconn = 1,000,000<br>nbthread = 32<br>tune.bufsize = 32768"]
    
    subgraph haproxy["Capa HAProxy"]
        frontendAPI["Frontend API<hr><br>Puerto: 6443<br>Modo: TCP<br>Servicio: kube-apiserver"]
        frontendHTTP["Frontend HTTP<hr><br>Puerto: 80<br>Modo: HTTP<br>option: forwardfor, http-keep-alive"]
        frontendInterop["Frontend Interop<hr><br>Puerto: 1234<br>Modo: TCP<br>Servicio: interoperabilidad"]
        
        backendAPI["Backend API<hr><br>Balance: source<br>maxconn: 200,000<br>maxqueue: 50,000<br>inter: 3s, fall: 2"]
        backendHTTP["Backend HTTP<hr><br>Balance: roundrobin<br>maxconn: 200,000<br>maxqueue: 50,000<br>slowstart: 30s"]
        backendInterop["Backend Interop<hr><br>Balance: source<br>maxconn: 200,000<br>inter: 3s, fall: 2"]
    end
    
    subgraph systemOptimizations["Optimizaciones del Sistema"]
        kernelParams["Kernel<hr><br>fs.file-max = 5000000<br>net.core.somaxconn = 65535<br>net.ipv4.tcp_max_syn_backlog = 262144<br>net.core.netdev_max_backlog = 300000"]
        limitsParams["Límites de recursos<hr><br>nofile = 1048576<br>Búferes TCP: 16MB<br>timeouts optimizados"]
    end
    
    subgraph masters["Control-plane masters"]
        master1["Master 1<hr><br>10.1.1.101<br>kube-apiserver<br>etcd líder<br>controller-mgr<br>scheduler<br>HAProxy local"]
        master2["Master 2<hr><br>10.1.1.102<br>kube-apiserver<br>etcd seguidor<br>controller-mgr<br>scheduler<br>HAProxy local"]
        master3["Master 3<hr><br>10.1.1.103<br>kube-apiserver<br>etcd seguidor<br>controller-mgr<br>scheduler<br>HAProxy local"]
    end
    
    monitoring["Monitoreo<hr><br>Panel Estadísticas<br>Puerto: 8185<br>auth: admin/haproxy<br>Métricas de rendimiento"]
    
    %% Tráfico de clientes a VIP
    client1 -- "TCP :6443" --> VIP
    client2 -- "HTTP :80" --> VIP
    client3 -- "TCP :1234" --> VIP
    
    %% Tráfico de VIP a frontends
    VIP --> frontendAPI
    VIP --> frontendHTTP
    VIP --> frontendInterop
    
    %% Conexiones frontend a backend
    frontendAPI --> backendAPI
    frontendHTTP --> backendHTTP
    frontendInterop --> backendInterop
    
    %% Conexiones backend a masters (por tipo)
    backendAPI -- "balance source" --> master1
    backendAPI -- "balance source" --> master2
    backendAPI -- "balance source" --> master3
    
    backendHTTP -- "round-robin" --> master1
    backendHTTP -- "round-robin" --> master2
    backendHTTP -- "round-robin" --> master3
    
    backendInterop -- "balance source" --> master1
    backendInterop -- "balance source" --> master2
    backendInterop -- "balance source" --> master3
    
    %% Conexiones de sistema y monitoreo
    systemOptimizations -.- VIP
    haproxy -.- monitoring
    
    subgraph highAvailability["Alta Disponibilidad (Opcional)"]
        keepalived["Keepalived<hr><br>VRRP<br>priority: 100/90<br>VIP flotante<br>Monitoreo de estado"]
    end
    
    highAvailability -.- VIP
    
    %% Colores por tipo de tráfico
    %% Tráfico API
    linkStyle 0,3,6,9,10,11 stroke:#FF5733,stroke-width:2.5
    
    %% Tráfico HTTP
    linkStyle 1,4,7,12,13,14 stroke:#4CAF50,stroke-width:2.5
    
    %% Tráfico Interop
    linkStyle 2,5,8,15,16,17 stroke:#3498DB,stroke-width:2.5
    
    %% Conexiones de sistema (punteadas)
    linkStyle 18,19,20 stroke:#9B59B6,stroke-width:1.5,stroke-dasharray: 5 5
    
    %% Leyenda
    apiLegend["API: 6443"]
    httpLegend["HTTP: 80"]
    interopLegend["Interop: 1234"]
    
    classDef legendApi fill:#FF5733,color:white
    classDef legendHttp fill:#4CAF50,color:white
    classDef legendInterop fill:#3498DB,color:white
    
    class apiLegend legendApi
    class httpLegend legendHttp
    class interopLegend legendInterop
    
    %% Estilo para los grupos
    classDef clientGroup fill:#f9f9f9,stroke:#999,stroke-width:1px
    classDef haproxyGroup fill:#f0f8ff,stroke:#999,stroke-width:1px
    classDef masterGroup fill:#f0fff0,stroke:#999,stroke-width:1px
    classDef systemGroup fill:#fff0f0,stroke:#999,stroke-width:1px
    classDef haGroup fill:#fffaf0,stroke:#999,stroke-width:1px
    
    class clients clientGroup
    class haproxy haproxyGroup
    class masters masterGroup
    class systemOptimizations systemGroup
    class highAvailability haGroup
Loading

Flujo de peticiones HA Proxy normal

sequenceDiagram
    participant C as Cliente
    participant V as VIP
    participant HA as HAProxy
    participant KA as Keepalived
    participant HC as Health Check
    participant M1 as Master 1
    participant M2 as Master 2
    participant M3 as Master 3
    
    Note over C,M3: Flujo Normal
    C->>V: Petición
    V->>HA: Enruta
    HA->>HC: Verifica masters
    HC->>M1: Check
    HC->>M2: Check
    HC->>M3: Check
    HC-->>HA: Estado
    
    alt API (source)
        HA->>M1: Petición
        M1-->>HA: Respuesta
    else HTTP (roundrobin)
        HA->>M2: Petición
        M2-->>HA: Respuesta
    end
    
    HA-->>C: Respuesta
    
    Note over C,M3: Failover
    C->>V: Petición
    V->>HA: Enruta
    HA->>HC: Verifica
    
    HC-xM1: Fallo
    HC-->>HA: M1 DOWN
    
    HA->>M2: Redirección
    M2-->>HA: Respuesta
    HA-->>C: Respuesta
    
    Note over C,M3: Keepalived
    KA->>HA: Monitoreo
    KA-->>V: Gestión VIP
Loading

Arquitectura de Flujo de Red

flowchart TD
    subgraph external["Red Externa"]
        client[Cliente Externo]
        devops[DevOps / Administrador]
    end
    
    subgraph loadbalancing["Capa de Balanceo"]
        vip["VIP HAProxy<br>10.1.1.201"]
        haproxy1["HAProxy Activo"]
        haproxy2["HAProxy Pasivo"]
        keepalived[Keepalived]
    end
    
    subgraph k8sControlPlane["Plano de Control Kubernetes"]
        api1["API Server<br>Master1<br>10.1.1.101"]
        api2["API Server<br>Master2<br>10.1.1.102"]
        api3["API Server<br>Master3<br>10.1.1.103"]
        etcd1["etcd<br>Master1"]
        etcd2["etcd<br>Master2"]
        etcd3["etcd<br>Master3"]
        cm1["Controller Manager<br>Master1"]
        cm2["Controller Manager<br>Master2"]
        cm3["Controller Manager<br>Master3"]
    end
    
    subgraph networking["Capa de Red"]
        cilium["Cilium CNI"]
        metallb["MetalLB"]
    end
    
    subgraph ingress["Capa de Ingress"]
        istio["Istio Service Mesh"]
        gateway["Istio Gateway"]
    end
    
    subgraph workers["Worker Nodes"]
        pod1["Pod App1"]
        pod2["Pod App2"]
        pod3["Pod App3"]
    end
    
    %% Conexiones Externas
    client -- "HTTP/HTTPS" --> vip
    devops -- "kubectl / HTTPS" --> vip
    
    %% Balanceo de Carga
    vip --> haproxy1
    keepalived -- "Monitoreo" --> haproxy1
    keepalived -- "Failover" --> haproxy2
    haproxy2 -.-> vip
    
    %% Conexiones HAProxy a API Server (Coloreadas por tipo)
    haproxy1 -- "Puerto 6443<br>(TCP Source)" --> api1
    haproxy1 -- "Puerto 6443<br>(TCP Source)" --> api2
    haproxy1 -- "Puerto 6443<br>(TCP Source)" --> api3
    
    haproxy1 -- "Puerto 80<br>(HTTP RoundRobin)" --> api1
    haproxy1 -- "Puerto 80<br>(HTTP RoundRobin)" --> api2
    haproxy1 -- "Puerto 80<br>(HTTP RoundRobin)" --> api3
    
    haproxy1 -- "Puerto 1234<br>(TCP Source)" --> api1
    haproxy1 -- "Puerto 1234<br>(TCP Source)" --> api2
    haproxy1 -- "Puerto 1234<br>(TCP Source)" --> api3
    
    %% Comunicación etcd (Internos)
    api1 <--> etcd1
    api2 <--> etcd2
    api3 <--> etcd3
    etcd1 <--> etcd2
    etcd2 <--> etcd3
    etcd1 <--> etcd3
    
    %% Comunicación Controller Manager
    api1 <--> cm1
    api2 <--> cm2
    api3 <--> cm3
    
    %% Red y CNI
    cilium <--> api1
    cilium <--> api2
    cilium <--> api3
    cilium <--> pod1
    cilium <--> pod2
    cilium <--> pod3
    
    %% MetalLB e Istio
    api1 --> metallb
    api2 --> metallb
    api3 --> metallb
    metallb --> istio
    istio --> gateway
    
    gateway --> pod1
    gateway --> pod2
    gateway --> pod3
    

    
    %% Estilo de conexiones
    linkStyle 6,7,8 stroke:#FF5733,stroke-width:2.5
    linkStyle 9,10,11 stroke:#4CAF50,stroke-width:2.5
    linkStyle 12,13,14 stroke:#3498DB,stroke-width:2.5
    linkStyle 15,16,17,18,19,20 stroke:#9B59B6,stroke-width:1.5
    linkStyle 21,22,23 stroke:#9B59B6,stroke-width:1.5
    linkStyle 24,25,26,27,28,29 stroke:#F1C40F,stroke-width:1.5
    linkStyle 30,31,32 stroke:#E67E22,stroke-width:1.5
    linkStyle 33,34,35 stroke:#4CAF50,stroke-width:2
    linkStyle 36 stroke:#4CAF50,stroke-width:2.5
Loading

Diagrama de secuencia de inicio:

Configuración inicial:

sequenceDiagram
    participant U as Usuario
    participant S1 as Master1
    participant HA as HAProxy
    
    U->>S1: kubeadm init
    Note right of S1: Inicialización del<br>control-plane
    S1->>S1: Configuración interna
    S1-->>U: Token y certificados
    
    U->>HA: Instalar HAProxy
    Note right of HA: Configuración y<br>optimización
    HA->>HA: Ajuste de parámetros 
    HA->>S1: Verificar conectividad
    S1-->>HA: Respuesta OK
    HA-->>U: Configuración completada
Loading

Nodos y Master Cilium:

sequenceDiagram
    participant U as Usuario
    participant S1 as Master1
    participant HA as HAProxy
    participant S2 as Master2
    participant S3 as Master3
    participant CI as Cilium
    
    U->>S2: Join Master2
    Note right of S2: Unión al cluster
    S2->>HA: API request
    HA->>S1: Redirige al líder
    S1->>S2: Autoriza unión
    Note right of S2: Master2 unido
    
    U->>S1: Instalar Cilium
    Note right of S1: CNI networking
    S1->>CI: Aplicar manifiestos
    CI->>S1: Instalación en M1
    CI->>S2: Instalación en M2
    
    U->>S3: Join Master3
    Note right of S3: Tercer master
    S3->>HA: API request
    HA->>S1: Redirige al líder
    S1->>S3: Autoriza unión
    CI->>S3: Instalación en M3
    Note right of S3: Todos los masters<br>configurados
Loading

Health Checks:

sequenceDiagram
    participant HA as HAProxy
    participant S1 as Master1
    participant S2 as Master2
    participant S3 as Master3
    
    Note over HA,S3: Monitoreo continuo (cada 3s)
    
    HA->>S1: Verificar estado
    Note right of S1: Health check API<br>Puerto 6443
    
    HA->>S2: Verificar estado
    Note right of S2: Health check API<br>Puerto 6443
    
    HA->>S3: Verificar estado
    Note right of S3: Health check API<br>Puerto 6443
    
    HA->>HA: Actualizar tabla<br>de backend
Loading

Workers y Componentes:

sequenceDiagram
    participant U as Usuario
    participant HA as HAProxy
    participant S2 as Master2
    participant Wn as Worker n
    participant S1 as Master1
    participant ML as MetalLB
    participant IS as Istio
    
    U->>Wn: Join Worker
    Note right of Wn: Incorporación<br>de workers
    Wn->>HA: API request
    HA->>S2: Redirige (round-robin)
    S2->>Wn: Autoriza unión
    
    Note over U,IS: Instalación de complementos
    
    U->>S1: Instalar MetalLB
    Note right of ML: Load Balancer<br>para servicios
    S1->>ML: Orquestar despliegue
    ML->>Wn: Desplegar componentes
    ML-->>S1: Instalación completada
    
    U->>S1: Instalar Istio
    Note right of IS: Service Mesh
    S1->>IS: Orquestar despliegue
    IS->>Wn: Desplegar componentes
    IS-->>S1: Instalación completada
Loading

Validación final:

sequenceDiagram
    participant U as Usuario
    participant S1 as Master1
    participant HA as HAProxy
    participant S2 as Master2
    participant S3 as Master3
    
    U->>S1: kubectl get pods -A
    Note right of S1: Validación de<br>despliegue
    S1-->>U: Estado de todos los pods
    
    Note over HA,S3: Monitoreo continuo
    
    HA->>S1: Health check API
    Note right of S1: Puerto 6443
    
    HA->>S2: Health check API
    Note right of S2: Puerto 6443
    
    HA->>S3: Health check API
    Note right of S3: Puerto 6443
    
    HA->>S1: Health check HTTP
    Note right of S1: Puerto 80
Loading

Fundamentos Arquitectónicos y Principios de Diseño

Paradigma de Gestión de Contenedores Avanzada

La selección de Containerd como motor de ejecución de contenedores representa un enfoque filosófico fundamental que prioriza la simplicidad, robustez y eficiencia. Este componente esencial no es simplemente un elemento técnico, sino un pilar arquitectónico que establece la base para:

Aislamiento Mejorado: La implementación promueve un modelo de aislamiento más estricto entre contenedores, reduciendo significativamente la superficie de ataque y mejorando la seguridad general del sistema. Modelo de Recursos Optimizado: El diseño arquitectónico facilita una administración de recursos más granular, permitiendo asignar recursos críticos del sistema con mayor precisión y eficiencia que en implementaciones tradicionales. Integración Sistemática: La arquitectura favorece una integración armoniosa con los subsistemas del kernel, permitiendo una comunicación fluida entre componentes a diferentes niveles del stack tecnológico.

Principios de Optimización Sistémica

La arquitectura implementa un conjunto de principios fundamentales que trascienden las configuraciones técnicas específicas:

Diseño para Concurrencia Masiva: El sistema está conceptualizado desde sus cimientos para manejar órdenes de magnitud mayores de conexiones simultáneas, facilitando la escalabilidad horizontal y vertical sin degradación de rendimiento. Filosofía de Mínima Latencia: La arquitectura incorpora fundamentos teóricos de redes de baja latencia, priorizando la reducción sistemática de tiempos de respuesta en cada capa del stack tecnológico. Gestión Avanzada de Colas: Implementa conceptos teóricos avanzados de teoría de colas para optimizar el procesamiento de solicitudes bajo diferentes patrones de carga, asegurando que el sistema permanezca responsivo incluso en condiciones de estrés extremo. Paradigma de Tolerancia a Fallos Sistémica: En lugar de tratar los fallos como excepciones, la arquitectura los considera como parte integral del funcionamiento normal, diseñando cada componente para degradarse elegantemente ante limitaciones de recursos o fallos parciales.

Marco Conceptual de Balanceo de Carga

El diseño del sistema de balanceo de carga encarna principios avanzados de distribución de tráfico y resiliencia:

Distribución Contextualmente Inteligente: Supera los modelos tradicionales de round-robin al implementar algoritmos que mantienen afinidad de sesión basada en el contexto y características del tráfico, preservando estados y mejorando la eficiencia. Arquitectura de Monitoreo Integrado: La detección de fallos deja de ser un componente externo para convertirse en una capacidad intrínseca del sistema, con tiempos de detección significativamente reducidos y transiciones entre estados operativos prácticamente imperceptibles. Escalabilidad Multidimensional: El diseño permite escalabilidad tanto vertical (aumento de capacidad por nodo) como horizontal (aumento de nodos), pero también abarca una tercera dimensión: la complejidad funcional, permitiendo añadir nuevas capacidades sin comprometer el rendimiento o la estabilidad. Afinidad Algorítmica: Implementa conceptos avanzados de persistencia de sesión que mantienen la integridad del estado durante operaciones críticas, mejorando no solo el rendimiento sino también la experiencia del usuario final y la integridad de las operaciones.

Proceso de Despliegue

El despliegue sigue una secuencia cuidadosamente orquestada para garantizar consistencia y fiabilidad:

  1. Preparación del Sistema Base:

    • Configuración y optimización del SO
    • Instalación y configuración de Containerd
    • Optimización de parámetros del kernel
  2. Inicialización del Plano de Control:

    • Inicialización del primer master con kubeadm
    • Formación del clúster etcd
    • Unión de masters adicionales al clúster
    • Distribución y validación de certificados
  3. Capa de Red:

    • Despliegue de Cilium CNI
    • Configuración de MetalLB
    • Configuración del balanceador de carga
  4. Service Mesh y Complementos:

    • Despliegue de Istio
    • Instalación de componentes de monitoreo

Consideraciones Operativas

Escenarios de Fallo y Recuperación

La arquitectura está diseñada para manejar varios escenarios de fallo:

  1. Fallo de un Solo Master:

    • HAProxy detecta el nodo no saludable y lo elimina de la rotación
    • etcd mantiene quórum con los nodos restantes
    • Los servicios continúan sin interrupción
  2. Partición de Red:

    • La protección de quórum de etcd previene escenarios de división cerebral
    • Recuperación automática cuando se restaura la conectividad
  3. Fallo del Balanceador de Carga:

    • Keepalived opcional proporciona failover de VIP
    • Múltiples instancias de HAProxy para redundancia

Monitoreo y Gestión

La arquitectura incluye monitoreo integral:

  1. Estadísticas de HAProxy:

    • Métricas de conexión en tiempo real
    • Monitoreo de salud de backend
    • Visualización de rendimiento
  2. Monitoreo Nativo de Kubernetes:

    • Servidor de métricas para utilización de recursos
    • Integrado con telemetría de Istio

Conclusión

  • Tolerancia a fallos mejorada a través de configuración mejorada de etcd y servidor API
  • Rendimiento de red superior con Cilium y HAProxy optimizado
  • Mejor postura de seguridad con mecanismos de autorización modernos
  • Mayor eficiencia de recursos a través de la configuración optimizada de componentes

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors