如何通过Kubernetes Endpoints对象查询关联Service的UID?
问题描述
我可以用以下命令查看某个Endpoints资源:
kubectl get endpoints busybox-service
这个Endpoints由对应的Service支撑,查看该Service的命令是:
kubectl get services busybox-service
我想确认:能不能不通过名称匹配的方式,仅靠Endpoints对象本身找到它对应的支撑Service?
具体来说,只通过执行这条命令拿到的Endpoints JSON数据:
kubectl get endpoints busybox-service -o=json
能不能获取到对应Service的metadata.uid?
执行命令后,我得到的Endpoints元数据片段是这样的:
"metadata": { "annotations": { "endpoints.kubernetes.io/last-change-trigger-time": "2023-03-19T19:40:08Z" }, "creationTimestamp": "2023-03-19T19:40:08Z", "labels": { "a": "b" }, "name": "busybox-service", "namespace": "default", "resourceVersion": "277476", "uid": "8d76841b-ad74-4697-8d47-e7449b2cea24" }
目前只能拿到Endpoints自己的UID,我本来希望能看到类似带ownerReference字段的信息(如下示例),但实际返回里没有这个字段,想确认有没有遗漏的调用方式能拿到对应Service的UID:
"metadata": { "annotations": { "endpoints.kubernetes.io/last-change-trigger-time": "2023-03-19T19:40:08Z" }, "creationTimestamp": "2023-03-19T19:40:08Z", "labels": { "a": "b" }, "name": "busybox-service", "namespace": "default", "resourceVersion": "277476", "uid": "8d76841b-ad74-4697-8d47-e7449b2cea24", "ownerReference": "<UID_OF_THE_SERVICE>" }
解答
不行,仅靠Endpoints对象本身的元数据(包括你当前获取的JSON数据),没法直接找到对应Service的UID,原因有两点:
- Kubernetes默认不会给Endpoints加指向Service的OwnerReference:虽然Service是Endpoints的逻辑生成者,但Kubernetes的API设计里,这俩是松散关联的资源,系统不会自动给Endpoints设置
ownerReferences字段来关联对应的Service。 - Endpoints元数据里没有内置字段存储Service标识:你看到的
endpoints.kubernetes.io/last-change-trigger-time注解只记录最后更新时间,完全不包含Service的任何ID信息。
如果必须绕开名称匹配来关联,只能用间接方法:
- 遍历同命名空间的Service做匹配:把当前命名空间下的所有Service查出来,逐个检查Service的
spec.selector是否和Endpoints关联的Pod标签一致,或者对比Service对应的Endpoints资源是否就是目标Endpoints(但本质还是依赖名称关联,因为Service自动创建的Endpoints默认和Service同名)。 - 自定义控制器或准入钩子:如果集群允许,可以部署自定义控制器,在Service创建或更新时,主动给对应的Endpoints加上包含Service UID的注解或标签,这样之后就能直接从Endpoints元数据里拿到Service的UID了。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

