我的后端有 5 个不同的部署,每个部署都在特定端口处理请求。
前端服务使用必要的详细信息联系后端服务。后端服务应该能够决定所需的 pod(来自 5 个部署之一)来满足请求。
不是创建 5 个不同的服务,是否可以将单个服务链接到多个部署?
Kubernetes 版本:1.12 使用的云:Amazon EKS
PS:我的要求和https://github.com/kubernetes/kubernetes/issues/24875不一样 类似的问题没有答案:"Wire" multiple Deployments to one Service in Kubernetes
最佳答案
您的问题的确切答案是:今天不可能。 正如您在 issue 中正确看到的那样在question (都面临同样的情况)这可能是 future 的实现。
一个可能的解决方案/解决方法是将问题委托(delegate)给上层,但这基本上取决于情况,并且总是需要不同的服务。
假设您的部署是 5 个不同的应用程序,它们做不同的事情(否则为什么是 5 个不同的部署而不是 1 个具有 n
副本?)并假设它们是 http 应用程序,您可以使用 ingress resource将流量路由到正确的部署/服务(假设每个部署一项服务)。
如果您的 5 个部署是一起创建/更新/管理的(例如:都在同一个 helm 部署中),您可以创建一个扇出入口:
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但只注意两件事
- path match: with the nginx controller version > 0.22
nginx.ingress.kubernetes.io/rewrite-target:/
为精确匹配。例如,如果您想从/foo
重定向到/
保留/foo
之后的所有 uri (/foo/something ?parameter=parameter_value
到/something?parameter=parameter_value
)你的入口重写规则应该是这样的:
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/(.*)
和 path:/foo/bar/(.*)
其中请求/foo/bar/something
将匹配这两个路径。该行为可能难以预测,如果它按预期工作,它也不会稳定
关于kubernetes - 单个服务中的多个部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57324932/