使用Traefik强制HTTPS

时间:2018-12-27 19:42:33

标签: kubernetes devops traefik

我正在将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 :(得分:2)

第一个是toml Traefik配置文件,可以在kubernetes中通过ConfigMap或在Traefik容器本身或在Traefik容器命令行中进行修改(取决于您部署Traefik Ingress Controller的方式) )。

第二个是主要用于通过Ingress Kubernetes资源在Traefik入口控制器中管理配置的东西。

您没有发布Ingress定义,但是很可能它没有处理HTTPS的方式,这就是为什么当您添加注释时,注释会将流量发送到端口443,而Traefik返回{{1} }。

要处理HTTPS / TLS,您需要enable it first(创建K8s证书密钥,在Ingress中配置TLS等)。或this is another example了解如何使用ConfigMap启用它。

答案 1 :(得分:0)

我为您提供的解决方案是有效的,因为尽管原始问题的表述不正确,但您还是对原始问题提供了正确的答案,这很糟糕。 我找到了一个相关的问题,可以回答我的问题,并且很有趣:

Unable to redirect from http to https behind AWS load balancer

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