Kubernetes - 如何让 Pod 的服务名称对齐
Kubernetes - How to get Service Name of a Pod Aligned to
我想知道,如何从 Kubernetes 中的 Pod 名称查找服务名称。
你们能推荐一下吗?
您可以从其环境变量中获取有关 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 的标签键和值
但这具有挑战性,因为服务的 selector
标签可能与 Pod 标签不同。您不希望没有交集,但服务的标签很可能是任何 Pods'.
的子集
以下不是您想要的,但您可以扩展它来做您想要的。鉴于上述情况,它枚举了命名空间中的服务,并使用每个服务的 selector
标签,它枚举了 Pods,select 基于它们:
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
NOTE This requires jq
because I'm unsure whether it's possible to use kubectl
's JSONPath to range over a Service's labels and reformat these as needed. Even using jq
, my command's messy:
- Get the Service's
selector
as {"k1":"v1","k2":"v2",...}
- Convert this to
"k1=v1","k2=v2",...
- Trim the extra (?)
"
如果您想对所有命名空间执行此操作,您可以将所有内容包装在:
NAMESPACES=$(kubectl get namespaces --output=name)
for NAMESPACE in ${NAMESPACE}
do
...
done
我想知道,如何从 Kubernetes 中的 Pod 名称查找服务名称。
你们能推荐一下吗?
您可以从其环境变量中获取有关 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 的标签键和值
但这具有挑战性,因为服务的 selector
标签可能与 Pod 标签不同。您不希望没有交集,但服务的标签很可能是任何 Pods'.
以下不是您想要的,但您可以扩展它来做您想要的。鉴于上述情况,它枚举了命名空间中的服务,并使用每个服务的 selector
标签,它枚举了 Pods,select 基于它们:
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
NOTE This requires
jq
because I'm unsure whether it's possible to usekubectl
's JSONPath to range over a Service's labels and reformat these as needed. Even usingjq
, my command's messy:
- Get the Service's
selector
as{"k1":"v1","k2":"v2",...}
- Convert this to
"k1=v1","k2=v2",...
- Trim the extra (?)
"
如果您想对所有命名空间执行此操作,您可以将所有内容包装在:
NAMESPACES=$(kubectl get namespaces --output=name)
for NAMESPACE in ${NAMESPACE}
do
...
done