在 k8s 集群中,我应该始终调用入口规则或节点端口服务名称吗?
Within a k8s cluster Should I always call the Ingress Rule Or Node Port Service Name?
我在我们的系统中有许多 restful 服务
- 有些是我们的 在 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
我真的不确定集群上 restful 服务 相互通信的最佳方式。
- 集群外的调用者似乎只有一条好的路由,即使用由入口规则
构建的url
- 集群中的两个选项
这可以通过示例进一步说明
Caller
Receiver
Example Url
UI
On Cluster
http://clusterip/orders
The UI would use the cluster ip and the ingress rule to reach the order manager
Service off cluster
On Cluster
http://clusterip/orders
Just like the UI
On Cluster
On Cluster
http://clusterip/orders
Could use ingress rule like the above approach
On Cluster
On Cluster
http://orderManager-service:50588/
Could use the service name and port directly
我在上面写了几次cluster ip但是在现实生活中我们把一些东西放在最上面所以有一个友好的名字比如http://mycluster/orders
所以当呼叫者和接收者都在集群上时,是
- 使用 入口规则,它也被集群外的服务和应用程序使用
- 使用在入口规则
中使用的nodeport服务名称
- 或者别的东西!
使用 nodeport 服务名称 的一个好处 是您不必更改基础 URL。
- 入口规则附加一个额外元素到路由(在上面的例子中订单)
- 当我将 restful 服务从旧版移动到 k8s 集群时,它会增加复杂性
这取决于您是否希望通过入口控制器路由请求。
发送到 Ingress 资源中配置的完整 URL 的请求将由您的 Ingress 控制器处理。控制器本身——在这种情况下是 NGINX——将把请求代理到服务。然后请求将被路由到 Pod。
直接将请求发送到服务的 URL 会跳过您的入口控制器。请求直接路由到 Pod。
两个选项之间的取舍取决于您的设置。
通过入口控制器发送请求会增加请求延迟和资源消耗。如果您的入口控制器除了路由请求之外什么都不做,我建议直接向服务发送请求。
但是,如果您将入口控制器用于其他目的,例如身份验证、监视、日志记录或跟踪,那么您可能更希望控制器处理内部请求。
例如,在我的一些集群上,我使用 NGINX 入口控制器来测量请求延迟并跟踪 HTTP 响应状态。我通过入口控制器在同一集群中的应用程序 运行 之间路由请求,以便使该信息可用。为了提高可观察性,我付出了增加延迟和资源使用的代价。
在您的情况下权衡取舍是否值得取决于您。如果你的入口控制器只做基本路由,那么我的建议是完全跳过它。如果它做的更多,那么你需要权衡通过它路由请求的利弊。
我在我们的系统中有许多 restful 服务
- 有些是我们的 在 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
我真的不确定集群上 restful 服务 相互通信的最佳方式。
- 集群外的调用者似乎只有一条好的路由,即使用由入口规则 构建的url
- 集群中的两个选项
这可以通过示例进一步说明
Caller | Receiver | Example Url | |
---|---|---|---|
UI | On Cluster | http://clusterip/orders | The UI would use the cluster ip and the ingress rule to reach the order manager |
Service off cluster | On Cluster | http://clusterip/orders | Just like the UI |
On Cluster | On Cluster | http://clusterip/orders | Could use ingress rule like the above approach |
On Cluster | On Cluster | http://orderManager-service:50588/ | Could use the service name and port directly |
我在上面写了几次cluster ip但是在现实生活中我们把一些东西放在最上面所以有一个友好的名字比如http://mycluster/orders
所以当呼叫者和接收者都在集群上时,是
- 使用 入口规则,它也被集群外的服务和应用程序使用
- 使用在入口规则 中使用的nodeport服务名称
- 或者别的东西!
使用 nodeport 服务名称 的一个好处 是您不必更改基础 URL。
- 入口规则附加一个额外元素到路由(在上面的例子中订单)
- 当我将 restful 服务从旧版移动到 k8s 集群时,它会增加复杂性
这取决于您是否希望通过入口控制器路由请求。
发送到 Ingress 资源中配置的完整 URL 的请求将由您的 Ingress 控制器处理。控制器本身——在这种情况下是 NGINX——将把请求代理到服务。然后请求将被路由到 Pod。
直接将请求发送到服务的 URL 会跳过您的入口控制器。请求直接路由到 Pod。
两个选项之间的取舍取决于您的设置。
通过入口控制器发送请求会增加请求延迟和资源消耗。如果您的入口控制器除了路由请求之外什么都不做,我建议直接向服务发送请求。
但是,如果您将入口控制器用于其他目的,例如身份验证、监视、日志记录或跟踪,那么您可能更希望控制器处理内部请求。
例如,在我的一些集群上,我使用 NGINX 入口控制器来测量请求延迟并跟踪 HTTP 响应状态。我通过入口控制器在同一集群中的应用程序 运行 之间路由请求,以便使该信息可用。为了提高可观察性,我付出了增加延迟和资源使用的代价。
在您的情况下权衡取舍是否值得取决于您。如果你的入口控制器只做基本路由,那么我的建议是完全跳过它。如果它做的更多,那么你需要权衡通过它路由请求的利弊。