Kubernetes — как выровнять имя службы модуля по

#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 моя команда запутана:

  1. Получить имя службы selector как {"k1":"v1","k2":"v2",...}
  2. Преобразуйте это в "k1=v1","k2=v2",...
  3. Обрезать лишнее (?) "

Если вы хотите сделать это для всех пространств имен, вы можете обернуть все в:

 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».