Kubernetes Operator 项目实践
· 5 min read
Kubernetes Operator Architecture 架构
典型工作流示例
1. 编写代码、生成 CRD 和 部署清单
1. 安装依赖
brew install kubernetes-cli
brew install kubebuilder
2. 创建项目
mkdir k8s-operator-deploy-scaler
cd k8s-operator-deploy-scaler
# Option
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY=https://proxy.golang.org,direct # Default
kubebuilder init --domain scaler.com --repo github.com/xiaokatech/k8s-operator-deploy-scaler
go mod tidy # Update dependencies
- domain: 指定 Kubernetes Operator 的 API 组(API Group)的域名部分。这是 Kubernetes API 资源定义中的一个关键字段,用于唯一标识你的自定义资源(CRD - Custom Resource Definition)。
- 作用 1: Kubernetes API 资源通过
apiVersion
字段标识,格式为:<group>/<version>
(例如scaler.com/v1
)。这里的--domain
就是<group>
的一部分,通常与你的组织或项目域名相关。 - 作用 2: 使用域名(如
scaler.com
)可以确保全局唯一性(类似 Java 的包名),防止与其他 Operator 的 API 组冲突。即使别人也创建了同名的资源(如Deployment
),但通过不同的域名可以区分开(如yourcompany.com
和scaler.com
)。
- 作用 1: Kubernetes API 资源通过
kubebuilder create api --group api --version v1alpha1 --kind Scaler
make manifests # Update CRD
3. 更新 CRD 组件结构
make manifests # Reupdate CRD
apply -f config/crd/bases/api.scaler.com_scalers.yaml
每次更新 api/v1alpha1/scaler_types.go
文件后,记得运行 make manifests
然后安装 CRD apply -f config/crd/bases/api.scaler.com_scalers.yaml
。
4. 更新 CRD Controllers 组件结构
make run # Launch CRD Controller locally
kuberctl apply -f config/sample/api_v1alpha1_caler.yaml # @Test: test controller (CRD sample yaml file)
make install # Install CRD Controller into K8s cluster
5. 优化 CRD Controllers 组件结构
2. 构建镜像
export IMG=your-registry/your-operator:v1
make docker-build docker-push IMG=$IMG
- 镜像内容包含编译后的 Operator 二进制文件和依赖项。
3. 部署到 Kubernetes 集群
关键操作:
- 通过
kustomize
渲染最终部署文件(config/default/
)。 - 依次创建以下资源:
- CRD(如
myresources.mygroup.example.com
) - Namespace(默认
operator-system
) - RBAC(ServiceAccount/Role/ClusterRoleBinding)
- Deployment(运行 Controller Pod)
- CRD(如
4. Controller 启动流程
-
Pod 启动:
- Kubernetes 根据
Deployment
创建 Pod,拉取镜像并运行 Operator 二进制。 - 入口为
main.go
中定义的Manager
启动逻辑:
- Kubernetes 根据
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
-
初始化 Controller:
- Manager 加载所有注册的
Reconciler
(通过SetupWithManager
方法)。 - 建立 Informer 监听目标资源(Custom Resource/内置资源)。
- Manager 加载所有注册的
-
事件监听:
- 通过
client-go
的Informer
监听资源变更(Add/Update/Delete)。 - 将事件转化为
Reconcile
请求,提交到工作队列。
- 通过
5. 验证部署
object="operator-system"
kubectl get pods -n $object
kubectl logs -n $object deploy/operator-controller-manager -f
6. 卸载部署
make undeploy # 删除所有部署资源
kubectl delete crd myresources.mygroup.example.com # 可选:删除CRD
Kubernetes Operator 项目常用的 make 指令
在 Kubebuilder 项目中,make
命令是与项目构建、代码生成和部署相关的核心工具。以下是常用的 make
指令及其作用详解:
1. 项目初始化与脚手架
指令 | 作用 | 示例场景 |
---|---|---|
make init | 初始化 Kubebuilder 项目,生成基础目录结构(如 api/ 、config/ ) | 首次创建项目时执行 |
make create-api | 创建新的 API(CRD)和 Controller 脚手架 | 需要新增自定义资源时:make create-api GROUP=mygroup VERSION=v1 KIND=MyApp |
2. 代码与 CRD 生成
指令 | 作用 | 输出位置 |
---|---|---|
make generate | 生成客户端代码(如 deepcopy 函数) | zz_generated.deepcopy.go |
make manifests | 生成 CRD YAML 文件(基于 // +kubebuilder 标记) | config/crd/bases/ 目录 |
make generate manifests | 同时执行 generate 和 manifests (常用组合) | 修改 API 定义后必须执行 |
3. 构建与测试
指令 | 作用 | 注意事项 |
---|---|---|
make build | 编译 Operator 二进制文件 | 输出到 bin/ 目录 |
make test | 运行单元测试 | 需提前编写 _test.go 文件 |
make test-e2e | 运行端到端测试(需已部署 Kubernetes 集群) | 依赖 kubectl 和集群连接 |
4. 镜像与部署
指令 | 作用 | 关键参数 |
---|---|---|
make docker-build | 构建 Operator 的 Docker 镜像 | 通过 IMG=my-operator:v1 指定镜像名 |
make docker-push | 推送镜像到远程仓库 | 需提前登录 docker login |
make deploy | 将 Operator 部署到集群(依赖 config/manager 配置) | 通常配合 IMG 使用:make deploy IMG=my-operator:v1 |
make undeploy | 从集群中卸载 Operator | 清理所有相关资源 |
5. 开发调试
指令 | 作用 | 使用场景 |
---|---|---|
make install | 将 CRD 安装到当前集群(不部署 Operator) | 快速测试 CRD 定义 |
make uninstall | 卸载 CRD | 清理测试环境 |
make run | 本地运行 Operator(脱离集群,用于调试) | 依赖 kubeconfig 访问集群 |
6. 清理与辅助
指令 | 作用 | 备注 |
---|---|---|
make clean | 删除构建产物(如二进制文件) | 不删除生成的代码或 CRD |
make help | 显示所有可用的 make 指令及其说明 | 快速查阅 |