问题描述
我有一个想法要实现,我需要为 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 发生变化时,如何更新此类缓存?
Pod
在 kubernetes 中是一个短暂性质的对象,它可以在完全正常的情况下被销毁和重新创建,例如由于缩减集群和耗尽节点 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
对象,即跟踪特定 Pods
的 Service
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 小时前
我只能同意这一点。我的“为什么”的原因在上面已经详细解释过。
其他资源: