我想在网关和服务发现后面的kubernetes中部署RESTService。有一段时间,我将拥有我的RestService版本1和我的RestService版本2。
两者都具有完全相同的URL,但是我可以将它们部署在标记版本的Pod中。当我调用RESTService时,我想在HTTP标头中添加一些内容,表明我想使用我的V2。
有什么方法可以将流量正确路由到Pod集? (我不确定使用标签是否正确)。我还必须谨记,将来我将使用带有新服务的V3,并且我的网址也会更改,它不能是静态配置的。我还将在v1中使用serviceA 以及带有v3的servicesB。两者都在同一个服务发现之后,都必须使用header参数(或类似参数)正确路由。
我不确定Envoy是否适合此操作,还是还有其他内容?我不确定何时应该放置此组件。 我错过了一些东西,我仍然对kubernetes感到困惑。有人有类似的例子吗?
答案 0 :(得分:1)
是的,服务需要标签选择器,如果您根据版本设置标签,则可以使用该标签选择器。大多数Ingress Controller或其他代理都使用服务(或由它管理的端点)来选择后端实例。
答案 1 :(得分:1)
是的,您可以有两个 Deployment
,带有不同的标签,例如
kind: Deployment
metadata:
name: rest-service-v1
labels:
app: rest-service
spec:
selector:
matchLabels:
app: rest-service
version: v1
template:
metadata:
labels:
app: rest-service
version: v1
kind: Deployment
metadata:
name: rest-service-v3
labels:
app: rest-service
spec:
selector:
matchLabels:
app: rest-service
version: v3
template:
metadata:
labels:
app: rest-service
version: v3
然后为每个创建一个Service
:
kind: Service
metadata:
name: rest-service-v1
spec:
selector:
app: rest-service
version: v1
kind: Service
metadata:
name: rest-service-v3
spec:
selector:
app: rest-service
version: v3
,最后是一个Ingress
对象。但是,默认的Ingress只能通过 path 进行路由。您可能会找到可以按 Header Value
kind: Ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /v1/*
backend:
serviceName: rest-service-v1
servicePort: 8080
- path: /v3/*
backend:
serviceName: rest-service-v3
servicePort: 8080