当前位置: 首页 > 面试题库 >

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

苏宏逸
2023-03-14
问题内容

我想清除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)



 类似资料:
  • 我使用几个独立服务运行Kubernetes单节点dev集群--Nginx proxy(端口80)和elasticsearch(端口9200)。有没有办法用ingress公开这些服务,用一个LoadBalancer IP拥有入口点?(X.X.X.X:80和X.X.X:9200) 我读过关于入口限制,它只能用80和443端口访问。但是,也许,存在一些变通方法? 请Thx提供任何建议 但如果以后您想公开

  • 问题内容: 我正在使用Square的Retrofit库进行短暂的网络调用。我在每个请求中都包含了一些数据作为参数。像这样: 必须定义并且对于中概述的每个单个端点都是很麻烦的。有没有一种方法可以设置每个请求应包含的基本参数集?类似于我们如何设置共同点? 问题答案: 您可以通过将一个自定义RequestInterceptor添加到RestAdapter来确保所有请求都具有这些查询参数。

  • 我试图找到这个问题的答案,但在kubernetes文档或任何问答论坛中都找不到。 我有一个运行有4个节点的kubernetes集群。是否可以创建第二个集群,重用前一个集群中的一个或多个节点?或者一个节点被限制在单个kubernetes集群中? 我正在使用RKE(用于部署k8集群的牧场工具)运行实际的集群,我发现这个问题让我怀疑这种可能性。 感谢您的澄清。

  • 本文向大家介绍是否可以在单个catch块中捕获多个Java异常?,包括了是否可以在单个catch块中捕获多个Java异常?的使用技巧和注意事项,需要的朋友参考一下 例外是程序执行期间发生的问题(运行时错误)。发生异常时,程序会突然终止,并且生成异常的行之后的代码将永远不会执行。 代码中有多个异常 在Java 7之前,只要我们有一个可能会生成多个异常的代码,并且如果您需要专门处理该代码,则应在一次尝

  • 问题内容: 我们正在跟踪应用程序中的一些内存问题,并且可以看到问题所在的会话大小。它只会影响某些似乎无法控制的会话,我们希望能够或多或少地“手动”使这些会话无效,以收回该内存。有没有办法通过JMX做到这一点?我们正在使用JBoss 4.5.2。 提前致谢。 问题答案: 答案是可以的。 -这将Web模块MBeans加载到JBoss中- -一旦有了,您就可以从该MBean获得活动的会话- -最后,一旦

  • 问题内容: 在Flask中,需要从服务器端发出POST请求。 假设我们有: 我没有在Flask文档中找到任何特定的东西。有人说是问题所在,但我未能将Flask和。真的有可能吗? 提前致谢! 问题答案: 是的,要发出POST请求,您可以使用,请参阅文档。 但是,我建议改用requests模块。 编辑 : 我建议您重构代码以提取常用功能: