Kubernetes:是否可以在 Kubernetes 集群中通过单个请求访问多个 Pod

2024-04-27

我想清除 Kubernetes 命名空间中所有 Pod 中的缓存。我想向端点发送一个请求,然后该端点将向命名空间中的所有 Pod 发送 HTTP 调用以清除缓存。目前,我只能使用 Kubernetes 命中一个 pod,并且无法控制哪个 pod 会受到命中。

即使负载均衡器设置为 RR,连续命中 pod(n 次,其中 n 是 pod 总数)也无济于事,因为其他一些请求可能会悄悄进入。

这里讨论了同样的问题,但我找不到实现的解决方案:https://github.com/kubernetes/kubernetes/issues/18755 https://github.com/kubernetes/kubernetes/issues/18755

我正在尝试使用 Hazelcast 实现清除缓存部分,其中我将存储所有缓存,Hazelcast 自动负责缓存更新。

如果有解决此问题的替代方法,或者配置 kubernetes 以针对某些特定请求命中所有端点的方法,那么在这里分享将是一个很大的帮助。


如果你的 pod 中有 kubectl 并且可以访问 api 服务器,你就可以获取所有端点地址并将它们传递给curl:

kubectl get endpoints <servicename> \
        -o jsonpath="{.subsets[*].addresses[*].ip}" | xargs curl

pod 中没有 kubectl 的替代方案:

从 pod 访问 api 服务器的推荐方法是使用 kubectl 代理:https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod这当然会增加至少相同的开销。或者,您可以直接调用 REST api,但必须手动提供令牌。

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret $(kubectl get secrets \
     | grep ^default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d " ")

如果您提供 APISERVER 和 TOKEN 变量,则 pod 中不需要 kubectl,这样您只需要使用curl 来访问 api 服务器并使用“jq”来解析 json 输出:

curl $APISERVER/api/v1/namespaces/default/endpoints --silent \
     --header "Authorization: Bearer $TOKEN" --insecure \
     | jq -rM ".items[].subsets[].addresses[].ip" | xargs curl

更新(最终版本)

APISERVER 通常可以设置为 kubernetes.default.svc 并且令牌应该在 Pod 中的 /var/run/secrets/kubernetes.io/serviceaccount/token 中可用,因此无需手动提供任何内容:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); \
curl https://kubernetes.default.svc/api/v1/namespaces/default/endpoints --silent \
     --header "Authorization: Bearer $TOKEN" --insecure \
     | jq -rM ".items[].subsets[].addresses[].ip" | xargs curl

jq 可以在这里找到:https://stedolan.github.io/jq/download/ https://stedolan.github.io/jq/download/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes:是否可以在 Kubernetes 集群中通过单个请求访问多个 Pod 的相关文章

随机推荐