使用 Traefik 强制 HTTPS
Force HTTPS with Traefik
我在 K8s 集群中使用 traefik 作为入口控制器。我想通过 HTTPS 强制执行所有流量。
文档有点混乱,因为显然有不同的方法可以做同样的事情?也就是说,我想知道这两个之间有什么区别:
- https://docs.traefik.io/user-guide/examples/#http-redirect-on-http
- https://docs.traefik.io/configuration/backends/kubernetes/#general-annotations
如果我用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 文件(或者至少我没有找到等效的注释问题)。
我在 K8s 集群中使用 traefik 作为入口控制器。我想通过 HTTPS 强制执行所有流量。
文档有点混乱,因为显然有不同的方法可以做同样的事情?也就是说,我想知道这两个之间有什么区别:
- https://docs.traefik.io/user-guide/examples/#http-redirect-on-http
- https://docs.traefik.io/configuration/backends/kubernetes/#general-annotations
如果我用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 文件(或者至少我没有找到等效的注释问题)。