Исключить определенные хосты из перенаправления ssl в Kubernetes Nginx Ingress - PullRequest
0 голосов
/ 24 января 2019

В моем кластере kubernetes настроен входной контроллер Nginx, который по умолчанию выполняет перенаправление https для всех полученных запросов, поэтому http://example.com автоматически перенаправляется на https://example.com.

Теперь у меня есть хост, который мне нужно обслуживать через http, а не через https, по сути исключая его из перенаправления ssl. Я обнаружил, что я могу отключить перенаправление ssl для всего входа, но не для конкретного хоста.

My Ingress yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: ingress
annotations:
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - mysslsite.co.uk
secretName: tls-secret

rules:
 - host: my-ssl-site.co.uk
   http:
    paths:
    - path: /
      backend:
        serviceName: my-service
        servicePort: 80
 - host: my-non-ssl-site.co.uk
   http:
      paths:
      - path: /
        backend:
          serviceName: my-other-service
          servicePort: 80

Моя карта конфигурации:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: nginx-ingress
    chart: nginx-ingress-0.28.3
    component: controller
    heritage: Tiller
    release: nginx-ingress
  name: undercooked-moth-nginx-ingress-controller
  namespace: default
data:
  proxy-buffer-size: "512k"
  client-header-buffer-size: "512k"
  proxy-body-size: "100m"
  large-client-header-buffers: "4 512k"
  http2-max-field-size: "512k"
  http2-max-header-size: "512k"
  fastcgi_buffers: "16 16k" 
  fastcgi_buffer_size: "32k"

Что я пробовал:

  1. Попытайтесь отключить ssl-перенаправление по всей плате и задайте правило для перенаправления на сайт, требующий ssl-https, установив аннотацию nginx.ingress.kubernetes.io/ssl-redirect: "false" и добавив следующий фрагмент конфигурации:

    nginx.ingress.kubernetes.io/configuration-snippet: |
          if ($host = 'my-ssl-site.co.uk' ) {
            rewrite ^ https://my-ssl-site.co.uk$request_uri permanent;
          }
    

    Это удаляет перенаправление https, но приводит к ошибке too many redirects для сайта, требующего ssl.

  2. Попытка добавить правила в ConfigMap согласно этому ответу для отключения перенаправления ssl и обработки условного перенаправления в фрагменте конфигурации сервера, но это все равно привело к перенаправлению ssl.

  3. Попытался добавить второй входной контроллер, чтобы на одном можно было включить ssl-перенаправление, а на другом - отключить его. Я создал контроллер, но я думаю, что мне также нужно создать второй вход nginx и настроить и пометить приложения, которые будут возвращены каждому? Это кажется излишним, когда все, что я хочу сделать, это исключить одну службу в кластере из перенаправления ssl.

Есть ли что-то очевидное, чего мне не хватает? Такое ощущение, что не должно быть так сложно добавить простое правило для исключения одного хоста из ssl-redirect.

1 Ответ

0 голосов
/ 25 января 2019

Вы можете создать два объекта Ingress, по одному для каждого сайта в одном и том же пространстве имен.

Использовать аннотацию nginx.ingress.kubernetes.io/ssl-redirect: "true" для сайта SSL

Использовать аннотацию nginx.ingress.kubernetes.io/ssl-redirect: "false" для сайта без SSL

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: cmac-ingress
   namespace: ns1
   annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - my-ssl-site.co.uk
    secretName: testsecret-tls
  rules:
  - host: my-ssl-site.co.uk
    http:
      paths:
      - path: /
        backend: 
          serviceName: my-service
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: cmac-ingress1
   namespace: ns1
   annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  tls:
  - hosts:
    - my-site.co.uk
    secretName: testsecret-tls
  rules:
  - host: my-site.co.uk
    http:
      paths:
      - path: /
        backend: 
          serviceName: my-service
          servicePort: 80

Вот результат из файла ingress-controller nginx.conf:

    ## start server my-site.co.uk
    server {
            server_name my-site.co.uk ;

            listen 80;

            set $proxy_upstream_name "-";

            listen 443  ssl http2;

            # PEM sha: ffa288482443e529d72a0984724f79d5267a2a22
            ssl_certificate                         /etc/ingress-controller/ssl/default-fake-certificate.pem;
            ssl_certificate_key                     /etc/ingress-controller/ssl/default-fake-certificate.pem;

            location / {

                    <some lines skipped>

                    if ($scheme = https) {
                            more_set_headers                        "Strict-Transport-Security: max-age=15724800; includeSubDomains";
                    }

                    <some lines skipped>

            }

    }       
    ## end server my-site.co.uk

    ## start server my-ssl-site.co.uk
    server {
            server_name my-ssl-site.co.uk ;

            listen 80;

            set $proxy_upstream_name "-";

            listen 443  ssl http2;

            # PEM sha: ffa288482443e529d72a0984724f79d5267a2a22
            ssl_certificate                         /etc/ingress-controller/ssl/default-fake-certificate.pem;
            ssl_certificate_key                     /etc/ingress-controller/ssl/default-fake-certificate.pem;

            location / {


                    <some lines skipped>

                    if ($scheme = https) {
                            more_set_headers                        "Strict-Transport-Security: max-age=15724800; includeSubDomains";
                    }

                    # enforce ssl on server side
                    if ($redirect_to_https) {

                            return 308 https://$best_http_host$request_uri;

                    }

                    <some lines skipped>

            }

    }    
    ## end server my-ssl-site.co.uk

Дополнительный раздел перенаправления можно найти в определении сайта с применением SSL:

# enforce ssl on server side
if ($redirect_to_https) {

        return 308 https://$best_http_host$request_uri;

}
...