我正在将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
答案 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文件(或者至少我没有找到该问题的等效注释)