Kubernetes Pod 归属控制器的查询方法
- 2026-07-11 23:56:00
- 丁国栋
- 原创 19
在 Kubernetes 集群中,需要确认某个 Pod 是由 Deployment、StatefulSet 还是 DaemonSet 创建时,可以通过 kubectl 命令查看 Pod 的 ownerReferences 元数据来快速定位。本文介绍几种常用查询方法,以及 ownerReferences 字段在不同场景下的存在情况。
一、通过 kubectl describe 查看
kubectl describe pod <pod-name> -n <namespace>
在输出中找到 Controlled By 行:
Controlled By: ReplicaSet/xxx-7b9d8c5f
根据这一行的值判断来源:
ReplicaSet/xxx:需要再追一层,通过kubectl describe rs xxx查看它的 Controlled By,通常是 DeploymentStatefulSet/xxx:直接由 StatefulSet 创建DaemonSet/xxx:直接由 DaemonSet 创建
二、直接查看 ownerReferences 字段
kubectl get pod <pod-name> -o yaml | grep -A5 ownerReferences
输出示例:
ownerReferences:
- apiVersion: apps/v1
kind: ReplicaSet
name: nginx-deploy-7b9d8c5f
uid: ...
kind 字段指示了直接创建该 Pod 的控制器类型。如果是 ReplicaSet,通常意味着上层是 Deployment(也有少数情况是独立 RS)。
用 jsonpath 可以快速提取:
# 查看直接 owner 的 kind
kubectl get pod <pod> -o jsonpath='{.metadata.ownerReferences[0].kind}{"\n"}'
# 如果是 ReplicaSet,再追一层
kubectl get rs <rs-name> -o jsonpath='{.metadata.ownerReferences[0].kind}'
三、从 Pod 名称辅助判断
名称不是权威来源,但可以作为快速参考:
nginx-deploy-7b9d8c5f-abc12:deploy-<rs-hash>-<random>格式,典型 Deploymentweb-0、web-1:<name>-<序号>格式,典型 StatefulSetnginx-ds-7xqzk:常带ds字样或节点名后缀,典型 DaemonSet
Pod 名可以修改、label 可以打错,但 ownerReferences 是由 apiserver 维护的,应以它为准。
四、批量查询多个 Pod
查看某个 namespace 下所有 Pod 的归属:
kubectl get pods -o custom-columns=POD:.metadata.name,KIND:.metadata.ownerReferences[0].kind,OWNER:.metadata.ownerReferences[0].name
Deployment、StatefulSet、DaemonSet 三个类型一眼就能区分开。
五、ownerReferences 什么情况下不存在
ownerReferences 不是必填字段,只在被控制器创建并管理的对象上才会出现。以下情况 ownerReferences 可能为空。
存在 ownerReferences 的典型场景
| 对象 | 创建来源 | 是否有 ownerReferences |
|---|---|---|
| Pod | Deployment / StatefulSet / DaemonSet / Job / CronJob | 有 |
| ReplicaSet | Deployment | 有 |
| Job | CronJob | 有 |
| PVC | StatefulSet | 有 |
这些对象的 ownerReferences 用于级联删除和垃圾回收。
不存在 ownerReferences 的场景
- 用户直接创建的资源:
kubectl run test --image=nginx或kubectl create configmap等方式直接创建的对象没有 owner - 手动脱管的资源:使用
kubectl delete deployment nginx --cascade=orphan删除上层控制器后,留下的 ReplicaSet 和 Pod 的ownerReferences会被移除 - 非控制器型资源:ConfigMap、Secret、Service、Namespace、Node 等默认没有
ownerReferences,除非被控制器显式设置 - CRD 控制器实现不规范:部分 Operator 可能没有正确设置
ownerReferences,导致子对象不会被垃圾回收
如何检查
# 返回 [] 表示不存在,返回数组表示存在
kubectl get pod <pod> -o jsonpath='{.metadata.ownerReferences}'
# 或用 jq
kubectl get pod <pod> -o json | jq '.metadata.ownerReferences'
有 ownerReferences 可以安全追溯父对象,没有则不一定是异常,可能是用户直接创建或孤儿资源。
六、实际 YAML 示例
下面是三种控制器创建的 Pod 的 ownerReferences 字段对比。
Deployment 创建的 Pod
# kubectl get pod zai-app-c6d7bfbb9-zw98l -n quickon-app -o yaml
metadata:
generateName: zai-app-c6d7bfbb9-
labels:
app: zai-app
pod-template-hash: c6d7bfbb9
name: zai-app-c6d7bfbb9-zw98l
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: zai-app-c6d7bfbb9
uid: 4bcde35d-15ed-4b39-a06f-ffdca7c8d78c
可以看到 ownerReferences.kind 指向 ReplicaSet,需要再向上追溯到 Deployment。
StatefulSet 创建的 Pod
# kubectl get pod mariadb-primary-0 -n common-service -o yaml
metadata:
labels:
statefulset.kubernetes.io/pod-name: mariadb-primary-0
name: mariadb-primary-0
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: StatefulSet
name: mariadb-primary
uid: a53e79b4-4e92-408f-b28b-6c0a84af96e3
ownerReferences.kind 直接指向 StatefulSet,且 Pod 名称以序号结尾(-0),这也是 StatefulSet 的典型特征。
DaemonSet 创建的 Pod
# kubectl get pod kube-prometheus-stack-prometheus-node-exporter-66tjq -n quickon-system -o yaml
metadata:
generateName: kube-prometheus-stack-prometheus-node-exporter-
labels:
app.kubernetes.io/component: metrics
name: kube-prometheus-stack-prometheus-node-exporter-66tjq
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: kube-prometheus-stack-prometheus-node-exporter
uid: 6118b252-0b5c-4735-95d3-d96372ed818d
ownerReferences.kind 直接指向 DaemonSet,DaemonSet 的 Pod 通常每个节点运行一个。
总结
查询 Pod 归属最可靠的方法是查看 ownerReferences 元数据。kubectl describe 适合快速排查,直接查看 YAML 可以获得最准确的信息,批量查询可用 custom-columns。Pod 命名规律可以作为辅助参考,但不能替代元数据判断。ownerReferences 本身不是必填字段,用户直接创建或脱管资源时不会存在该字段。