使用 Traefik 强制 HTTPS

Force HTTPS with Traefik

我在 K8s 集群中使用 traefik 作为入口控制器。我想通过 HTTPS 强制执行所有流量。

文档有点混乱,因为显然有不同的方法可以做同样的事情?也就是说,我想知道这两个之间有什么区别:

如果我用K8s用通用注解就够了还是还要编辑TOML文件?

我已经尝试使用 traefik.ingress.kubernetes.io/redirect-entry-point: https 但没有找到该服务,所以我猜我的配置中缺少某些东西。

如果我删除上面的行,那么一切正常,但 HTTP -> HTTPS 当然不工作。当我把线放回去时 returns 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

第一个是toml Traefik配置文件,可以在Kubernetes中通过ConfigMap修改,也可以在Traefik容器本身修改,也可以在Traefik容器命令行修改(取决于你部署Traefik的方式)入口控制器)。

第二个主要用于通过 Ingress Kubernetes 资源管理 Traefik Ingress Controller 中的配置。

您没有 post 您的 Ingress 定义,但很可能它没有处理 HTTPS 的方法,这就是为什么当您添加注释时它会将流量发送到端口 443 和 Traefik returns一个404.

要处理 HTTPS/TLS,您需要 enable it first (Create a K8s cert secret, configure TLS in the Ingress, etc). Or this is another example 了解如何使用 ConfigMap 启用它。

我给你的解决方案是有效的,因为你提供了对原始问题的正确答案,尽管原始问题的表述很糟糕,我的错。 我发现了一个相关的问题,它回答了我的问题并且非常有效:

让我沮丧的是,例如,使用 nginx 就足以使用元数据注释强制重定向到 ssl,而使用 traefik 你必须编辑 TOML 文件(或者至少我没有找到等效的注释问题)。