如何缓存 Pod 的 IP 并通过 http 请求访问它

问题描述

我有一个想法要实现,我需要为 kubernetes 集群中的 pods IP 创建缓存,然后使用 http 请求访问缓存的 IP。 我正在使用 Golang,因为我是这个领域的新手,如果有人知道如何实现它,我将不胜感激。我在互联网上搜索了很多,但我没有找到任何简单的例子来作为开始。

我从一段代码开始获取 podlist,我需要的是将他的 podlist 放入缓存中,就像每次请求到达时,它都会使用缓存而不是使用 kubernetes api 来获取 IP。

kubeClient,err := kubernetes.NewForConfig(cfg)

if err != nil {
        fmt.Printf("Error building kubernetes clientset: %v\n",err)
        os.Exit(2)}
options := Metav1.ListOptions{
        LabelSelector: "app=hello",}
podList,_ := kubeClient.CoreV1().Pods("namespace").List(options).  What i need is to create a cache for the IPs of hello pods for-example and when an http request arrive to my http server,the request will use directly the cached IPs 

感谢您的帮助。

先谢谢你,

解决方法

这样的问题只有一个正确答案:别管它。这是一个非常非常糟糕的主意。相信我,使用这样的解决方案只会产生更多需要解决的问题。当 Pod 被重新创建并且其名称和 IP 发生变化时,如何更新此类缓存?

Podkubernetes 中是一个短暂性质的对象,它可以在完全正常的情况下被销毁和重新创建,例如由于缩减集群和耗尽节点 Pods 被逐出并重新安排在具有完全不同名称和 IP 地址的不同节点上。

访问您的 Pods 的唯一稳定方式是通过公开它们的 Service

在每次接收我需要的新请求时最小化延迟 使用缓存中的 ip 而不是尝试获取 pod 的 ip 来自 Kubernetes API

这真的是在重新发明轮子。每次创建 Service 时(Services without selectors 除外),也会创建相应的 Endpoints 对象。事实上,它的作用与您需要的缓存机制完全一样。它跟踪 Pods 的所有 IP 地址,并在 Pod 重新创建及其 IP 更改时更新。这样您就可以保证它始终是最新的。在实现任何缓存机制时,您无论如何都需要调用 kubernetes API,以确保具有此类 IP 的 Pod 仍然存在,如果不存在,创建的是什么而不是它,使用什么名称,使用什么IP地址。很麻烦,不是吗?

每次访问 Pod 时都需要调用 kubernetes API 以获取其 IP 地址,这是不正确的。实际上,Service 在每个节点上实现为一组 iptables 规则。当请求到达 Service 的虚拟 IP 时,它实际上落入特定的iptables 链,并由内核路由到后端 Pod。 Kubernetes 网络是一个非常广泛的话题,所以我建议你阅读它,例如使用我最后附加的资源,但不涉及不必要的细节,值得一提的是每次集群配置更改时(例如,重新创建某些 Pod 并获得不同的 IP 和相应的 Endpoints 对象,即跟踪特定 PodsService IP,更改),在每个节点上作为容器运行的 kube-proxy 负责更新上述 iptables 转发规则。如果在 iptables 模式(这是最常见的实现)下运行,kube-proxy 会配置 Netfilter 链,以便节点的内核将连接直接路由到后端容器的端点。 >

所以只有在集群配置发生变化时才会调用 API,以便 kube-proxy 可以更新 iptables 规则。通常,当您通过 Pod 访问 Service 时,流量会根据当前的 Pods 规则路由到后端 iptables,而无需询问 kubenetes API 关于此类 Pod 的 IP。

事实上,Krishna Chaurasia 已经回答了您的问题(很快,但 100% 正确)说:

你不应该通过他们的 IP 访问 pod。它们不会被持久化 pod 重新启动。

K8s 不是这样工作的。基于服务转发请求 通常,它们被重定向到基于匹配的 pod 标签/选择器。 – Krishna Chaurasia 4 小时前

我只能同意这一点。我的“为什么”的原因在上面已经详细解释过。

其他资源:

相关问答

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