Create a Ingress for our pods (backend and frontend)
Lo siguiente es crear un ingress para exponer nuestro frontend y backend usando AWS Load Balancer controller. Primero sera http plano, luego podremos adjuntar certificados para habilitar TLS.
Por defecto AWS Load Balancer controller creara load balancer con solo con private IPs. Solo pueden ser accedidos mediante nuestra VPC. Para cambiar eso, podemos usar annotations. En general los Load Balancer de AWS soportan dos modos. Instance mode y IP mode. AWS Fargate solo puede ser usado con IP mode. Esto creara un target group en AWS y usara la IP del pod para redigir la ruta.
Dentro de la carpeta k8s/ crear el siguiente archivo ingress.yaml
Una vez aplicado este ingress podemos verlo con el comando kubectl get ing -n staging
El pod con el Load Balancer Controller creara un ALB en base al ingress creado.
Si vamos a EC2 y luego a Load balancer podemos ver que tenemos un nuevo ALB
Y si vemos los listeners podemos ver que estan creadas las reglas correspondientes para cada host
Adjuntar dominios al ALB
Para adjuntar nuestros subdominios al Application Load Balancer debemos ir a Route53 y crear nuevos records. Recuerde poner de Record name los hosts declarados en el ingress y de Value poner el DNS name del Application Load Balancer.
Secure Ingress con SSL/TLS
Para habilitar TLS debemos ir a AWS Certificate Manager y pedir un certificado.
En el dominio pondremos un * asi funciona el certificado tanto para el frontend como para el backend.
En mi caso:
Una vez creado el certificado nos aparecera un boton para agregar los Record names automaticamente en Route 53.
Creado los records, luego de unos minutos el certificado deberia estar issued.
Y dentro del archivo k8s/ingress.yaml
debemos realizar unos cambios:
Pusheamos para que se apliquen los cambios y ya podremos acceder con HTTPS a nuestras aplicaciones.
Habilitar Fargate logging para logear a CloudWatch
Lo primero es crear un Fargate profile ya que los pods que loggeen a cloudwatch estaran en un namespace llamado aws-observability
. Entonces debemos darle la autoridad a Fargate para que asigne nodos a los pods en ese namespace.
Para eso crearemos el archivo terraform/13-aws-observability-profile.tf
:
Pusheamos para que corra terraform.
Una vez que este creado el profile debemos crear el archivo dentro de k8s llamado
k8s/aws-observability-namespace.yaml
Lo aplicamos kubectl apply -f k8s/aws-observability-namespace.yaml
Luego debemos crear un ConfigMap con el nombre k8s/aws-logging-cloudwatch-configmap.yaml
Lo aplicamos kubectl apply -f k8s/aws-logging-cloudwatch-configmap.yaml
Luego debemos descargar el siguiente archivo:
Una vez descargado ese archivo ejecutaremos el comando:
Esto nos devolvera la policy creada y debemos tomar el ARN
Luego debemos buscar el role creado para ejecutar pods que creamos previamente. En iam → roles podemos ver los roles creados, en mi caso el rol se llama eks-fargate-profile
.
Con la ARN de la policy y el nombre del rol podemos ejecutar el siguiente comando:
Una vez hecho esto ya tendremos loggin de Fargate habilitado. Solo debemos reiniciar nuestros pods y listo.
kubectl rollout restart deployment/frontend -n staging
kubectl rollout restart deployment/backend -n staging