Имеется приложение двух версий — старое и новое, и два домена — старый, и новый.
Работает в AWS Elastic Kubernetes Service, за AWS LoadBalancer, который создаётся из AWS ALB Ingress Controller.
Задача — добавить редирект на LoadBalancer со старого домена на новый:
- старый: dev.api.old-example.com
- новый: dev.api.new-example.com
В самом AWS LoadBalancer это делается через Listener Rules, в случае с Kubernetes AWS ALB Ingress Controller — используем Ingress annotations, которые потом применятся к листенеру.
Сейчас Ingress ресурс старого приложения выглядит так:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
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:us-east-2:534***385:certificate/2811e48b-***-971272859a74
alb.ingress.kubernetes.io/healthcheck-path: /is-running
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
alb.ingress.kubernetes.io/load-balancer-attributes: access_logs.s3.enabled=true,access_logs.s3.bucket=access-logs-eksdev1,access_logs.s3.prefix=apps
alb.ingress.kubernetes.io/scheme: internet-facing
kubernetes.io/ingress.class: alb
...
spec:
rules:
- http:
paths:
- backend:
serviceName: ssl-redirect
servicePort: use-annotation
path: /*
- backend:
serviceName: apps-backend-svc
servicePort: 80
path: /*
И Listener 443 порта отправляет трафик на AWS TargetGroup с Kubernetes WorkerNodes:
Добавляем новую аннотацию, в которой описываем 301 редирект на домен dev.api.new-example.com:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/actions.redirect-to-quiz: '{"Type":"redirect","RedirectConfig":{"Host":"dev.api.new-example.com","Path":"/#{path}","Port":"443","Protocol":"HTTPS","Query":"#{query}","StatusCode":"HTTP_301"}}'
...
Далее, обновляем spec.rules.
Вместо редиректа на Service бекенда, который в свою очередь отправляет трафик к подам со старым приложением:
...
- backend:
serviceName: apps-backend-svc
servicePort: 80
path: /*
...
Указываем использование аннотации, которую добавили выше:
...
- backend:
serviceName: redirect-to-quiz
servicePort: use-annotation
path: /*
...
Сохраняем, проверям Lisneter 443 порта ещё раз:
И проверяем работу редиректа:
[simterm]
$ curl -LvI https://dev.api.old-example.com ... < HTTP/2 301 HTTP/2 301 < server: awselb/2.0 server: awselb/2.0 ... < location: https://dev.api.new-example.com:443/ location: https://dev.api.new-example.com:443/ < * Connection #0 to host dev.api.old-example.com left intact * Issue another request to this URL: 'https://dev.api.new-example.com:443/' * Trying 3.***.***.151:443... * Connected to dev.api.new-example.com (3.***.***.151) port 443 (#1) ...
[/simterm]
Редирект работает, готово.

