A medida que las organizaciones utilizan microservicios y arquitecturas nativas de la nube, Kubernetes se está convirtiendo en la norma para la orquestación de contenedores. Por mucho que Kubernetes simplifique el despliegue y la gestión de contenedores, las cargas de trabajo a gran escala hacen que la vida sea compleja y se necesitan prácticas robustas.
En este artículo, cubriré estrategias técnicas y mejores prácticas para la gestión de cargas de trabajo a gran escala en Kubernetes.
Conociendo los Desafíos en la Escalabilidad de Kubernetes
Escalar en Kubernetes implica superar obstáculos como:
- Programación de recursos del clúster. Uso optimizado de CPU, memoria y disco a través de los nodos.
- Complejidad de red. Comunicaciones consistentes de servicio a servicio en grandes entornos distribuidos.
- Fallos y escalabilidad. Manejo de la disponibilidad durante fallos y en escenarios de escalado hacia fuera/hacia dentro.
- Costos operativos. Eliminación de operaciones repetitivas como escalado, monitoreo y balanceo de cargas.
- Seguridad a gran escala. Controles de acceso basados en roles (RBAC), secretos y políticas de red en grandes clústeres.
En este artículo, analizaré ejemplos de cómo superar tales obstáculos con una combinación de capacidades nativas de Kubernetes y herramientas complementarias.
Capacidades y Herramientas
1. Programación Eficiente de Recursos del Clúster
El rendimiento a escala está determinado directamente por la distribución de recursos a escala. Existen diversas capacidades en Kubernetes para el uso optimizado de recursos:
Solicitudes y Límites
Declarar solicitudes y límites de CPU y memoria provocará una distribución justa de recursos y no permitirá que vecinos ruidosos consuman todos los recursos.
apiVersion v1
kind Pod
metadata
name resource-demo
spec
containers
name app
image nginx
resources
requests
memory"128Mi"
cpu"500m"
limits
memory"256Mi"
cpu"1"
Mejores prácticas:
- Usar cuotas para hacer cumplir a nivel de espacio de nombres.
- Analizar periódicamente el uso con
kubectl top
y realizar los ajustes necesarios a los límites.
Escalador Automático de Clúster
El escalador ajusta dinámicamente el número de nodos de su clúster según la demanda de carga de trabajo.
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/cluster-autoscaler-<version>/cluster-autoscaler.yaml
Mejores prácticas:
- Etiquetar adecuadamente las operaciones de su escalador para sus nodos.
- Monitorizar el comportamiento de escalado para evitar la sobreaprovisionamiento.
2. Escalado Automático de Pods Horizontal y Vertical
El Escalador Automático de Pods Horizontal (HPA) y el Escalador Automático de Pods Vertical (VPA) son capacidades de escalado automático nativas en Kubernetes, pero las mallas de servicios como Istio y Linkerd facilitan y simplifican las comunicaciones entre servicios, haciéndolas más fáciles y eficientes.
Escalador Automático de Pods Horizontal (HPA)
El HPA escala réplicas de pods según la CPU, la memoria o métricas personalizadas.
Ejemplo: Uso de CPU para el escalado automático
apiVersion autoscaling/v2
kind HorizontalPodAutoscaler
metadata
name hpa-example
spec
scaleTargetRef
apiVersion apps/v1
kind Deployment
name web-app
minReplicas2
maxReplicas10
metrics
type Resource
resource
name cpu
target
type Utilization
averageUtilization50
Vertical Pod Autoscaler (VPA)
Vertical Pod Autoscaler escala una solicitud de tiempo de ejecución y límites de un pod.
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-<version>/vpa.yaml
3. Optimización de la Red a Escala
Malla de Servicios
Las mallas de servicios como Istio y Linkerd simplifican las comunicaciones entre servicios y las hacen más eficientes a través de la abstracción de cargas de servicio, reintentos y preocupaciones de cifrado.
Ejemplo: Istio VirtualService para dirigir el tráfico
apiVersion networking.istio.io/v1beta1
kind VirtualService
metadata
name example-route
spec
hosts
example.com
http
route
destination
host service-v1
weight80
destination
host service-v2
weight20
Políticas de Red
Utilice políticas de red para restringir el tráfico entre pods para una seguridad mejorada.
apiVersion networking.k8s.io/v1
kind NetworkPolicy
metadata
name restrict-traffic
spec
podSelector
matchLabels
app web-app
policyTypes
Ingress
ingress
from
podSelector
matchLabels
role backend
4. Mejora de la Observabilidad
La observabilidad es crucial para controlar Kubernetes a un nivel superior. Utilice herramientas como Prometheus, Grafana y Jaeger para métricas, registros y trazas.
Métricas de Prometheus
Utilice anotaciones de Prometheus para recolectar métricas de pods.
apiVersion v1
kind Pod
metadata
annotations
prometheus.io/scrape"true"
prometheus.io/port"8080"
labels
app monitored-app
spec
containers
name app
image monitored-app latest
ports
containerPort8080
5. Construyendo Resiliencia
Presupuestos de Disrupción de Pods (PDB)
Utilice PDBs para mantener una disponibilidad mínima de pods durante el mantenimiento y las actualizaciones.
apiVersion policy/v1
kind PodDisruptionBudget
metadata
name pdb-example
spec
minAvailable2
selector
matchLabels
app web-app
Actualizaciones Graduales
Implemente actualizaciones en fases de manera que no causen ningún tiempo de inactividad.
kubectl set image deployment/web-app web-app=web-app:v2 --record
kubectl rollout status deployment/web-app
6. Asegurando Kubernetes a Escala
Configuración de RBAC
Utilice RBAC para restringir los privilegios del usuario y la aplicación.
apiVersion rbac.authorization.k8s.io/v1
kind Role
metadata
namespace default
name pod-reader
rules
apiGroups""
resources"pods"
verbs"get" "list" "watch"
Administración de Secretos
Utilice Kubernetes Secrets para la gestión segura de información sensible. Utilice Kubernetes Secrets para administrar información sensible de forma segura.
apiVersion v1
kind Secret
metadata
name db-credentials
type Opaque
data
username dXNlcg==
password cGFzc3dvcmQ=
7. GitOps para la Automatización
Utilice GitOps con herramientas como ArgoCD y Flux. Versione y almacene manifiestos de Kubernetes en repositorios Git y sincronícelos automáticamente con los clústeres.
8. Pruebas a Escala
Simule cargas de trabajo a gran escala con herramientas como K6 y Locust. Verifique la configuración, asignaciones de recursos y escalabilidad en entornos de pruebas.
9. Manejo de Almacenamiento a Escala
Provisión Dinámica de Volúmenes Persistentes
El almacenamiento para aplicaciones se provisiona dinámicamente con automatización.
apiVersion storage.k8s.io/v1
kind StorageClass
metadata
name fast-storage
provisioner kubernetes.io/aws-ebs
parameters
type gp2
fsType ext4
10. Optimización de los Pipelines CI/CD para Kubernetes
Construir y Publicar una Imagen de Docker
Agilice la creación y publicación de imágenes de contenedores con herramientas CI/CD como Jenkins, GitHub Actions y GitLab CI.
Conclusión
Para escalar Kubernetes, es necesario combinar un uso eficiente de recursos, automatización, observabilidad y procesos de seguridad sólidos. Al aprovechar al máximo las capacidades nativas de Kubernetes y combinarlas con herramientas complementarias, sus cargas de trabajo pueden ser de alto rendimiento, seguras y resilientes en cualquier escala.
Source:
https://dzone.com/articles/best-practices-managing-kubernetes-at-scale