学习 Kubernetes Operator(五):Operator SDK

Operator SDK 是 RedHat 主导的 Kubernetes Operator 开发框架。

Operator Hub 用于下载社区提供的 Operator。

和 Operator Framework 相似的还有 kubebuilder

准备

开发环境:

  • macOS
  • go 1.13.4

使用 HomeBrew 安装 Operator SDK:

brew install operator-sdk  

创建应用

在 $GOPATH/dyingbleed.com/dyingbleed 目录下,创建应用 app-operator:

OPERATOR_NAME=app-operator  
operator-sdk new $OPERATOR_NAME  

目录 app-operator 文件结构:

  • cmd Operator 程序主入口,注册 pkg/apis/ 目录下所有 CRD,启动 pkg/controllers/目录下所有 Controller;
  • pkg/apis 定义了 CRD 的 API;
  • pkg/controllers Controller 实现;
  • build 包含了 Dockerfile 和 Operator 构建脚本;
  • deploy 注册 CRD、设置 RBAC 权限、部署 Operator 的 YAML 文件;
  • go.modgo.sumGo module 文件。

安装依赖:

go mod download  

添加 API

创建 Group 为 app.dyingbleed.com 版本为 v1alpha1 Kind 为 App 的 API:

APP_KIND=App  
APP_API_GROUP=app.dyingbleed.com  
APP_API_VERSION=v1alpha1  
operator-sdk add api --kind=$APP_KIND --api-version="$APP_API_GROUP/$APP_API_VERSION"  

在 pkg/apis/app/v1alpha1/app_types.go 文件,定义了两个结构体:

  • type AppSpec struct {} 定义了可配置的应用状态;
  • type AppStatus struct {} 定义了可观察的应用状态。

为 Spec 添加字段 Name 和 Size,包括字段名、字段类型和 CR 中的字段名:

type AppSpec struct {  
  Name string `json:"name"`
  Size int `json:"size"`
}

生成代码和 CRD:

operator-sdk generate k8s && operator-sdk generate crds  

添加 Controller

创建 Group 为 app.dyingbleed.com 版本为 v1alpha1 Kind 为 App 的 Controller:

APP_KIND=App  
APP_API_GROUP=app.dyingbleed.com  
APP_API_VERSION=v1alpha1  
operator-sdk add controller --kind $APP_KIND --api-version "$APP_API_GROUP/$APP_API_VERSION"  

编辑 /pkg/controller/app/app_controller.go 文件,其中 func add(mgr manager.Manager, r reconcile.Reconciler) error 函数用于创建 Controller 并指定 watch 的资源和对应的 Reconcile,func (r *ReconcileApp) Reconcile(request reconcile.Request) (reconcile.Result, error) 方法处理 watch 资源事件的调节方法。

部署

构建并推送 Operator Docker 镜像:

operator-sdk build dyingbleed/app-operator  
docker push dyingbleed/app-operator  

更新 Opator 部署 YAML 文件:

sed -i 's|REPLACE_IMAGE|dyingbleed/app-operator|g' deploy/operator.yaml  

部署 Operator:

kubectl create -f deploy/service_account.yaml  
kubectl create -f deploy/role.yaml  
kubectl create -f deploy/role_binding.yaml  
kubectl create -f deploy/crds/app.dyingbleed.com_apps_crd.yaml  
kubectl create -f deploy/operator.yaml  

注意:默认情况下,Operator 的范围为 Namespace,即只作用于所在 Namespace,修改范围为 Cluster,参考 Operators and CRD scope with Operator SDK

参考