Amazon EKS Storage - Part 3: Monitoring, Troubleshooting, Cost Optimization, and Security
Este documento es la tercera y última parte de la serie de almacenamiento de Amazon EKS, y cubre el monitoreo del almacenamiento, la solución de problemas, la optimización de costos y la seguridad.
Table of Contents
- Storage Monitoring
- Storage Troubleshooting
- Storage Cost Optimization
- Storage Security
- Storage Management Best Practices
Storage Monitoring
Monitorear eficazmente los recursos de almacenamiento en un cluster de EKS es importante para detectar problemas de rendimiento de forma temprana y establecer la planificación de capacidad.
Monitoring with CloudWatch
Puedes usar AWS CloudWatch para monitorear métricas de rendimiento de volúmenes EBS, EFS y FSx for Lustre:
EBS Volume Metrics
Métricas clave de EBS:
- VolumeReadBytes/VolumeWriteBytes: rendimiento de lectura/escritura
- VolumeReadOps/VolumeWriteOps: número de operaciones de lectura/escritura
- VolumeTotalReadTime/VolumeTotalWriteTime: latencia de lectura/escritura
- VolumeQueueLength: número de solicitudes de I/O pendientes
- BurstBalance: saldo de créditos burst (volúmenes gp2)
Ejemplo de dashboard de CloudWatch:
aws cloudwatch get-dashboard --dashboard-name EBSVolumeMonitoringEFS File System Metrics
Métricas clave de EFS:
- TotalIOBytes: total de bytes de I/O
- DataReadIOBytes/DataWriteIOBytes: rendimiento de lectura/escritura
- ClientConnections: número de clientes conectados
- PermittedThroughput: rendimiento permitido
- BurstCreditBalance: saldo de créditos burst
FSx for Lustre Metrics
Métricas clave de FSx for Lustre:
- DataReadBytes/DataWriteBytes: rendimiento de lectura/escritura
- DataReadOperations/DataWriteOperations: número de operaciones de lectura/escritura
- FreeDataStorageCapacity: capacidad de almacenamiento disponible
- NetworkThroughputUtilization: utilización del rendimiento de red
Monitoring with Prometheus and Grafana
Puedes usar Prometheus y Grafana para monitorear recursos de almacenamiento a nivel de Kubernetes:
- Instala Prometheus y Grafana:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace- Configura ServiceMonitor para la recopilación de métricas relacionadas con el almacenamiento:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: csi-metrics
namespace: monitoring
spec:
selector:
matchLabels:
app: ebs-csi-controller
endpoints:
- port: metrics
interval: 30s- Configura el dashboard de Grafana:
Crea un dashboard en Grafana que incluya las siguientes métricas:
- Uso y capacidad de PVC
- Estado de aprovisionamiento de volúmenes
- Latencia de operación del driver CSI
- Operaciones de montaje/desmontaje de volúmenes
Custom Monitoring Solutions
Puedes implementar soluciones de monitoreo personalizadas para requisitos específicos:
- Pod de monitoreo de uso de volúmenes:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: volume-usage-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: volume-usage-exporter
template:
metadata:
labels:
app: volume-usage-exporter
spec:
containers:
- name: exporter
image: quay.io/prometheus/node-exporter:v1.3.1
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
- name: root
mountPath: /host/root
readOnly: true
mountPropagation: HostToContainer
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: root
hostPath:
path: /- Configuración de reglas de alerta:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: storage-alerts
namespace: monitoring
spec:
groups:
- name: storage
rules:
- alert: VolumeUsageHigh
expr: kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "Volume usage high ({{ $value | humanizePercentage }})"
description: "PVC {{ $labels.persistentvolumeclaim }} is using {{ $value | humanizePercentage }} of its capacity."
- alert: VolumeFullIn24Hours
expr: predict_linear(kubelet_volume_stats_used_bytes[6h], 24 * 3600) > kubelet_volume_stats_capacity_bytes
for: 10m
labels:
severity: warning
annotations:
summary: "Volume will fill in 24 hours"
description: "PVC {{ $labels.persistentvolumeclaim }} is predicted to fill within 24 hours."Storage Troubleshooting
Exploremos los problemas comunes de almacenamiento que pueden ocurrir en clusters de EKS y sus soluciones.
Volume Provisioning Issues
Issue: PVC Remains in Pending State
- Comprueba el estado del PVC:
kubectl get pvc
kubectl describe pvc <pvc-name>- Comprueba la storage class:
kubectl get sc
kubectl describe sc <storage-class-name>- Comprueba los logs del Pod provisioner:
kubectl -n kube-system get pods | grep csi
kubectl -n kube-system logs <csi-controller-pod-name>- Causas comunes y soluciones:
- La storage class no existe: crea la storage class correcta
- El driver CSI no está instalado: instala el driver
- Permisos de IAM insuficientes: concede los permisos de IAM requeridos
- Límite de volúmenes excedido: solicita un aumento del límite del servicio
Issue: Volume Not Provisioned with WaitForFirstConsumer Binding Mode
- Comprueba el estado del Pod:
kubectl get pods
kubectl describe pod <pod-name>- Comprueba las zonas de disponibilidad de los nodes:
kubectl get nodes -L topology.kubernetes.io/zone- Soluciones:
- Resuelve los problemas de scheduling del Pod
- Comprueba las reglas de node selector y affinity
- Asegúrate de que el node pool esté en la misma zona de disponibilidad que el PVC
Volume Mount Issues
Issue: Pod Stuck in ContainerCreating State
- Comprueba los eventos del Pod:
kubectl describe pod <pod-name>- Comprueba los logs de kubelet del node:
kubectl get nodes
ssh ec2-user@<node-ip>
sudo journalctl -u kubelet- Causas comunes y soluciones:
- ID de volumen no encontrado: verifica la existencia del volumen en la consola de AWS
- Error de montaje del dispositivo: comprueba la ruta del dispositivo y el file system
- Problemas de permisos: comprueba los roles de IAM y los security groups
Issue: EFS or FSx Mount Failure
Comprueba los security groups:
- EFS: permite el puerto TCP 2049
- FSx for Lustre: permite el puerto TCP 988
Comprueba la conectividad de red:
kubectl debug node/<node-name> -it --image=amazon/aws-cli
ping <efs-dns-name>
telnet <efs-dns-name> 2049- Crea un Pod helper de montaje:
apiVersion: v1
kind: Pod
metadata:
name: mount-helper
spec:
containers:
- name: mount-helper
image: amazonlinux:2
command: ["sleep", "infinity"]
securityContext:
privileged: true- Prueba el montaje manualmente:
kubectl exec -it mount-helper -- bash
yum install -y nfs-utils
mkdir -p /mnt/efs
mount -t nfs4 <efs-dns-name>:/ /mnt/efsPerformance Issues
Issue: Slow I/O Performance
- Comprueba las métricas de rendimiento del volumen:
aws cloudwatch get-metric-statistics \
--namespace AWS/EBS \
--metric-name VolumeReadOps \
--dimensions Name=VolumeId,Value=vol-1234567890abcdef0 \
--start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 300 \
--statistics Average- Prueba el rendimiento del file system:
kubectl exec -it <pod-name> -- bash
dd if=/dev/zero of=/data/test bs=1M count=1000 oflag=direct
dd if=/data/test of=/dev/null bs=1M count=1000 iflag=direct- Causas comunes y soluciones:
- Tipo de volumen inadecuado: selecciona un tipo de volumen adecuado para la workload (por ejemplo, gp3, io2)
- Límites de IOPS o throughput: ajusta los parámetros de rendimiento del volumen
- Limitaciones de la instance: usa instances optimizadas para EBS
- Fragmentación del file system: optimiza o recrea el file system
Issue: EFS Performance Degradation
- Comprueba el modo de rendimiento y el modo de throughput de EFS
- Optimiza las opciones de montaje del cliente:
mountOptions:
- nfsvers=4.1
- rsize=1048576
- wsize=1048576
- timeo=600
- retrans=2
- noresvport- Optimiza los patrones de acceso:
- Usa archivos grandes en lugar de archivos pequeños
- Usa patrones de acceso secuencial
- Minimiza las operaciones de metadatos
Storage Cost Optimization
Exploremos estrategias para optimizar los costos de almacenamiento en clusters de EKS.
Volume Type and Size Optimization
Selecciona el tipo de volumen adecuado:
- Workloads generales: gp3 (más rentable que gp2)
- Workloads intensivas en throughput: st1
- Datos con acceso poco frecuente: sc1
Optimiza el tamaño del volumen:
- Aprovisiona volúmenes ligeramente mayores de lo necesario
- Monitorea el uso del volumen y amplíalo según sea necesario
- Limpia o archiva datos innecesarios
Migra a volúmenes gp3:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-gp3
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
type: gp3
encrypted: "true"
allowVolumeExpansion: trueStorage Lifecycle Management
Data tiering:
- Datos de acceso frecuente: EBS o EFS
- Datos de acceso poco frecuente: S3 o S3 Glacier
Política automatizada de snapshots:
- Crea snapshots regulares
- Elimina automáticamente los snapshots antiguos
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: ebs-snapshot-class
driver: ebs.csi.aws.com
deletionPolicy: Delete- Política de reclamación de PV:
- Usa la política Delete para datos temporales
- Usa la política Retain para datos importantes
EFS Cost Optimization
Selecciona el modo de throughput adecuado:
- Workloads predecibles: throughput aprovisionado
- Workloads variables: modo bursting
Gestión del lifecycle:
- Mueve automáticamente los archivos de acceso poco frecuente a la storage class IA (Infrequent Access)
- Configura la política de lifecycle:
aws efs put-lifecycle-configuration \
--file-system-id fs-1234567890abcdef0 \
--lifecycle-policies '[{"TransitionToIA":"AFTER_30_DAYS"}]'- Usa access points:
- Comparte el file system usando access points específicos de la aplicación
FSx for Lustre Cost Optimization
Selecciona el tipo de deployment adecuado:
- Workloads temporales: SCRATCH_2
- Workloads a largo plazo: PERSISTENT_1 o PERSISTENT_2
Habilita la compresión de datos:
- Usa compresión de datos LZ4 para reducir los costos de almacenamiento
Integración con S3:
- Conecta el bucket de S3 a FSx for Lustre para data tiering
Cost Monitoring and Analysis
Usa AWS Cost Explorer:
- Analiza las tendencias de costos de almacenamiento
- Analiza los costos por recurso
Asignación de costos de Kubernetes:
- Asigna costos usando namespaces y labels
- Usa herramientas como Kubecost
Detección de anomalías de costos:
- Configura AWS Budgets y alertas
- Configura alertas para aumentos de costos anormales
Storage Security
Exploremos las mejores prácticas de seguridad para proteger los recursos de almacenamiento en clusters de EKS.
Data Encryption
- Cifrado de datos en reposo:
- Cifrado de volúmenes EBS:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-encrypted
provisioner: ebs.csi.aws.com
parameters:
type: gp3
encrypted: "true"
kmsKeyId: arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab- Cifrado de file system EFS:
aws efs create-file-system \
--encrypted \
--kms-key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab- Cifrado de FSx for Lustre:
aws fsx create-file-system \
--file-system-type LUSTRE \
--storage-capacity 1200 \
--subnet-ids subnet-1234567890abcdef0 \
--lustre-configuration DeploymentType=SCRATCH_2 \
--security-group-ids sg-1234567890abcdef0 \
--kms-key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab- Cifrado de datos en tránsito:
- Cifrado en tránsito de EFS:
mountOptions:
- tls- Cifrado en tránsito de S3:
aws s3 cp --sse AES256 file.txt s3://my-bucket/Access Control
- Roles y políticas de IAM:
- Aplica el principio de privilegio mínimo
- Usa roles de IAM para service accounts
eksctl create iamserviceaccount \
--name ebs-csi-controller-sa \
--namespace kube-system \
--cluster my-cluster \
--attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
--approve- Security groups:
- Permite solo los puertos requeridos
- Restringe las IPs de origen
aws ec2 authorize-security-group-ingress \
--group-id sg-1234567890abcdef0 \
--protocol tcp \
--port 2049 \
--source-group sg-0987654321fedcba0- Kubernetes RBAC:
- Restringe el acceso a PVs y PVCs
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: app-namespace
name: pvc-manager
rules:
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pvc-manager-binding
namespace: app-namespace
subjects:
- kind: ServiceAccount
name: app-service-account
namespace: app-namespace
roleRef:
kind: Role
name: pvc-manager
apiGroup: rbac.authorization.k8s.ioPod Security Context
- Root filesystem de solo lectura:
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
containers:
- name: app
image: nginx
securityContext:
readOnlyRootFilesystem: true
volumeMounts:
- name: data-volume
mountPath: /data
readOnly: false- Privilegios limitados:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
allowPrivilegeEscalation: false- Perfiles SELinux, AppArmor o seccomp:
securityContext:
seLinuxOptions:
level: "s0:c123,c456"
seccompProfile:
type: RuntimeDefaultSecurity Policy Enforcement
- OPA Gatekeeper o Kyverno:
- Permite solo volúmenes cifrados
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-ebs-encryption
spec:
validationFailureAction: enforce
rules:
- name: check-ebs-encryption
match:
resources:
kinds:
- PersistentVolumeClaim
validate:
message: "EBS volumes must be encrypted"
pattern:
spec:
storageClassName: "ebs-*"
+(storageClassName): "ebs-encrypted"- Pod Security Standards:
- Aplica Pod Security Standards a los namespaces
apiVersion: v1
kind: Namespace
metadata:
name: secure-ns
labels:
pod-security.kubernetes.io/enforce: restrictedStorage Management Best Practices
Exploremos las mejores prácticas para gestionar eficazmente el almacenamiento en clusters de EKS.
Storage Planning and Design
Análisis de requisitos:
- Requisitos de rendimiento (IOPS, throughput)
- Requisitos de capacidad
- Patrones de acceso (relación lectura/escritura, concurrencia)
- Requisitos de disponibilidad y durabilidad
Selección del tipo de almacenamiento:
- Block storage (EBS): bases de datos, aplicaciones stateful
- File storage (EFS): archivos compartidos, servidores web, CMS
- File storage de alto rendimiento (FSx for Lustre): HPC, entrenamiento de ML
- Object storage (S3): backups, archivos, contenido estático
Planificación de capacidad:
- Requisitos actuales + margen de crecimiento
- Implementa mecanismos de auto-scaling
- Revisiones regulares de capacidad
Backup and Disaster Recovery
- Backups regulares:
- Automatiza snapshots de volúmenes
- Define políticas de retención de backups
# Create snapshot daily at midnight
0 0 * * * kubectl create -f snapshot.yamlPlan de disaster recovery:
- Replicación Multi-AZ o cross-region
- Define Recovery Time Objective (RTO) y Recovery Point Objective (RPO)
- Pruebas regulares de recuperación
Backup del cluster con Velero:
velero backup create daily-backup --include-namespaces=default,app-namespaceAutomation and IaC (Infrastructure as Code)
- Usa Terraform o CloudFormation:
- Definición declarativa de recursos de almacenamiento
- Control de versiones y seguimiento de cambios
resource "aws_efs_file_system" "example" {
creation_token = "example"
performance_mode = "generalPurpose"
throughput_mode = "bursting"
encrypted = true
lifecycle_policy {
transition_to_ia = "AFTER_30_DAYS"
}
tags = {
Name = "ExampleFileSystem"
}
}- Usa Helm charts:
- Templatiza storage classes y PVCs
# values.yaml
storage:
class: ebs-gp3
size: 10Gi
encrypted: true- Workflow GitOps:
- Gestiona la configuración de almacenamiento con ArgoCD o Flux
Performance and Cost Optimization
Revisión regular del rendimiento:
- Identifica y resuelve cuellos de botella
- Ajusta la configuración de almacenamiento a medida que cambian las workloads
Revisión de optimización de costos:
- Identifica y elimina volúmenes no utilizados
- Migra a tipos de almacenamiento rentables
- Considera Reserved Instances o Savings Plans
Auto scaling:
- Escala automáticamente el almacenamiento según la demanda
- Configura alertas basadas en uso
Conclusion
En este documento, cubrimos el monitoreo, la solución de problemas, la optimización de costos y la seguridad para el almacenamiento de Amazon EKS. La gestión eficaz del almacenamiento es fundamental para garantizar el rendimiento, la confiabilidad y la rentabilidad de tu cluster de EKS.
Los requisitos de almacenamiento varían según la aplicación, por lo que es importante comprender las características de tu workload y seleccionar la solución de almacenamiento adecuada. Además, debes gestionar eficazmente los recursos de almacenamiento mediante monitoreo regular, solución de problemas, optimización de costos y revisiones de seguridad.
References
- Amazon EKS Storage Best Practices
- Kubernetes Storage Troubleshooting
- AWS Storage Cost Optimization
- Kubernetes Storage Security
Quiz
Para comprobar lo que aprendiste en este capítulo, intenta el cuestionario del tema.