1

我们有一个 Java 应用程序(微服务),它将使用 k8s 部署部署在 kubernetes 上,其中一个要求是每个 pod 需要知道运行该应用程序的所有其他 pod。因此,换句话说,我们需要一种方法,应用层可以通过该方法检索属于 k8s 部署的所有 Pod。

一种自定义实现可能是拥有像数据库这样的持久数据存储,并让每个 pod 发送一个 heartbeat 条目以指示其活跃性,并通过侦听应用程序生命周期事件来管理条目

我知道任何集群技术都可以满足这个要求。但是我正在寻找一个最小的现成库,它只在 kubernetes 中进行这个节点发现(和/或)管理?

4

2 回答 2

2

您可以使用无头服务。此服务在 dns 查找时返回所选 pod 的 IP 地址,而不是对请求进行负载平衡。

首先创建服务。重要的是设置spec.clusterIPto None

apiVersion: v1
kind: Service
metadata:
  name: headless-service
spec:
  clusterIP: None
  selector:
    ...
  ports:
    - ...

之后,您可以通过以下方式在 java 中获取您的 IP:

InetAddress address = InetAddress.getByName("headless-service"); 
System.out.println(address.getHostAddress());
于 2021-04-23T12:30:46.727 回答
2

一种自定义实现可能是拥有像数据库这样的持久数据存储,并让每个 pod 发送一个 heartbeat 条目以指示其活跃性,并通过侦听应用程序生命周期事件来管理条目

我建议在 pod get join 时使用 POD 的 liveness probe 和 readiness probe ,相应的 DNS 条目将自动更新,而不是使用自定义解决方案检查 liveness。

要获取所有 POD IP 的列表,您可以使用类型为headless的 Kubernetes 服务。你必须使用spec.clusterIPas None

示例服务 YAML:

apiVersion: v1
kind: Service
metadata:
  name: mongodb-headless-service
  namespace: infrastructure
spec:
  type: NodePort
  clusterIP: None
  selector:
    app: mongodb
  ports:
  - name: mongodb
    port: 27017
    targetPort: 27017
    protocol: TCP
  selector:
    app: mongodb

从您的自定义解决方案代码中,您已向 kuberneets 服务发送请求,如果无头<servicename>.<namespace>.svc.cluster.local

mongo 的代码示例:

System.Net.IPAddress[] ipAddresses = Dns.GetHostAddresses("mongodb-headless-service");
string connectionString = "";
foreach(IPAddress in ipAddresses)
{
  if(connectionString = "")
    connectionString = "mongodb://";
  else
    connectionString += ",";
  connectionString += $"{IPAddress.ToString()}:27017";
}
connectionString += "/database";
var client = new MongoClient(connectionString);

额外文件:https ://medium.com/swlh/discovering-running-pods-by-using-dns-and-headless-services-in-kubernetes-7002a50747f4

于 2021-04-23T12:43:49.943 回答