4

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

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

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

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

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

我没有找到任何关于这种设置的例子,即使它应该是一个很常见的任务来解决......

4

1 回答 1

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 有关成员资格的更改。

于 2022-01-26T11:12:28.950 回答