myramay/kubernetes-controller
GitHub: myramay/kubernetes-controller
基于 kubebuilder 构建的 Kubernetes 自定义控制器,通过声明式 CRD 自动化管理多租户命名空间的配额、网络策略及完整生命周期。
Stars: 0 | Forks: 0
# k8s-controller
一个使用 `controller-runtime` 构建的自定义 Kubernetes 控制器。负责监听自定义资源,根据集群协调期望状态,并管理依赖对象的完整生命周期。
  
## 概述
协调器遵循标准的“观察 → 比较 → 执行”模式。所有变更操作均通过服务端应用处理。发生错误时,请求将通过指数退避机制重新排队。
```
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, 代码生成, 命名空间管理, 子域名突变, 控制器, 控制器模式, 日志审计, 服务端应用, 权限控制, 渗透测试工具, 生命周期管理, 自动化运维, 自定义脚本, 自定义资源, 请求拦截, 调和循环