myramay/kubernetes-controller

GitHub: myramay/kubernetes-controller

基于 kubebuilder 构建的 Kubernetes 自定义控制器,通过声明式 CRD 自动化管理多租户命名空间的配额、网络策略及完整生命周期。

Stars: 0 | Forks: 0

# k8s-controller 一个使用 `controller-runtime` 构建的自定义 Kubernetes 控制器。负责监听自定义资源,根据集群协调期望状态,并管理依赖对象的完整生命周期。 ![Go 1.22](https://img.shields.io/badge/Go-1.22+-blue) ![Kubernetes 1.28+](https://img.shields.io/badge/Kubernetes-1.28+-blue) ![controller-runtime](https://img.shields.io/badge/controller--runtime-latest-green) ## 概述 协调器遵循标准的“观察 → 比较 → 执行”模式。所有变更操作均通过服务端应用处理。发生错误时,请求将通过指数退避机制重新排队。 ``` CRD applied → API server → informer cache → work queue → reconcile loop → status update ``` ## 项目结构 ``` k8s-controller/ ├── api/v1alpha1/ │ ├── types.go # CRD spec + status types │ └── zz_generated.deepcopy.go ├── internal/controller/ │ ├── reconciler.go # core reconcile loop │ ├── reconciler_test.go │ └── predicates.go # event filter logic ├── config/ │ ├── crd/ # generated CRD manifests │ ├── rbac/ # ClusterRole + binding │ └── manager/ # Deployment manifest ├── main.go └── Makefile ``` ## 前置条件 - Go 1.22+ - 已配置连接至集群的 `kubectl` - 已安装 `controller-gen` 和 `kustomize` - 本地开发使用的 `kind` 或 `minikube` ## 快速开始 ``` # 1. 克隆并安装 deps git clone https://github.com/you/k8s-controller && cd k8s-controller && go mod tidy # 2. 生成 CRD manifests 和 deepcopy make generate && make manifests # 3. 将 CRDs 安装到集群中 make install # 4. 在本地运行 controller(使用当前的 kubeconfig context) make run # 5. 应用示例 resource kubectl apply -f config/samples/v1alpha1_sample.yaml ``` ## 协调循环 ``` func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // 1. fetch the custom resource obj := &apiv1alpha1.MyResource{} if err := r.Get(ctx, req.NamespacedName, obj); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } // 2. examine desired vs actual state if err := r.reconcileChildren(ctx, obj); err != nil { r.recorder.Event(obj, "Warning", "ReconcileFailed", err.Error()) return ctrl.Result{}, err // requeue with backoff } // 3. update status subresource obj.Status.Phase = "Ready" return ctrl.Result{}, r.Status().Update(ctx, obj) } ``` ## 部署至集群 ``` # 构建并推送镜像 make docker-build docker-push IMG=your-registry/k8s-controller:v0.1.0 # 通过 kustomize 部署 make deploy IMG=your-registry/k8s-controller:v0.1.0 # 验证 kubectl get pods -n k8s-controller-system ``` ## RBAC 权限是根据 `reconciler.go` 中的 `+kubebuilder:rbac` 标记自动生成的。该控制器需要: - 对自定义资源具有 `get, list, watch, create, update, patch, delete` 权限 - 对依赖资源类型(例如 Deployments、Services)具有 `get, list, watch` 权限 - 对 `events` 具有 `update` 权限以支持 recorder 更改标记后请运行 `make manifests` 以重新生成 `config/rbac/`。 ## 测试 ``` # 单元测试(envtest,无需真实集群) make test # 针对活动 kind 集群的集成测试 make test-e2e ``` 测试套件使用 `envtest` 启动本地 API server 和 etcd。测试在无客户端 mock 的情况下执行真实的协调路径。 ## 贡献 在提交大型 PR 之前请先提出 Issue。推送前请运行 `make lint` (golangci-lint) 和 `make test`。提交信息需遵循 conventional commits 格式。
标签:Admission Webhook, controller-gen, controller-runtime, Finalizer, Go, kind, kubebuilder, kustomize, minikube, NetworkPolicy, Operator, RBAC, Reconcile Loop, ResourceQuota, Ruby工具, Server-Side Apply, 代码生成, 命名空间管理, 子域名突变, 控制器, 控制器模式, 日志审计, 服务端应用, 权限控制, 渗透测试工具, 生命周期管理, 自动化运维, 自定义脚本, 自定义资源, 请求拦截, 调和循环