Kubernetes Pod 归属控制器的查询方法

2026-07-11 23:56:00
丁国栋
原创 19
摘要:在 Kubernetes 集群中,需要确认某个 Pod 是由 Deployment、StatefulSet 还是 DaemonSet 创建时,可以通过 `kubectl` 命令查看 Pod 的 `ownerReferences` 元数据来快速定位。本文介绍几种常用查询方法,以及 `ownerReferences` 字段在不同场景下的存在情况。

在 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,通常是 Deployment
  • StatefulSet/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-abc12deploy-<rs-hash>-<random> 格式,典型 Deployment
  • web-0web-1<name>-<序号> 格式,典型 StatefulSet
  • nginx-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 的场景

  1. 用户直接创建的资源kubectl run test --image=nginxkubectl create configmap 等方式直接创建的对象没有 owner
  2. 手动脱管的资源:使用 kubectl delete deployment nginx --cascade=orphan 删除上层控制器后,留下的 ReplicaSet 和 Pod 的 ownerReferences 会被移除
  3. 非控制器型资源:ConfigMap、Secret、Service、Namespace、Node 等默认没有 ownerReferences,除非被控制器显式设置
  4. 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 本身不是必填字段,用户直接创建或脱管资源时不会存在该字段。

发表评论
博客分类