在 Kubernetes 上实现节点发现

Implementing node discovery on Kubernetes

我们有一个 java 应用程序(微服务),将使用 k8s 部署部署在 kubernetes 上,其中一个要求是每个 pod 需要知道所有其他 pods [=21= 】 那个应用。因此,换句话说,我们需要一种方法让应用层检索属于 k8s 部署的所有 pods。

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

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

您可以使用 headless service。此服务 returns 所选 pods 的 IP 地址在 dns 查找中而不是负载平衡请求。

首先创建服务。重要的是将 spec.clusterIP 设置为 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());

One custom implementation could be to have a persistant data store like database and have each of the pods send a hearbeat entry to indicate its liveness and manage the entries by listening to application lifecycle events

我在这里建议在 pod 加入时使用 POD 的活跃度探测和就绪探测,相应的 DNS 条目将自动更新,而不是使用自定义解决方案检查活跃度。

要获取所有 PODs IP 的列表,您可以使用类型为 headless 的 Kubernetes 服务。你必须使用 spec.clusterIP 作为 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 服务发送请求,如果 headless : <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