#kubernetes #microk8s
Вопрос:
Я хотел бы знать, как найти имя службы по имени модуля в Kubernetes.
Можете ли вы, ребята, предложить?
Ответ №1:
Службы ( spec.selector
) и модули ( metadata.labels
) связаны с помощью общих меток.
Итак, вы хотите найти все службы, которые включают (некоторые) метки модуля.
kubectl get services
--selector=${KEY-1}=${VALUE-1},${KEY-2}=${VALUE-2},...
--namespace=${NAMESPACE}
Где ${KEY}
и ${VALUE}
— это ключ (ы) метки (ов) модуля и значения (ы)
Это сложно, потому что метки службы selector
могут отличаться от меток модуля. Вы бы не хотели, чтобы не было пересечения, но метки сервиса вполне могут быть подмножеством любых модулей.
Следующее не совсем то, что вы хотите, но вы можете расширить его, чтобы делать то, что вы хотите. Учитывая вышесказанное, он перечисляет службы в пространстве имен и, используя selector
метки каждой службы, перечисляет модули, которые выбирают на их основе:
NAMESPACE="..."
SERVICES="$(
kubectl get services
--namespace=${NAMESPACE}
--output=name)"
for SERVICE in ${SERVICES}
do
SELECTOR=$(
kubectl get ${SERVICE}
--namespace=${NAMESPACE}
--output=jsonpath="{.spec.selector}"
| jq -r '.|to_entries|map("(.key)=(.value)")|@csv'
| tr -d '"')
PODS=$(
kubectl get pods
--selector=${SELECTOR}
--namespace=${NAMESPACE}
--output=name)
printf "%s: %sn" ${SERVICE} ${PODS}
done
Обратите внимание, что для этого требуется
jq
, потому что я не уверен, можно ли использоватьkubectl
JSONPath для изменения меток службы и переформатирования их по мере необходимости. Даже при использованииjq
моя команда запутана:
- Получить имя службы
selector
как{"k1":"v1","k2":"v2",...}
- Преобразуйте это в
"k1=v1","k2=v2",...
- Обрезать лишнее (?)
"
Если вы хотите сделать это для всех пространств имен, вы можете обернуть все в:
NAMESPACES=$(kubectl get namespaces --output=name)
for NAMESPACE in ${NAMESPACE}
do
...
done
Комментарии:
1. Добро пожаловать!
Ответ №2:
Вы можете получить информацию о службе pods из ее переменных окружения. ( ссылка: https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#environment-variables)
kubectl exec <pod_name> -- printenv | grep SERVICE
Пример:
Комментарии:
1. Это не то, о чем он просит. OP, просмотрите все переменные среды и посмотрите, найдете ли вы что-нибудь полезное. Возможно, ищите «SERVICE_NAME».