如何向 NGINX 负载均衡器后面的所有服务实例 (POD/ReplicaSet) 发送请求

how to send request to all instance of service (POD/ReplicaSet) behind NGINX load balancer

我在 AKS 上有 web api 应用程序 运行 有 2 个副本,因此有 2 个 instance/Replica 相同的应用程序 运行 在后面我们有 NGINX 负载均衡器,它分布了instances/Replica.

之间的流量

现在我有一个 PUT/POST 端点,用于使用 Serilog 动态更改日志级别。

[HttpPut("logLevel")]
 public IActionResult ChangeLevel(LogEventLevel eventLevel)
 {
     _levelSwitch.MinimumLevel = eventLevel;
     return Ok();
 }

服务 URL 类似于 https://XXXXX.com:12345/logLevel,当通过 POSTMAN 工具执行此服务时,只有一个 replica/POD 有效,而另一个无效(当然!)。

问题是,我在这里有什么选择,以便我可以对服务的所有副本执行 API 调用?有开箱即用的解决方案吗?

谢谢。

入口规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - XXXXX.com
    secretName: aks-ingress-tls
  rules:
  - host: XXXXX.com
  - http:
      paths:
      - path: /Servive1/(.*)
        pathType: Prefix
        backend:
          service:
            name: Servive1
            port:
              number: 12345

没有什么好的方法可以做到这一点。您希望在无状态部署中更改 pod 的状态。 Ingress 将流量分配给单个 deployment/service 的所有 pods。无法强制入口将流量发送到特定的 pod。

如果您删除任何类型的粘性会话,那么多个 POST 最终应该到达您的所有 pods 并相应地更新状态,但它不可靠。

我能想到的实现此目的的唯一解决方案是将每个 pod 分解为具有匹配服务的自己的部署。确保所有部署至少有一个通用标签和唯一的其他标签。然后创建一项针对所有具有共享标签的 pods 的服务,并为单独的标签创建单独的服务。然后创建您的 Ingress 规则,以便默认路径进入共享服务,并为您自己创建进入个人 pods.

的“后门”

这不是一个很好的解决方案。

或者,您可能想要使用有状态集,然后在您的集群中有一个 pod 运行 可以接收 HTTP 请求以更改日志记录级别。当该请求到达时,该 pod 将向每个 pods 发送 HTTP 请求(因为您可以使用无头服务路由到单个 pods)。这需要更多的工作和开销,但可以可靠地处理单个请求。

最后一点,是否可以将日志级别设置为部署中的变量?如果你能做到这一点,而不是直接向 pod 发出 HTTP 请求,你只需要使用一个 kubectl patch 命令来更新你的部署,所有 pods 都会受到影响。