问题描述
我们有一个 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);