【发布时间】:2020-12-14 23:15:35
【问题描述】:
设置
我通过以下方式设置了 k8s 集群:
- 1 个主节点
- 2 个工作节点
集群是使用 kubeadm 和 Flannel 设置的。
我有两种不同的 pod 类型:
- Java 代理服务器
- Java TCP 服务器
Java Proxy Server pod 是我最初创建的 StatefulSet。每个 Java 代理服务器都有自己的状态(当前连接的客户端),但是它们都应该共享一个公共状态。
此常见状态是 Java TCP Server pod 及其关联 IP 地址的最新列表。 我的目标是确保每个代理服务器都有一个当前的 TCP 服务器列表,它可以代理连接。
Java TCP 服务器的每个实例都有自己独特的状态,并且也部署为 StatefulSet。 TCP 服务器 pod 之间唯一的共同点是它们可以接收来自代理服务器的连接。
代理服务器必须知道 TCP 服务器 pod 何时启动或关闭,以便他们知道哪些 pod 可用于代理连接。
TCP 服务器由代理服务器委托连接。绝不会出现代理服务器随机给 TCP 服务器一个连接并且它们没有负载平衡的情况。
尝试
我尝试使用Java Kubernetes Client 并在我的代理服务器上实现了一个监视,如下所示:
ApiClient apiClient = Config.defaultClient();
apiClient.setReadTimeout(0);
System.out.println(apiClient.getBasePath());
Configuration.setDefaultApiClient(apiClient);
CoreV1Api api = new CoreV1Api();
V1PodList pods = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
V1ListMeta podsMeta = pods.getMetadata();
if (podsMeta != null) {
String resourceVersion = podsMeta.getResourceVersion();
Watch<V1Pod> watch = Watch.createWatch(
apiClient,
api.listPodForAllNamespacesCall(null, null, null, null, null, null, resourceVersion, null, true, null),
new TypeToken<Watch.Response<V1Pod>>(){}.getType());
while (watch.hasNext()) {
Watch.Response<V1Pod> response = watch.next();
V1Pod pod = response.object;
V1PodStatus status = pod.getStatus();
if (status != null) {
System.out.printf("Pod IP: %s\n", status.getPodIP());
System.out.printf("Pod Reason: %s\n", status.getReason());
}
}
watch.close();
}
这工作相对较好。对我来说最大的问题是,对于这个简单的过程,它为我的最终 Jar 文件增加了 40MB 的巨大空间。
我知道 40MB 对某些人来说可能不算多。我只是觉得有一种更轻量级的方式来实现我正在尝试做的事情?
是否有更好的流程来跟踪在我忽略的集群中创建和销毁的这些 pod?
【问题讨论】:
-
不知道这是否有用,但是this article关于如何通过statefulset配置自愈redis集群可能会提供一些建议。
-
这听起来像是 k8s 负载均衡器服务将为您做的事情。您需要自己的代理有什么原因吗? Kubernetes 将使用 pod liveness/readiness 探测来了解怎么了可用的。
-
@aguest 是的,不幸的是我的项目设置方式我需要有自己的代理。除了代理来自我的 TCP 服务器的数据包之外,“代理”本身会拦截客户端数据包并对其进行修改以及发送自己的数据包。
标签: java kubernetes proxy kubernetes-statefulset