如果你的 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/(