Как вы находите оригинальный протокол (или порт) запросов, когда Kubernetes завершает SSL? - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу выполнить следующие перенаправления и убедиться, что все они происходят за один шаг:

У меня есть кластер Kubernetes (1.15.5) на Цифровом океане с использованием stable/nginx-ingress (устанавливается через helm), а также использует cert-manager для обработки SSL.

В моем Ingress config я отключил перенаправление ssl, так как хочу обработать это в самих сервисах:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: proxy
  namespace: default
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    certmanager.k8s.io/issuer: "letsencrypt-prod"
    certmanager.k8s.io/acme-challenge-type: http01
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  tls:
  - hosts:
    - example.com
    - www.example.com
    secretName: tls-example-com
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
  - host: www.example.com
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80

Одной из моих услуг является сервер nginx:

server {
    server_name  example.com;
    return 301 https://wwww.$host$request_uri;
}

server {
    server_name  www.example.com;

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }

    # app
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

Однако $scheme здесь всегда означает «http», что имеет смысл, поскольку моя служба принимает запросы только через порт 80. Но так же, какисходный адрес (информация о хосте) пересылается на мой сервис, как я могу узнать, какой был оригинальный порт?

1 Ответ

2 голосов
/ 07 ноября 2019

Nginx, установленный входным контроллером, действует как обратный прокси-сервер и вставляет заголовки X-Forwarded- * для служб, которые за ним читают. Ваша служба должна использовать их для получения правильного IP-адреса, порта или схемы клиента.

Для nginx вы можете использовать $http_x_forwarded_proto:

  if ($http_x_forwarded_proto != "https") {
    return 301 https://$host$request_uri;
  }
...