我的后端有5个不同的部署,每个部署都在特定端口中服务请求。
前端服务与后端服务联系以提供必要的详细信息。后端服务应该能够(从5个部署之一中)决定所需的pod来满足请求。
是否可以将单个服务链接到多个部署,而不是创建5个不同的服务?
Kubernetes版本:1.12 正在使用的云:Amazon EKS
PS:我的要求与https://github.com/kubernetes/kubernetes/issues/24875不同 未回答类似问题:"Wire" multiple Deployments to one Service in Kubernetes
答案 0 :(得分:2)
您的要求的确切答案是:今天不可能。 正如您在issue和question(都面临相同的情况)中正确看到的那样,这可能是将来的实现。
可能的解决方案/解决方法是将问题委派给上层,但基本上这取决于情况,并且始终需要不同的服务。
假设您的部署是5个不同的应用程序,它们执行不同的操作(否则为什么5个不同的部署而不是n
副本有1个?)并假定它们是http应用程序,则可以使用ingress resource来执行以下操作:将流量流向正确的部署/服务(假设每个部署提供一项服务)。
如果5个部署是一起创建/更新/管理的(例如:都在同一个掌舵部署中),则可以创建扇出入口:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
- path: /bar
backend:
serviceName: service2
servicePort: 8080
- path: /aaaa
backend:
serviceName: service3
servicePort: 4200
- path: /bbbbb
backend:
serviceName: service4
servicePort: 8080
- path: /ccc
backend:
serviceName: service5
servicePort: 8080
或者,如果将5个部署分开,则可以按照相同的想法创建5个不同的入口服务:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-for-app-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 4200
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-for-app-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /bar
backend:
serviceName: service2
servicePort: 8080
以此类推。...
创建5个入口或1个扇出应该产生相同的结果。
这种方法在nginx ingress controller上效果很好,但只注意两件事
nginx.ingress.kubernetes.io/rewrite-target: /
是完全匹配。例如,如果您想从/foo
重定向到/
,并保留/foo
(/foo/something?parameter=parameter_value
到/something?parameter=parameter_value
)之后的所有uri,则您的入口重写规则应为像这样:apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-for-app-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo/(.*)
backend:
serviceName: service1
servicePort: 4200
path: /foo/(.*)
和路径:/foo/bar/(.*)
,其中对/foo/bar/something
的请求将匹配两条路径。该行为可能难以预测,并且,如果按预期方式运行,则可能会不稳定