Solución:
Necesitas usar el nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
anotación:
Cuando se utiliza la descarga de SSL fuera del clúster (por ejemplo, AWS ELB), puede resultar útil aplicar un redireccionamiento a HTTPS incluso cuando no hay ningún certificado TLS disponible. Esto se puede lograr utilizando el
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
anotación en el recurso particular.
¡Pude hacer que funcionara! básicamente modifiqué los archivos ingress.yaml y service.yaml
ingress.yaml se ve así:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: metabase
namespace: bigdata
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-2:***:certificate/****
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/group: metabase # name of my app
labels:
app: metabase
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: ssl-redirect
servicePort: use-annotation
- path: /*
backend:
serviceName: metabase
servicePort: 443
y mi servicio se ve así:
apiVersion: v1
kind: Service
metadata:
name: metabase
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-2:***:certificate/***
namespace: bigdata
labels:
app: metabase
spec:
ports:
- name: https
protocol: TCP
port: 443
targetPort: http-server
- name: http
protocol: TCP
port: 80
targetPort: http-server
selector:
app: metabase
type: LoadBalancer
He pasado bastante tiempo tratando de hacer que esto funcione y finalmente lo logré. Probablemente alguien lo encontrará útil. Intentaré describir el enfoque paso a paso para configurar ALB con HTTP a redirección HTTP.
- Verifique que su controlador ALB esté en funcionamiento:
kubectl get deployment -n kube-system aws-load-balancer-controller
La impresión debe ser similar a la siguiente:
NAME READY UP-TO-DATE AVAILABLE AGE
aws-load-balancer-controller 1/1 1 1 18h
Si su controlador no funciona, no se creará ningún Load Balancer.
-
Verifique que su archivo yaml sea bueno. A continuación, proporciono un archivo Yaml simple que funcionó en mi caso. Algunos comentarios sobre este archivo:
a) Utilice el ARN de su certificado SSL / TLS (yo usé XXXXXXX).
b) Utilice su imagen (yo utilicé YYYYYYYYYY). La imagen de mi contenedor se almacena en el ECR (Elastic Container Registry).
c) Tenga en cuenta que un servicio extraño marcado ssl-redirect con servicePort:
use-annotations se crea de acuerdo con la especificación de anotaciones.
https://kubernetes-sigs.github.io/aws-load-balancer-controller/guide/ingress/annotations/ -
Una vez que corras:
kubectl apply -f service.yaml
Marque dos cosas:
a)kubectl -n default describe ingress
Este comando debe mostrar que la reconciliación fue exitosa: el final de la impresión debe mostrar:
Normal SuccessfullyReconciled 11s (x3 over 18m) ingress Successfully reconciled
En la misma impresión (parte superior de la impresión) no preste atención a la entrada del registro:
/* ssl-redirect:use-annotation (<error: endpoints "ssl-redirect" not found>)
B)
aws elbv2 describe-load-balancers --query "LoadBalancers[?contains(LoadBalancerArn,'default-nginx')].{Arn: LoadBalancerArn}" --output text | xargs -I {} aws elbv2 describe-listeners --load-balancer-arn {}
Este comando debería mostrarle que se creó un nuevo ALB y se crearon dos Listeners. No preste atención a que el oyente HTTP no parece tener la configuración de redireccionamiento correcta.
– YAML –
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: default
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/tags: createdBy=aws-controller
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:eu-central-1:XXXXXXXXXXXX:certificate/XXXXXXXXXXXXXXXXXXXXXXXXXX
labels:
app: nginx-ingress
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: ssl-redirect
servicePort: use-annotation
- path: /*
backend:
serviceName: nginx-service
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
namespace: default
name: nginx-service
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: YYYYYYYYYYYY.dkr.ecr.eu-central-1.amazonaws.com/webfe:latest
ports:
- containerPort: 80