Принудительно HTTPS с Traefik - PullRequest
0 голосов
/ 27 декабря 2018

Я использую traefik в качестве входного контроллера в кластере K8s.Я хотел бы обеспечить весь трафик через HTTPS.

Это немного сбивает с толку документацию, потому что, очевидно, есть разные способы сделать то же самое?А именно, я хотел бы знать, в чем разница между этими 2:

Если я использую K8sдостаточно использовать общие аннотации или мне еще нужно отредактировать файл TOML?

Я пытался использовать traefik.ingress.kubernetes.io/redirect-entry-point: https, но не нашел службы, поэтому, по-моему, чего-то не хватает в моей конфигурации.

Если я удаляю приведенную выше строку, то все работает, но HTTP ->HTTPS, конечно, не работает.Когда я помещаю строку назад, она возвращает 404.

FWIW, определение входа следующее (с перенаправлением traefik на 404):

  - apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      generation: 1
      name: rekover-ingress
      namespace: prod
      annotations:
        kubernetes.io/ingress.class: traefik
        traefik.ingress.kubernetes.io/frontend-entry-points: http, https
        traefik.ingress.kubernetes.io/redirect-entry-point: https
    spec:
      rules:
        - host: www.xxx.com
          http:
            paths:
              - backend:
                  serviceName: xxx-frontend
                  servicePort: 80

Я пробовал ту же самую конфигурацию сnginx и переходя на соответствующие метаданные и работали!Ниже приведены метаданные, используемые для nginx и Ingress:

nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/ingress.class: nginx

Для полноты я скопировал и вставил определение сервиса для nginx и traefik.Первый работает как положено:

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-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:xxxx
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
spec:
  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
  type: LoadBalancer
</code>
<code>
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: ingress-prod
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:xxxx
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - name: http
      port: 80
      targetPort: http
      protocol: TCP
    - name: https
      port: 443
      targetPort: http
      protocol: TCP
  type: LoadBalancer

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я даю вам правильное решение, потому что вы дали правильный ответ на исходный вопрос, хотя исходный вопрос был сформулирован плохо, мой плохой.Я нашел связанный вопрос, который отвечает на мой вопрос и работал как чудо:

Невозможно перенаправить с http на https за балансировщиком нагрузки AWS

Что меня раздражает, так это то, чтонапример, с помощью nginx достаточно использовать аннотации метаданных для принудительного перенаправления на ssl, тогда как с помощью traefik вам нужно отредактировать файл TOML (или, по крайней мере, я не нашел эквивалентную аннотацию для проблемы).

0 голосов
/ 28 декабря 2018

Первый - это файл конфигурации toml Traefik, который можно изменить в Kubernetes с помощью ConfigMap или в самом контейнере Traefik, или в командной строке контейнера Traefik (в зависимости от того, как вы развернули контроллер входа Traefik).

Второе - это то, что в основном используется для управления конфигурацией в контроллере входа Traefik через ресурс Ingress Kubernetes.

Вы не опубликовали свое определение Ingressно, скорее всего, у него нет способа обработки HTTPS, и поэтому, когда вы добавляете аннотацию, он отправляет трафик на порт 443, а Traefik возвращает 404.

Для обработки HTTPS / TLS вы должнынеобходимо сначала включить его (создать секретный сертификат K8s, настроить TLS на входе и т. д.).Или это еще один пример о том, как включить его с помощью ConfigMap.

...