是否可以“统一”在kubernetes中运行的单个服务的端点?例如,我有两项服务:
两个服务都使用其自己的端口公开。例如:http://localhost:30888/api/user
和http://localhost:30884/api/post
。
现在我想要一个这样的界面:
http://localhost:8080/api/user
和http://localhost:8080/api/post
。我该如何配置?
使用以下方法公开服务:
apiVersion: v1
kind: Service
metadata:
name: post-service
labels:
app: post-service
spec:
type: NodePort
ports:
- port: 44884
nodePort: 30884
selector:
app: post
答案 0 :(得分:3)
这听起来像是您要在服务顶部添加Ingress。入口可以做很多事情,包括根据路径将流量发送到不同的服务。
让您入门的Ingress可能类似于:
css
在幕后,使Ingress工作的原因取决于您如何运行Kubernetes集群。例如,如果您使用的是GKE,则实际上将Ingress实现为HTTP load balancer。如果您使用的是EKS,则将其实现为Application load balancer。每个负载均衡器都有很多功能和选项,但是在开始任何操作之前,您应该了解的最大功能是,它们将在运行集群的基础上增加额外的费用。
编辑:
正如评论中提到的Prometherion,Ingress允许来自群集外部的流量。如果您正在运行某种类型的公开网站,则可能是您想要的。但是,如果这些是不应暴露给外部世界的内部端点,则可能需要调查service meshes from prometherion's answer。
答案 1 :(得分:2)
实际上,使用Kubernetes默认资源是不可能的:您必须根据自己的喜好使用Istio,Maesh或Linkerd之类的可用服务网格,或者使用简单的代理(NGINX,HAproxy或使用http/net
标准库的简单GoLang应用程序。)
我不是Istio的专家(实际上这是可用的最常用的Service Mesh之一),但是VirtualService可能可以解决问题,并提供 DestinationRule 资源。 / p>
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- you-service.your-namespace.svc.cluster.local
http:
- name: user-v1-routes
match:
- uri:
prefix: "/api/user"
route:
- destination:
host: user-service.your-namespace.svc.cluster.local
subset: v1
- name: post-v1-route
route:
- destination:
host: post-service.your-namespace.svc.cluster.local
subset: v1
match:
- uri:
prefix: "/api/post"
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: user-destination
spec:
host: user-service.yout-namespace.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
app: user
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: post-destination
spec:
host: post-service.yout-namespace.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
app: post
YMMV和YAML只是说明性的。