首页 > 解决方案 > Kubernetes - 我的 2 个应用程序部署仅在一个“参数”中有所不同 - 我可以拥有将引用它们的服务吗?

问题描述

我想我有有趣的用例,所以我想听听有更多知识的人的建议。我有我的应用程序(“广告”),它在 Kubernetes 中运行没有任何问题。它在端口 9000 上运行。它的 args 具有其实例名称 ( serverName),并且在服务器列表中它还引用了所有其他服务器 ( servers),以便在所谓companion mode的性能原因中运行这些服务器。请记住,这不是 WEB SERVER,简单的副本将无法满足我们需要实现的目标,即让多个 ADS 服务器在所谓的协同模式下工作,在这种模式下,主服务器将缓存的数据发送到另一台服务器,所以该服务器还具有最近的数据,并且可以在发生故障时接管。

从第一个 ADS YAML 文件中解脱出来:

-inserverName我们指定服务器实例的名称 -in serversarg 我们指定常规 ADS 服务器地址及其端口。

args:
....
  "-serverName", "ads"
  "-servers", "{ { ads , ads-test:9000 }, { ads2 , ads-test2:9000}"]
ports:
  - containerPort: 9000
..................
    kind: Service
    metadata:
      name: ads-test
    spec:
      type: ClusterIP
      ports:
      - protocol: TCP
        port: 9000
      selector:
        app: ads-test

因此,在参数列表中,我们指定了我们应该使用带有ads-test:9000的 TCP 连接(不是 HTTP 连接)访问该 ADS 实例的服务。由于这是容器化的应用程序,我不知道除了“ServiceName:port”之外我还能指定什么作为服务器地址,因为这个应用程序的开发并没有假设容器化的应用程序。

所以第二个 YAML 应该只与serverName信息不同。我添加了额外的服务ads-test2

args:
....
  "-serverName", "ads2"
  "-servers", "{ { ads , ads-test:9000 }, { ads2 , ads-test2:9000}"]
ports:
  - containerPort: 9000
..................
    kind: Service
    metadata:
      name: ads-test2
    spec:
      type: ClusterIP
      ports:
      - protocol: TCP
        port: 9000
      selector:
        app: ads-test2

serverName由于这实际上是同一个应用程序,但其配置只有一个参数不同(server实际上激活这种companion模式的参数,这是出于性能原因使用不同服务器所需的,但要在两台服务器上都有最新的信息。

谢谢

标签: dockerkubernetesazure-aks

解决方案


不,您不能为两个逻辑上不同的 pod 提供单一服务。服务通常在副本 pod 之间进行负载平衡。因此,您的 pod 上的用户请求将自动由服务自动路由到任何 pod。因此,在您的情况下,您不希望这种情况发生。广告请求可以欺骗 ads2 服务器 pod。推荐的方法是为您的 pod 提供两种不同的服务,或者您可以在单个 pod 中拥有多个容器并在这种情况下拥有单一服务。服务器名称的参数可以从环境中获取。环境:键:值:


推荐阅读