跳到主要内容

Kubernetes Operator 项目实践

· 阅读需 5 分钟

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同时执行 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 指令及其说明快速查阅