繁体   English   中英

Kubernetes - 如何让 Pod 的服务名称与

[英]Kubernetes - How to get Service Name of a Pod Aligned to

我想知道,如何从 Kubernetes 中的 Pod Name 中找到服务名称。

你们可以建议吗?

您可以从其环境变量中获取有关 pods 服务的信息。 (参考: https : //kubernetes.io/docs/concepts/services-networking/connect-applications-service/#environment-variables

kubectl exec <pod_name> -- printenv | grep SERVICE

例子:

获取有关 pod 的详细信息获取有关的详细信息

从环境变量获取服务从环境变量获取服务

服务( spec.selector )和 Pods ( metadata.labels )通过共享标签绑定。

因此,您要查找包含(某些)Pod 标签的所有服务。

kubectl get services \
--selector=${KEY-1}=${VALUE-1},${KEY-2}=${VALUE-2},...
--namespace=${NAMESPACE}

其中${KEY}${VALUE}是 Pod 的标签键和值

不过这很有挑战性,因为 Service 的selector标签可能与 Pod 标签不同。 您不希望没有交集,但服务的标签很可能是任何 Pod 的子集。

以下内容不是您想要的,但您可以扩展它以执行您想要的操作。 鉴于上述情况,它枚举命名空间中的服务,并使用每个服务的selector标签枚举基于它们进行选择的 Pod:


NAMESPACE="..."

SERVICES="$(\
  kubectl get services \
  --namespace=${NAMESPACE} \
  --output=name)"

for SERVICE in ${SERVICES}
do
  SELECTOR=$(\
    kubectl get ${SERVICE} \
    --namespace=monitoring \
    --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: %s\n" ${SERVICE} ${PODS}
done

注意这需要jq因为我不确定是否可以使用kubectlJSONPath来覆盖服务的标签根据需要重新格式化这些标签。 即使使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM