我想清除Kubernetes命名空间中所有Pod中的缓存。我想向端点发送一个请求,然后该端点将向命名空间中的所有Pod发送HTTP调用以清除缓存。目前,我只能使用Kubernetes击中一个吊舱,我无法控制哪个吊舱会被击中。
即使负载均衡器设置为RR,连续击中Pod(n次,其中n是Pod的总数)也无济于事,因为其他一些请求可能会不断蔓延。
这里讨论了相同的问题,但是我找不到实现的解决方案:https : //github.com/kubernetes/kubernetes/issues/18755
我正在尝试使用Hazelcast实现清除缓存部分,其中将存储所有缓存,并且Hazelcast会自动处理缓存更新。
如果有解决此问题的替代方法,或将kubernetes配置为针对某些特定请求命中所有端点的方法,则在此处共享将有很大帮助。
如果您在吊舱中安装了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- 荚当然会增加至少相同的开销。或者,您可以直接调用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/(<4 MiB,但值得轻松解析JSON)