如何在 kubernetes 中为 Atomix API 应用程序设置集群发现
How to set up Cluster Discovery for a Atomix API application inside kubernetes
我想在我的应用程序中使用 java API 的 atomix 框架。
应通过 kubernetes 部署和扩展应用程序。并且每个 Pod 都应该 "connected" 具有相同 kubernetes 部署的所有 Pods。
我在文档中看到有不同的方式来设置集群发现,以便集群的每个节点都知道所有成员,但似乎没有任何配置适用于我的场景。
- 手动配置:手动配置列表中的所有成员不适用于 kubernetes。
- 使用多播:AFAIK 多播在 kubernetes 中也不是一个好的选择。
- DNS:我也不认为我可以为它使用 DNS 发现(因为 DNS 通常是按服务而不是按 Pod)
atomix 手册中还有一个关于 kubernetes 部署的部分,但似乎这仅对在集群中启动多个 atomix 代理有用,而不适用于扩展使用 Atomix API 的自定义应用程序(如果我弄错了请告诉我)
我没有找到任何此类设置的示例,即使它应该是一个很常见的任务来解决...
您可以使用 DNS,前提是您专门为此任务配置了一项服务。在 k8s 中,每个 pod 都可以是任意数量服务的成员(因为服务只是一个 load-balancer)。所以你可以为此目的定义一个服务
---
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
,因为您希望在所有 pods 通过就绪检查之前在启动期间防止出现 split-brain 情况。之后,您可以使用 DNS 来发现个人 pods(使用 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 成员更改。
我想在我的应用程序中使用 java API 的 atomix 框架。
应通过 kubernetes 部署和扩展应用程序。并且每个 Pod 都应该 "connected" 具有相同 kubernetes 部署的所有 Pods。
我在文档中看到有不同的方式来设置集群发现,以便集群的每个节点都知道所有成员,但似乎没有任何配置适用于我的场景。
- 手动配置:手动配置列表中的所有成员不适用于 kubernetes。
- 使用多播:AFAIK 多播在 kubernetes 中也不是一个好的选择。
- DNS:我也不认为我可以为它使用 DNS 发现(因为 DNS 通常是按服务而不是按 Pod)
atomix 手册中还有一个关于 kubernetes 部署的部分,但似乎这仅对在集群中启动多个 atomix 代理有用,而不适用于扩展使用 Atomix API 的自定义应用程序(如果我弄错了请告诉我)
我没有找到任何此类设置的示例,即使它应该是一个很常见的任务来解决...
您可以使用 DNS,前提是您专门为此任务配置了一项服务。在 k8s 中,每个 pod 都可以是任意数量服务的成员(因为服务只是一个 load-balancer)。所以你可以为此目的定义一个服务
---
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
,因为您希望在所有 pods 通过就绪检查之前在启动期间防止出现 split-brain 情况。之后,您可以使用 DNS 来发现个人 pods(使用 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 成员更改。