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

Posted

技术标签:

【中文标题】Kubernetes - 如何让 Pod 的服务名称与【英文标题】:Kubernetes - How to get Service Name of a Pod Aligned to 【发布时间】:2021-12-09 08:58:58 【问题描述】:

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

你们能推荐一下吗?

【问题讨论】:

【参考方案1】:

Services (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 标签不同。您不希望没有交集,但 Service 的标签很可能是任何 Pod 的子集。

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


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: %s\n" $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

【讨论】:

不客气!【参考方案2】:

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

kubectl exec <pod_name> -- printenv | grep SERVICE

例子:

获取有关 pod 的详细信息

从环境变量中获取服务

【讨论】:

这不是他想要的。 OP,查看所有环境变量,看看你是否发现任何有用的东西。或许可以寻找“SERVICE_NAME”。

以上是关于Kubernetes - 如何让 Pod 的服务名称与的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes in Action 5 服务:让客户端发现pod并与之通信

Kubernetes in Action 5 服务:让客户端发现pod并与之通信

Kubernetes in Action 5 服务:让客户端发现pod并与之通信

如何从 kubernetes pod 连接到本地网络

如何让多个 pod 访问 Kubernetes 中现有的 NFS 文件夹?

如何让 bash 脚本等到 kubernetes pod 重新启动?