Skip to main content

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)。
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 集群

关键操作

  1. 通过  kustomize  渲染最终部署文件(config/default/)。
  2. 依次创建以下资源:
    • CRD(如  myresources.mygroup.example.com
    • Namespace(默认  operator-system
    • RBAC(ServiceAccount/Role/ClusterRoleBinding)
    • Deployment(运行 Controller Pod)

4. Controller 启动流程

  1. Pod 启动

    • Kubernetes 根据  Deployment  创建 Pod,拉取镜像并运行 Operator 二进制。
    • 入口为  main.go  中定义的  Manager  启动逻辑:
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}

  1. 初始化 Controller

    • Manager 加载所有注册的  Reconciler(通过  SetupWithManager  方法)。
    • 建立 Informer 监听目标资源(Custom Resource/内置资源)。
  2. 事件监听

    • 通过  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同时执行 generatemanifests(常用组合)修改 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 指令及其说明快速查阅