operator-sdk init 报“kubebuilder not found”因v1.0+默认依赖kubebuilder做脚手架但不自动安装,需手动安装v3.20+并确保其在PATH中;Windows需重启终端或手动更新$env:PATH。

operator-sdk init 为什么报错“kubebuilder not found”
因为 operator-sdk v1.0+ 默认依赖 kubebuilder 二进制做 scaffolding,但它不会自动安装,只检查 PATH。你本地没装 kubebuilder,或者版本不匹配(比如用了 v4 但 operator-sdk 要求 v3),就会卡在这一步。
- 先运行
kubebuilder version确认是否在 PATH 里;没输出就去 官网下对应平台的二进制,解压后加到 PATH - operator-sdk v1.30+ 要求
kubebuilderv3.20+,别直接brew install kubebuilder—— Homebrew 默认装的是 v4,得指定:brew install kubebuilder@3 - Windows 用户注意:PowerShell 默认不读取
$env:PATH新增路径,改完要重启终端,或手动执行$env:PATH += ";C:\path\to\kubebuilder\bin"
Reconcile 函数里 client.Get 拿不到自定义资源
不是代码写错了,大概率是 RBAC 权限没配全,或者 CRD 的 scope 和实际使用方式对不上。Kubernetes 不会报“权限不足”的明确提示,而是静默返回 NotFound 错误。
- 检查
config/rbac/role.yaml是否包含对你 CRD 的get、list、watch权限,资源名必须和 CRD 文件里的spec.names.plural一致,比如redisclusters,不是RedisCluster - 确认 CRD 是 ClusterScoped 还是 Namespaced。如果 CRD 定义了
scope: Cluster,但你在 Reconcile 里用client.Get(ctx, req.NamespacedName, &myCR),它会去 namespace 下找 —— 必须用client.Get(ctx, types.NamespacedName{Name: req.Name}, &myCR)(去掉 Namespace) - 用
kubectl auth can-i get redisclusters --list --all-namespaces快速验证权限是否生效
ControllerRuntime 的 Manager 启动后不触发 Reconcile
最常见原因是 Watch 的对象没被正确注册,或者 Predicate 过滤掉了事件。Manager 启动成功 ≠ Controller 开始干活。
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 确保在
SetupWithManager里调用了Watches或Owns:比如mgr.GetFieldIndexer().IndexField(ctx, &appsv1.Deployment{}, "spec.template.spec.containers.image", ...)之后,必须显式Watches(&source.Kind{Type: &appsv1.Deployment{}}, ...),否则 Deployment 变更不会推给你的 Reconcile - 检查
predicate.GenerationChangedPredicate{}是否误用:它只在metadata.generation变时触发,而 ConfigMap/Secret 更新不会改 generation —— 这类资源得用predicate.LabelChangedPredicate{}或自定义 Predicate - 启动时加
--zap-devel参数,看日志里有没有Starting EventSource和Starting Controllers,没有说明 Controller 根本没注册进去
本地调试时 webhook server 启动失败:x509 certificate signed by unknown authority
因为 operator-sdk run --local 或 make install 生成的证书,CA 是临时的,Kubernetes API Server 不信任它,导致 admission webhook 被拒绝。
立即学习“go语言免费学习笔记(深入)”;
- 别手动替换
caBundle字段 —— 它由make cert-manager或operator-sdk create api自动生成,且必须和 webhook server 实际加载的证书一致 - 调试阶段优先关掉 webhook:注释掉
config/default/kustomization.yaml里webhookcainjection相关 patch,或删掉config/webhook整个目录(只要你不依赖 Validating/Mutating 逻辑) - 非要启用?那就用
make cert-manager生成证书后,再跑make deploy(不是make install),它会自动把 caBundle 注入到 YAML 中;本地调试用kubectl apply -k config/crd && kubectl apply -k config/default才可靠
Webhook 的证书链、caBundle、Service 名称、端口、failurePolicy,四个地方必须严丝合缝,差一个字符都会静默失败。别信文档里的默认值,用 kubectl get mutatingwebhookconfigurations -o yaml 对着现场看。

















