【问题标题】:How to set up Cluster Discovery for a Atomix API application inside kubernetes如何在 kubernetes 中为 Atomix API 应用程序设置集群发现
【发布时间】:2020-04-24 02:56:16
【问题描述】:

我想在我的应用程序中通过 java API 使用 atomix 框架。

应通过 Kubernetes 部署和扩展应用程序。并且每个 Pod 都应该与同一 kubernetes 部署的所有 Pod “连接”。

我在文档中看到如何设置集群发现有不同的方法,以便集群的每个节点都知道所有成员,但似乎没有任何配置适用于我的场景。

  1. 手动配置:手动配置列表中的所有成员不适用于 kubernetes。
  2. 使用多播:AFAIK 多播在 kubernetes 中也不是一个好的选择。
  3. DNS:我也不认为我可以为它使用 DNS 发现(因为 DNS 通常是每个服务而不是每个 Pod)

atomix 手册中还有一个关于 kubernetes 部署的部分,但似乎这仅对在集群中启动多个 atomix 代理有用,而不适用于扩展使用 Atomix API 的自定义应用程序(如果我弄错了)

我没有找到任何此类设置的示例,即使它应该是一个很常见的任务来解决......

【问题讨论】:

    标签: java kubernetes atomix


    【解决方案1】:

    只要您专门为此任务配置了服务,您就可以使用 DNS。在 k8s 中,每个 pod 都可以是任意数量的服务的成员(因为服务只是一个负载均衡器)。所以你可以为此目的定义一个服务

    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        - myLabel
      name: service-clustering
    spec:
      clusterIP: None
      publishNotReadyAddresses: true
      ports:
        - name: appName
          port: 8080
          protocol: TCP
          targetPort: 8080
      selector:
        - matchLabel
      type: ClusterIP
    

    这里很重要的是publishNotReadyAddresses,因为您希望在所有 pod 通过就绪检查之前防止在启动期间出现脑裂情况。之后,您可以使用 DNS 来发现各个 pod(使用 dnsjava):

        private Stream<String> getPodUris() {
            return Optional.ofNullable(new Lookup("service-clustering", Type.SRV))
                .stream()
                .flatMap(Arrays::stream)
                .filter(r -> r instanceof SRVRecord)
                .map(r -> ((SRVRecord) r).getTarget().toString());
        }
    

    对于动态扩展,您需要每隔几秒钟在计划任务中重复此查询,以通知 Atomix 成员资格更改。

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 2018-07-12
      • 2018-10-10
      • 2020-09-21
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多