【问题标题】:how to send request to all instance of service (POD/ReplicaSet) behind NGINX load balancer如何向 NGINX 负载均衡器后面的所有服务实例(POD/ReplicaSet)发送请求
【发布时间】:2022-01-24 20:40:48
【问题描述】:

我有运行在 AKS 上的 Web api 应用程序有 2 个副本,因此同一应用程序的 2 个实例/副本正在运行,并且后面我们有 NGINX 负载均衡器,它在两个实例/副本之间分配流量。

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

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

服务 URL 类似于https://XXXXX.com:12345/logLevel,当通过 POSTMAN 工具执行此操作时,它仅对一个副本/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: /$1
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

【问题讨论】:

  • 请显示您的 nginx 平衡器配置
  • @AlexanderUshakov,请检查我的入口规则,更新!

标签: nginx kubernetes asp.net-core-webapi azure-aks


【解决方案1】:

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

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

我能想到的唯一解决方案是将每个 pod 分解为具有匹配服务的自己的部署。确保所有部署至少有一个共同标签和其他唯一标签。然后创建一个以共享标签为目标的所有 pod 的服务,并为各个标签创建单独的服务。然后创建您的 Ingress 规则,以便默认路径转到共享服务,并为您自己创建进入各个 pod 的“后门”。

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

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

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

【讨论】:

  • 感谢@Patrick 的所有建议。您能否建议使用kubectl patch 或一些代码行对 Serilog 进行良好的阅读。我可以将日志级别移动到环境变量。感谢您的帮助。
  • set 命令在这里帮助kubectl set env deployment/velero AWS_CLUSTER_NAME=test-cluster 吗? POD 是否会使用这些 patchset 命令重新启动?
  • 是的,同样的事情,一旦你更新了部署,它就会推出变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2013-10-12
  • 2015-11-07
  • 2018-03-10
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多