介绍
Operator SDK 是 Operator Framework 的一个组件,Operator Framework 是一个开源工具包,用于以有效、自动化和可扩展的方式管理 Kubernetes 原生应用程序即 Operator。文档地址:
功能
Operator SDK 的主要功能包括:
- 脚手架: Operator SDK 提供了一个命令行工具,可以快速生成 Operator 的基础代码结构,包括 API 定义、控制器逻辑、测试框架等。这大大减少了手动编写样板代码的工作量。
- Reconciliation: Operator SDK 提供了一个基于 controller-runtime 库的 Reconciler 模型,可以帮助开发者编写控制器逻辑,实现对自定义资源的持续调协。
- OLM: Operator SDK 集成了 Operator Lifecycle Manager (OLM),帮助你安装、更新和管理跨集群的运行中的所有 Operator(以及他们的相关服务)
- 测试: Operator SDK 提供了一个内置的测试框架,可以帮助开发者编写单元测试和端到端测试,确保 Operator 的正确性。
工作流程
Operator SDK 提供了三种开发 Operator 的工作流。
go
- 使用SDK命令行界面(CLI)创建新的 Operator 项目
- 通过添加自定义资源定义(CRD)定义新资源 API
- 定义控制器以监视和协调资源
- 使用 SDK 和控制器运行时 API 编写控制器的协调逻辑
- 使用 SDK CLI 构建和生成部署清单
ansible
- 使用 SDK 命令行界面 (CLI) 创建新的 Operator 项目
- 使用 ansible playbook 和角色编写对象的协调逻辑
- 使用 SDK CLI 构建和生成部署清单
- 使用 SDK CLI 添加其他 CRD,然后重复步骤 2 和 3(可选)
helm
- 使用 SDK 命令行界面 (CLI) 创建新的 Operator 项目
- 创建一个新的(或添加现有的)Helm chart,供 Operator 的协调逻辑使用
- 使用 SDK CLI 构建和生成部署清单
- 使用 SDK CLI 添加其他 CRD,然后重复步骤 2 和 3(可选)
和kubebuilder的区别
两者都是为了用户方便创建和管理 Operator 而生的脚手架项目。对于用基于Golang开发的 Operator 项目而言,Operator SDK 在底层使用了 kubebuilder,例如 Operator SDK 的命令行工具底层实际是调用 kubebuilder 的命令行工具。所以无论由 Operator SDK 还是 kubebuilder 创建的 Operator 项目都是调用的 controller-runtime
接口。
Operator SDK 的功能更丰富,因此学习起来可能会更加复杂。kubebuilder 则相对更简单,更容易上手。
除此以外,Operator SDK 还增加了一些特性。默认情况下,使用 Operator SDK init生成的项目集成如下功能:
- Operator Lifecycle Manager,安装和管理 Operator 的系统
- OperatorHub,发布 Operator 的社区中心
- Operator sdk scorecard,它根据配置文件和测试映像对 Operator 进行测试。
另外,Operator SDK 除了支持 GO 以外,还支持 Ansible 和 Helm。
安装
可以采用下载安装包或者clone的方法。
export ARCH=$(case $(uname -m) in x86_64) echo -n amd64 ;; aarch64) echo -n arm64 ;; *) echo -n $(uname -m) ;; esac)
export OS=$(uname | awk '{print tolower($0)}')
export OPERATOR_SDK_DL_URL=https://github.com/operator-framework/operator-sdk/releases/download/v1.34.2
# https://github.com/operator-framework/operator-sdk/releases/download/v1.34.2/helm-operator_linux_amd64
# https://github.com/operator-framework/operator-sdk/releases/download/v1.34.2/operator-sdk_linux_amd64
curl -LO ${OPERATOR_SDK_DL_URL}/operator-sdk_${OS}_${ARCH}
chmod +x operator-sdk_${OS}_${ARCH} && sudo mv operator-sdk_${OS}_${ARCH} /usr/local/bin/operator-sdk
# mv operator-sdk_linux_amd64 /usr/local/bin/operator-sdk
git clone https://github.com/operator-framework/operator-sdk
cd operator-sdk
git checkout master
make install
operator-sdk -h
The first step is to initialize your project:
operator-sdk init [--plugins=<PLUGIN KEYS> [--project-version=<PROJECT VERSION>]]
<PLUGIN KEYS> is a comma-separated list of plugin keys from the following table
and <PROJECT VERSION> a supported project version for these plugins.
Plugin keys | Supported project versions
-----------------------------------------------+----------------------------
ansible.sdk.operatorframework.io/v1 | 3
declarative.go.kubebuilder.io/v1 | 2, 3
deploy-image.go.kubebuilder.io/v1-alpha | 3
go.kubebuilder.io/v2 | 2, 3
go.kubebuilder.io/v3 | 3
go.kubebuilder.io/v4 | 3
grafana.kubebuilder.io/v1-alpha | 3
helm.sdk.operatorframework.io/v1 | 3
hybrid.helm.sdk.operatorframework.io/v1-alpha | 3
quarkus.javaoperatorsdk.io/v1-beta | 3
For more specific help for the init command of a certain plugins and project version
configuration please run:
operator-sdk init --help --plugins=<PLUGIN KEYS> [--project-version=<PROJECT VERSION>]
Default plugin keys: "go.kubebuilder.io/v4"
Default project version: "3"
Available Commands:
alpha Alpha-stage subcommands
bundle Manage operator bundle metadata
cleanup Clean up an Operator deployed with the 'run' subcommand
completion Load completions for the specified shell
create Scaffold a Kubernetes API or webhook
edit Update the project configuration
generate Invokes a specific generator
help Help about any command
init Initialize a new project
olm Manage the Operator Lifecycle Manager installation in your cluster
pkgman-to-bundle Migrates packagemanifests to bundles
run Run an Operator in a variety of environments
scorecard Runs scorecard
version Print the operator-sdk version
-h, --help help for operator-sdk
--plugins strings plugin keys to be used for this subcommand execution
--project-version string project version (default "3")
--verbose Enable verbose logging
命令补全
operator-sdk completion bash > /etc/bash_completion.d/operator-sdk