如何在Kubernetes中为Atomix API应用程序设置集群发现

4

我想在我的应用程序中使用Java API使用Atomix框架。

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

我在文档中看到有不同的设置集群发现的方式,让集群中的每个节点知道所有成员,但是没有任何配置适用于我的情况。

  1. 手动配置:手动配置列表中的所有成员不适用于Kubernetes。
  2. 使用组播:据我所知,组播在Kubernetes中也不是一个很好的选择。
  3. DNS:我认为我也不能将DNS发现用于它(因为DNS通常按服务而不是按Pod)。

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

即使这应该是一个相当普遍的任务,我也没有找到任何这种设置的示例...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接