在 Kubernetes 上实现节点发现

问题描述

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

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

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

解决方法

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

首先创建服务。重要的是将 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());
,

一种自定义实现可能是拥有一个持久性数据存储 像数据库一样,让每个 Pod 发送一个心跳条目到 通过聆听来表明其活跃度并管理条目 应用生命周期事件

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

要获取所有 POD 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...