DEV Community

Cover image for Application Load Balancer de EKS se desvincula de WAF

Application Load Balancer de EKS se desvincula de WAF

La creación de recursos fuera de infraestructura como código suele darnos sorpresas, regularmente muchos dan mantenimiento a su infraestructura a través de cloudformation, sin embargo en algunos servicios es recomendable que se tome en cuenta la documentación oficial para prevenir imprevistos que puedan ponernos en aprietos.

Hace unos días revisando mi infraestructura la cual se compone de varios clústeres de kubernetes, los cuales aún utilizan ingress controler para definir los paths que dirigen a los servicios publicados, dentro de estos ingress utilicé la función de que automáticamente al crearlos se generara un balanceador de aplicaciones dentro de la infraestructura de AWS, todo había ido muy bien, hasta que hice la actualización de versión de kubernetes.

Todo funcionó correctamente, hice mi actualización a la versión 1.33 de Kubernetes en EKS y todo fue sencillo como siempre, inicialmente hice la actualización de mi plano de control, tratando de ser muy ordenado (En lo personal me gusta realizarlo desde el cli), de la siguiente forma.

1. Verifiqué la versión actual del clúster: 
       aws eks describe-cluster --name eks-cluster-infraestructura --query cluster.version --output text

2. Actualicé el plano de control:
       aws eks update-cluster-version --name eks-cluster-infraestructura  --kubernetes-version 1.33 --output json

3. Actualicé los grupos de nodos:
      aws eks update-nodegroup-version --cluster-name eks-cluster-infraestructura --nodegroup-name ng-cluster-infraestructura --kubernetes-version 1.33

4. Y finalmente actualicé los complementos del clúster:
     aws eks update-addon --cluster-name eks-cluster-infraestructura  --addon-name coredns --addon-version v1.13.2-eksbuild.1 --configuration-values '{}'
     aws eks update-addon --cluster-name eks-cluster-infraestructura   --addon-name vpc-cni --addon-version v1.21.1-eksbuild.5  --configuration-values '{}'
     aws eks update-addon --cluster-name eks-cluster-infraestructura  --addon-name kube-proxy --addon-version v1.33.9-eksbuild.2   --configuration-values '{}'
     aws eks update-addon --cluster-name eks-cluster-infraestructura   --addon-name amazon-cloudwatch-observability --addon-version  v5.2.2-eksbuild.1   --configuration-values '{}'
     aws eks update-addon --cluster-name eks-cluster-infraestructura  --addon-name eks-pod-identity-agent --addon-version  v1.3.10-eksbuild.2 -  --configuration-values '{}'
Enter fullscreen mode Exit fullscreen mode

Como dato adicional les recomiendo esta actualización del complemento de amazon-cloudwatch-observability, acá ya podrán integrar el uso de applications signals (APM) el cual permite un monitoreo a detalle de lo que puede estar pasando en cada carga de trabajo dentro de tu clúster de EKS.

Hasta el momento todo iba muy bien, la actualización fue exitosa, no hubo necesidad de realizar cambios adicionales, sin embargo para revisar que todo estuviera bien hice algunas pruebas y vaya sorpresa, resulta que el web ACL que tenía vinculado el balanceador del cluster, ya no tenía recursos vinculados, luego de leer a fondo la documentación pude observar que es necesario que dentro de la definición de mi recurso Ingress debo vincular el ARN del web ACL, y esto sucede porqué cuando se vincula manualmente el balanceador desde la consola de AWS esa configuración termina siendo efímera, solamente existirá mientras no hayan cambios en el clúster, el archivo yaml de tu ingress no tiene idea de que en algún momento vinculaste el balanceador a un WAF, por lo que al actualizar el clúster este toma la definición inicial del YAML del ingress y al no estar declarado el vinculo al WAF asume que no debe estar ahí.

Es por eso que para que no te suceda esto, te dejaré la forma en la cual debes agregar el ARN del WAF a tu ingress.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mi-app-web
  annotations:
    # En esta línea debes agregar el ARN de tu web ACL 
    alb.ingress.kubernetes.io/wafv2-acl-arn: arn:aws:wafv2:region:123456789012:regional/webacl/nombre-waf/a1b2c3d4...
spec:
  ingressClassName: alb
Enter fullscreen mode Exit fullscreen mode

La propiedad en el recurso de ingress ha sido permitida desde hace varios años, sin embargo el adoptar infraestructura que no fue creada por nosotros puede generar inconvenientes como este que en muchos casos genera confusión.

Top comments (0)