我正在使用 Kubebuilder 創建一個新的 Operator 來部署 Kubernetes 控制器來管理新的 CRD 自定義資源定義。
這個新的 CRD(假設被稱為MyNewResource)需要列出/創建/洗掉 CronJobs。
因此,在定義該方法的 Controller Go 代碼中,Reconcile(...)我添加了一個新的 RBAC 注釋以允許對 CronJobs 進行協調(請參見此處):
// kubebuilder:rbac:groups=batch,resources=cronjobs,verbs=get;list;watch;create;update;patch;delete
然而,在構建推送和部署 Docker/Kubernetes 控制器(repo myrepo、make manifests、 then make install、 then make docker-build docker-push、 then make deploy)之后,我仍然在日志中看到:
E0111 09:35:18.785523 1 reflector.go:138] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:167: Failed to watch *v1beta1.CronJob: failed to list *v1beta1.CronJob: cronjobs.batch is forbidden: User "system:serviceaccount:myrepo-system:myrepo-controller-manager" cannot list resource "cronjobs" in API group "batch" at the cluster scope
我還看到有關快取的問題,但它們可能不相關(不確定):
2022-01-11T09:35:57.857Z ERROR controller.mynewresource Could not wait for Cache to sync {"reconciler group": "mygroup.mydomain.com", "reconciler kind": "MyNewResource", "error": "failed to wait for mynewresource caches to sync: timed out waiting for cache to be synced"}
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start
/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/internal/controller/controller.go:234
sigs.k8s.io/controller-runtime/pkg/manager.(*controllerManager).startRunnable.func1
/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/manager/internal.go:696
2022-01-11T09:35:57.858Z ERROR error received after stop sequence was engaged {"error": "leader election lost"}
2022-01-11T09:35:57.858Z ERROR setup problem running manager {"error": "failed to wait for mynewresource caches to sync: timed out waiting for cache to be synced"}
如何讓我的新 Operator 處理 CronJobs 資源?
目前,當我通過呼叫為我的 CRD 的新實體提供一些 YAML 時,基本上我無法以編程方式(Go 代碼)創建新的 CronJobs:
kubectl create -f mynewresource-project/config/samples/
uj5u.com熱心網友回復:
您需要創建新的角色或 ClusterRole(取決于您是否希望您的權限是命名空間或集群范圍的)并system:serviceaccount:myrepo-system:myrepo-controller-manager使用 RoleBinding/ClusterRoleBinding 將其系結到您的用戶。我將提供集群范圍配置的示例。
集群角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cronjobs-role
rules:
- apiGroups: [""]
resources: ["cronjobs"]
verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]
然后,使用 ClusterRoleBinding 系結它:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cronjobs-rolebinding
subjects:
- kind: User
name: system:serviceaccount:myrepo-system:myrepo-controller-manager
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cronjob-role
apiGroup: rbac.authorization.k8s.io
從您的日志來看,您可能想要使用batchapiGroup 但我會留下更通用的示例。更多關于 k8s RBAC的資訊在這里。
Kubebuilder
使用 Kubebuilder,ClusterRole 和 ClusterRoleBinding YAML 代碼會自動生成并存盤在config/rbac/目錄中。
要授予對所有組的系結(而不僅僅是batch),您可以將 Go 注釋與星號放在一起,如下所示:
// kubebuilder:rbac:groups=*,resources=cronjobs,verbs=get;list;watch;create;update;patch;delete
這會將自動生成的 YAML 更改為ClusterRole:
rules:
- apiGroups:
- '*' # instead of simply: batch
部署更新后的操作員時,控制器應該能夠列出/創建/洗掉 CronJobs。
請參閱此處以獲取 Kubebuilder 評論的參考 RBAC
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410382.html
標籤:
上一篇:什么是最小可行吊艙(MVP)
