我有一个简单的网站运行在我的Kubernetes集群中,并通过Traefik向Internet公开。我的Ingress对象如下所示(我在这里只更改了名称和域名):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-staging
kubernetes.io/ingress.class: traefik
name: my-cool-website
namespace: default
spec:
rules:
- host: my-cool-website.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-cool-website
port:
number: 80
- host: www.my-cool-website.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-cool-website
port:
number: 80
tls:
- hosts:
- my-cool-website.com
- www.my-cool-website.com
secretName: my-cool-website-tls
这个工作。它允许我从my-cool-website.com
或www.my-cool-website.com
访问网站。但我希望发生的是,如果有人访问前者,Traefik会自动将他们重定向到后者。我在网上找到了一些推荐创建Traefik中间件的指南,所以我就这样做了。但不幸的是,它并没有像预期的那样工作。下面是我的中间件定义:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-cool-website-force-www
spec:
redirectRegex:
regex: ^https?://my-cool-website.com/(.*)
replacement: https://www.my-cool-website.com/${1}
然后,我将以下注解添加回ingress对象:
traefik.ingress.kubernetes.io/router.middlewares: my-cool-website-force-www
但一旦我这样做,它就会破坏我的Web应用程序。我的意思是,当应用注解时,而不是服务于我的网站,当我试图访问域时,我开始看到一个通用的nginx页面,看起来像这样(而且它也不执行重定向):
我不得不假设这个Hello World页面是由Traefik作为某种通用默认页面提供的,因为它肯定不是来自我的pod。所以这告诉我这个中间件(或者我是如何用注解调用它的)不起作用。我错过了什么?
1条答案
按热度按时间deyfvvtc1#
通过端口转发到Traefik Dashboard并查看那里的服务,我发现了这个问题。它显示了一个中间件未找到的错误。然后我点击了中间件,意识到它们最终使用了一个更长的规范名称。所以在我的注解中,我不得不将引用从
my-cool-website-force-www
更改为default-my-cool-website-force-www@kubernetescrd
,然后一切都正常了。