我在我们的系统中有许多宁静的服务
- 有些是我们在Kubernetes集群中的
- 其他人在遗留基础设施上并托管在虚拟机上
我们的许多RESTful 服务相互之间进行同步调用(因此不能异步使用消息队列)
我们还有许多使用这些服务的 UI(胖客户端或 Web 应用程序)
我们可以像这样定义一个简单的 k8s 清单文件
- 荚
- 服务
- 入口
apiVersion: v1
kind: Pod
metadata:
name: "orderManager"
spec:
containers:
- name: "orderManager"
image: "gitlab-prem.com:5050/image-repo/orderManager:orderManager_1.10.22"
---
apiVersion: v1
kind: Service
metadata:
name: "orderManager-service"
spec:
type: NodePort
selector:
app: "orderManager"
ports:
- protocol: TCP
port: 50588
targetPort: 50588
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: orderManager-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /orders
pathType: Prefix
backend:
service:
name: "orderManager-service"
port:
number: 50588
我真的不确定集群上的宁静服务相互交谈的最佳方式是什么。
- 集群外的调用者似乎只有一条好路由,它使用由入口规则构建的 url
- 集群内的两个选项
这可以用一个例子来进一步说明
呼叫者 | 接收者 | 示例网址 | |
---|---|---|---|
用户界面 | 在集群上 | http://clusterip/orders | UI 将使用集群 ip 和入口规则到达订单管理器 |
集群外服务 | 在集群上 | http://clusterip/orders | 就像用户界面一样 |
在集群上 | 在集群上 | http://clusterip/orders | 可以使用类似上述方法的入口规则 |
在集群上 | 在集群上 | http://orderManager-service:50588/ | 可以直接使用服务名和端口 |
我在上面写了几次集群 ip ,但在现实生活中,我们把一些东西放在了顶部,所以有一个友好的名字,比如 http://mycluster/orders
所以当调用者和接收者都在集群上时
- 使用集群外的服务和应用程序也使用的入口规则
- 使用入口规则中使用的节点端口服务名称
- 或者也许是别的东西!
使用nodeport 服务名称的一个好处是您不必更改基本 URL。
- 入口规则将额外元素附加到路由(在上述情况下为orders)
- 当我将 RESTful 服务从旧版迁移到 k8s 集群时,它会增加复杂性