我在AKS Kubernetes Cluster 1.22.6上使用Traefik 2.7.0。目前,所有内容都路由到相同的服务:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: api
namespace: namespace1
spec:
entryPoints:
- websecure
routes:
- match: Host(`api.my-domain.com`)
kind: Rule
services:
- name: api
namespace: namespace1
port: 80
tls:
secretName: api-my-domain-com-cert
我目前正在将API资源从这个服务外部化到一个专用的新服务(“/users”),因为将来会有其他服务需要相同的功能。
我尝试(但失败了)做的是将对“/users”的调用路由到新服务:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: api
namespace: namespace1
spec:
entryPoints:
- websecure
routes:
- match: Host(`api.my-domain.com`) && Path(`/users`)
kind: Rule
services:
- name: users-api
namespace: namespace2
port: 80
- match: Host(`api.my-domain.com`)
kind: Rule
services:
- name: api
namespace: namespace1
port: 80
tls:
secretName: api-baywa-lusy-com-cert
我尝试了Path(..)
和PathPrefix(..)
,但没有成功,所有内容仍然路由到旧服务,新服务的输出略有不同,所以我可以肯定它仍然路由到旧服务。
手动添加优先级也没有帮助:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: api
namespace: namespace1
spec:
entryPoints:
- websecure
routes:
- match: Host(`api.my-domain.com`) && Path(`/users`)
kind: Rule
priority: 2000
services:
- name: users-api
namespace: namespace2
port: 80
- match: Host(`api.my-domain.com`)
kind: Rule
priority: 1000
services:
- name: api
namespace: namespace1
port: 80
tls:
secretName: api-baywa-lusy-com-cert
我错过了什么吗?任何帮助都是感激的!
谢谢你,
此致,
帕斯卡
1条答案
按热度按时间6jygbczu1#
您只能在与IngressRoute资源相同的命名空间中公开服务。如果您在部署IngressRoute时查看Traefik Pod的日志,您应该会看到如下内容:
time=“2023-01- 26 T13:57:17 Z”级别=错误消息=“服务命名空间2/用户-api不在父资源命名空间1中”提供程序名称=kubernetescrd入口=命名空间1命名空间=命名空间1
要完成您想要的任务,您需要创建两个单独的IngressRoute资源,一个在
namespace1
中,另一个在namespace2
中。在
namespace1
中:在
namespace2
中:您可以找到我用来测试here配置的所有文件。
我不知道明确的优先级是否必要;没有它们我也能用,但也许我只是很幸运,所以我把它们留在了那里。我通常会假设“更具体的路线”优先于“不太具体的路线”,但我不知道这是否真的是真的。