0

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

我从一段代码开始获取 podlist 我需要将他的 podlist 放入缓存中,就像每次请求到达时它将使用缓存而不是使用 kubernetes api o 获取 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 

我感谢您的帮助。

先感谢您,

4

1 回答 1

0

对于这样的问题,只有一个正确答案:离开它。这是一个非常非常糟糕的主意。相信我,这样的解决方案只会产生更多需要解决的问题。Pod当重新创建 a 并且其名称和 IP 都更改时,如何更新此类缓存?

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

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

为了最大限度地减少每次接收新请求时的延迟,我需要使用缓存中的 Ips,而不是尝试从 kubernetes API 获取 pod 的 ip

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

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

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

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

您不应该通过他们的 IP 访问 pod。它们不会在 pod 重新启动时保持不变。

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

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

其他资源:

于 2021-01-26T13:51:22.103 回答