在 k8s 集群中,我应该始终调用入口规则或节点端口服务名称吗?

Within a k8s cluster Should I always call the Ingress Rule Or Node Port Service Name?

我在我们的系统中有许多 restful 服务

我们的许多 restful 服务 相互进行 同步调用 (因此不异步使用消息队列)

我们还有许多 UI(胖客户端或 Web 应用程序)使用这些服务

我们可能会像这样定义一个简单的 k8s 清单文件

  1. 连播
  2. 服务
  3. 入口
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 服务 相互通信的最佳方式。

这可以通过示例进一步说明

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 服务名称 的一个好处 是您不必更改基础 URL。

这取决于您是否希望通过入口控制器路由请求。

发送到 Ingress 资源中配置的完整 URL 的请求将由您的 Ingress 控制器处理。控制器本身——在这种情况下是 NGINX——将把请求代理到服务。然后请求将被路由到 Pod。

直接将请求发送到服务的 URL 会跳过您的入口控制器。请求直接路由到 Pod。

两个选项之间的取舍取决于您的设置。

通过入口控制器发送请求会增加请求延迟和资源消耗。如果您的入口控制器除了路由请求之外什么都不做,我建议直接向服务发送请求。

但是,如果您将入口控制器用于其他目的,例如身份验证、监视、日志记录或跟踪,那么您可能更希望控制器处理内部请求。

例如,在我的一些集群上,我使用 NGINX 入口控制器来测量请求延迟并跟踪 HTTP 响应状态。我通过入口控制器在同一集群中的应用程序 运行 之间路由请求,以便使该信息可用。为了提高可观察性,我付出了增加延迟和资源使用的代价。

在您的情况下权衡取舍是否值得取决于您。如果你的入口控制器只做基本路由,那么我的建议是完全跳过它。如果它做的更多,那么你需要权衡通过它路由请求的利弊。