Назад | Перейти на главную страницу

Балансировщик нагрузки AWS kubernetes завершает работу SSL на порту 443 и перенаправляет в службу на порт 80

Я пытаюсь настроить свой кластер EKS в AWS с помощью Контроллер входящего трафика Nginx.

Контроллер входящего трафика Nginx создает службу типа LoadBalancer, которая, в свою очередь, создает экземпляр ELB, сопоставленный с портами узла службы.

Я хотел бы, чтобы сертификат SSL управлялся AWS, а не кластером kubernetes, поэтому я импортировал его в AWS Certificate Manager и добавил аннотацию к сервису nginx:

service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <certificate_arn>

Пока это стандартная штука. Балансировщик нагрузки теперь выполняет завершение SSL, и последующая связь между ним и кластером не зашифрована, что я и хотел. Проблема только в том, что вместо этого:

[Client] -> HTTPS (443) -> [ELB (SSL termination)] -> HTTP (80) -> [Service]

Я понял это

[Client] -> HTTPS (443) -> [ELB (SSL termination)] -> HTTP (443) -> [Service]

Как вы можете видеть, ELB не меняет порт с 443 на 80, и соединение отклоняется модулем Nginx, потому что он получает незашифрованный трафик на порт 443.

Я пробовал аналогичную вещь с SSL / TCP ELB, но возникла та же проблема.

Я искал, но не смог найти никакого способа, как сказать ELB отправлять незашифрованный трафик на порт 80. Есть идеи?

Спасибо!

Вам необходимо настроить службу Ingress для использования targetPort: http даже при использовании 443 порт.

Вот пример использования Nginx Ingress и Amazon ELB со слушателями Layer 7 (HTTP / HTTPS):

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
    service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60"
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: http  # <--- PAY ATTENTION HERE