如何确定Kubernetes集群中处理指定CRD的自定义控制器是哪个
确定CRD对应调和控制器的方法
- 第一步:获取目标CRD的核心属性
执行命令获取foo CRD的完整定义:kubectl get crd foo -o yaml
从返回结果中提取3个核心字段,后续排查会用到:
spec.group:CRD所属的API组
spec.names.plural:CRD对应资源的复数名称
spec.versions[].name:CRD的生效版本号
示例输出对应的GVK(组/版本/类型)标识为:example.io/v1, Kind=Foo
- 第二步:优先用事件快速定位
大部分场景下控制器调和资源时会生成事件,直接过滤该类资源的事件即可拿到控制器名称:kubectl get events -A --field-selector involvedObject.kind=Foo
返回结果中的SOURCE字段就是控制器名称,再用名称过滤集群Pod就能找到对应实例。 - 第三步:权限反向排查法(事件缺失时使用)
控制器要执行调和逻辑,必须拥有对应CRD资源的watch、update等操作权限,我们可以反向从权限绑定关系找到关联Pod:
- 查找持有该CRD操作权限的集群角色,把命令中的
example.io和foos替换成你第一步查到的API组和资源复数名:kubectl get clusterroles -o json | jq '.items[] | select(.rules[]? | .apiGroups[]? == "example.io" and .resources[]? == "foos") | .metadata.name' - 查找该集群角色绑定的服务账号(SA):
kubectl get clusterrolebindings -o wide | grep <上一步输出的集群角色名>
执行后可以拿到SA的名称和所属命名空间 - 查找使用该SA的Pod:
kubectl get pods -A -o custom-columns=POD_NAME:.metadata.name,NAMESPACE:.metadata.namespace,SA:.spec.serviceAccountName | grep <上一步得到的SA名称>
最终输出的Pod就是负责foo CRD调和逻辑的控制器实例。
补充说明
部分多合一Operator的单个Pod会同时负责多个CRD的调和逻辑,属于正常情况。
内容的提问来源于stack exchange,提问作者vincent pli
相关产品推荐
相关产品推荐

