Ответ 1
Если в вашем модуле есть kubectl и у вас есть доступ к api-серверу, вы можете получить все адреса конечных точек и передать их в curl:
kubectl get endpoints <servicename> \
-o jsonpath="{.subsets[*].addresses[*].ip}" | xargs curl
Альтернатива без кубектл в стручке:
рекомендуемый способ доступа к серверу API из модуля - использование прокси-сервера kubectl: https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a- стручок это, конечно, добавил бы, по крайней мере, те же накладные расходы. В качестве альтернативы вы можете напрямую вызвать API REST, вам нужно будет предоставить токен вручную.
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, вам не нужен 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, и токен должен быть доступен по адресу /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 МБ, но оно того стоит для простого анализа JSON)