https://www.bilibili.com/video/BV188411S7jq/
前面我们介绍过控制器是什么。本节我们来介绍一下operator是什么。在K8S中,如果我们需要去管理复杂的应用或者服务的时候,仅仅使用这些核心的资源其实是不够的,不足以满足我们的需求。这个时候我们就需要使用operator了。
Operator是一种自定义管理的自定义控制器模式,可以让我们以更高级的方式去定义、部署、管理一些复杂的应用或者服务。想象一下,如果你要管理一个特定的应用程序,你需要考虑很多方面,比如说安装、配置、扩展、更新、监控等等。而operator可以帮助你将这些管理任务自动化,并以一个更抽象的方式去定义你的应用程序的行为和状态。
operator的核心概念包括两部分:自定义资源和自定义控制器。
自定义资源:你可以自定义自己的资源,以描述应用程序的特定行为和属性。例如,数据库的备份是一个行为,而什么时候备份则是一个属性。
自定义控制器:你需要编写一个自定义的控制器,它会去观察自定义资源的变化,并采取相应的操作,确保你的应用程序始终保持在你期望的状态。
举个例子,假设你有一个复杂的数据库应用程序。你可以创建一个自定义的资源来描述该数据库的配置、备份策略。然后编写一个自定义控制器,它会监视该自定义资源的状态,并根据定义的策略执行数据库的备份、调整容量等一系列操作。这些操作都是根据你定义好的期望状态自动调整的。
使用operator的好处是让你能够以一种更高级的方式去管理你的应用程序。你不再需要手动执行这些复杂的操作,而是通过自定义资源和控制器的方式来实现自动化管理。你只需要配置一下你的期望状态,然后剩下的交给控制器去实现就可以了。它就会让你的应用程序达到你想要的期望状态。
总之,operator是一种在K8S上管理应用程序或复杂服务的方式。它是通过自定义资源和自定义控制器的组合方式,能够让你以更高级的方式去定义、部署、管理你的应用程序,并自动化地执行一些管理任务。这样你可以更轻松地管理一些复杂的应用程序,并享受到自动化管理带来的好处。
这就是operator的一个大致介绍。大家简单先理解一下什么是operator就行了。然后我们就先到这里。
两个主要框架
https://github.com/operator-framework/operator-sdk 干什么用的?
Operator SDK 是一个开源工具集,用于简化 Kubernetes 上自定义Controller(Operators)的开发过程。自定义Controller是一种用于扩展 Kubernetes 功能的自定义控制器,它可以自动化和管理应用程序、服务或资源的生命周期。
Operator SDK 提供了以下主要功能:
项目初始化:Operator SDK 可以帮助你初始化一个自定义运算符项目的基本结构,包括必要的文件和目录布局。
API 和控制器生成:Operator SDK 提供命令行工具,可以根据你定义的 API 规范自动生成自定义资源(Custom Resource Definitions,CRD)和相应的控制器代码。
开发和调试:Operator SDK 提供一组工具和库,帮助你在本地开发和调试自定义运算符。你可以使用这些工具运行一个本地的 Kubernetes 集群,进行快速迭代和测试。
运行时支持:Operator SDK 提供支持多种编程语言(如 Go、Ansible、Java 等)的运行时框架。你可以选择使用自己熟悉的语言和框架来编写自定义运算符。
使用 Operator SDK,开发人员可以更加轻松地创建、构建和部署自定义运算符,无需手动编写大量的模板代码和处理底层的 Kubernetes API。它提供了一种高级抽象和工具集,简化了自定义运算符的开发和维护,提高了开发效率和可靠性。
在自定义运算符中,你可以根据应用程序的需求定义自定义资源,通过控制器监视这些资源的状态,并在需要时自动执行相应的操作,例如扩容、配置更新、故障恢复等。这使得自定义运算符成为在 Kubernetes 上实现自动化管理和操作的强大工具。
https://github.com/kubernetes-sigs/kubebuilder 干什么用的?
Kubebuilder 是一个用于简化在 Kubernetes 上构建自定义控制器的开源工具集。它提供了一组命令行工具和库,帮助开发人员快速创建、测试和部署符合 Kubernetes API 标准的自定义资源和控制器。
Kubebuilder 的主要功能包括:
项目初始化:Kubebuilder 可以帮助你初始化一个自定义控制器项目的基本结构,包括必要的文件和目录布局。
CRD 和控制器生成:Kubebuilder 提供代码生成工具,可以根据你定义的 API 规范自动生成自定义资源(Custom Resource Definitions,CRD)和相应的控制器代码。这些生成的代码遵循 Kubernetes API 的最佳实践和约定。
声明式开发:Kubebuilder 支持使用声明式配置来定义自定义资源和控制器的行为。你可以使用 Kubernetes 风格的 YAML 或 JSON 文件来指定资源的结构和行为,并利用 Kubebuilder 提供的工具进行验证和处理。
单元测试和集成测试:Kubebuilder 提供了一组测试框架和工具,用于编写单元测试和集成测试,确保自定义控制器在不同场景下的正确性和稳定性。
CRD 版本管理:Kubebuilder 管理和追踪 CRD 版本的变化,帮助你管理自定义资源的演进和升级过程。
使用 Kubebuilder,开发人员可以更加高效地构建和部署符合 Kubernetes 标准的自定义控制器。它提供了一种规范化的开发流程和工具集,简化了自定义控制器的开发、测试和维护过程,同时也提供了一致性和可靠性。
自定义控制器是一种扩展 Kubernetes 功能的自定义控制器,它可以通过自定义资源的监视和管理,自动化执行一系列操作,例如创建、删除、调度和扩容等。Kubebuilder 提供了一个框架和工具,使得构建和管理这些自定义控制器变得更加容易和高效。
二者哪个更好?
无法确定哪个工具集(Operator SDK 和 Kubebuilder)更好,因为它们针对不同的使用场景和需求而设计,各有其优点和适用性。
Operator SDK 和 Kubebuilder 都是在 Kubernetes 上构建自定义控制器的工具集,但它们有一些区别:
Operator SDK:Operator SDK 提供了一种更加简化和快速的开发体验。它使用 Go 作为主要的开发语言,并提供了一套用于生成自定义资源和控制器代码的命令行工具。Operator SDK 支持更高级的抽象,可快速生成操作符骨架和代码。它适合那些想要快速入门并迅速构建自定义控制器的开发人员。
Kubebuilder:Kubebuilder 提供了更多的灵活性和控制,适用于需要更多自定义和定制化的开发场景。它提供了一套用于生成自定义资源和控制器代码的命令行工具,但相比于 Operator SDK,它更加注重遵循 Kubernetes API 的最佳实践和约定。Kubebuilder 支持多种开发语言和更详细的代码生成选项,使开发人员能够更好地控制自定义控制器的行为。
选择哪个工具集 取决于你的具体需求和偏好。如果你希望快速入门并快速构建自定义控制器,Operator SDK 可能更适合你。如果你需要更多的定制化和灵活性,并且愿意花更多时间来遵循 Kubernetes 最佳实践,那么 Kubebuilder 可能更适合你。
无论选择哪个工具集,它们都是活跃的开源项目,你可以根据自己的需求和项目的特点来评估并选择适合你的工具。
libhunt: kubebuilder VS operator-sdk
看起来真的是半斤八两
准备工作
通过k8s的apiserver监听etcd里的watch事件感知到状态的变化
使用了自定义的Resource
K8s中有很多Controller,比如Deployment Controller,Node Controller,Namespace Controller,Replication Controller等
K8s的Controller本质上是个死循环,会不断watch apiserver的数据
第一次来时写到Local Store,后面再来数据时会对比,不一致对调用callbacks
真正干活的是Worker
先看一下别的operator怎么写的~
这里的etcd不是K8s底层用的那个
brew install operator-sdk
或者通过 https://github.com/operator-framework/operator-sdk/releases 下载相相应二进制文件
docker logs -f --tail 20 或 docker logs -f --tail=20
开始
新老版本很多命令看起来已经发生了改变
operator-sdk new shuang-operator --skip-validation=true --repo=github.com/cuishuang/shuang-operator
operator-sdk 如何新建一个项目
要使用 operator-sdk 创建一个新的 Kubernetes 操作符(Operator)项目,你可以按照以下步骤进行操作:
确保已安装
operator-sdk工具。如果尚未安装,请按照上一个回答中的步骤进行安装。使用
operator-sdk init命令创建新项目。在终端中执行以下命令:
1 | operator-sdk init --domain=example.com --repo=github.com/example/memcached-operator |
--domain标志用于设置项目的域名。--repo标志用于设置项目的存储库地址。
- 进入新创建的项目目录:
1 | cd memcached-operator |
- 使用
operator-sdk create api命令创建一个新的 API 资源。例如,创建一个名为v1alpha1版本的Memcached资源:
1 | operator-sdk create api --group=cache --version=v1alpha1 --kind=Memcached --resource=true --controller=true |
--group标志用于设置 API 资源所在的 API 组。--version标志用于设置 API 资源的版本。--kind标志用于设置 API 资源的类型(Kind)名称。--resource标志用于创建一个 Kubernetes 资源(CRD)。--controller标志用于创建一个用于管理资源的控制器。
完成以上步骤后,你将在项目目录下看到一个包含你创建的资源的文件夹。例如,你将在
api/v1alpha1目录下找到memcached_types.go,它定义了你创建的Memcached资源的类型。编辑这些文件来定义你的自定义资源的规格和状态,以及添加控制器逻辑来管理你的资源。
构建和部署你的操作符(Operator):
1 | make generate |
以上命令将生成 CRD 定义和控制器代码,将它们安装到 Kubernetes 环境中,并启动控制器来监视和管理你的自定义资源。
至此,你已成功创建了一个基本的 Kubernetes 操作符(Operator)项目,并且可以在其中定义和管理你自己的自定义资源。请根据你的实际需求和业务逻辑进一步完善你的项目。
朋友圈提问,推荐用kubebuilder的更多
参照 十分钟搞定k8s operator安装与部署,浅尝一下operator-sdk。后面主要还是用kubebuilder
operator-sdk init --domain=dashen.tech --repo=github.com/cuishuang/shuang-operator
WARN[0000] the platform of this environment (darwin/arm64) is not suppported by kustomize v3 (v3.8.7) which is used in this scaffold. You will be unable to download a binary for the kustomize version supported and used by this plugin. The currently supported platforms are: [“linux/amd64” “linux/arm64” “darwin/amd64”]
Error: failed to initialize project: unable to run pre-scaffold tasks of “base.go.kubebuilder.io/v3”: target directory is not empty (only go.mod, go.sum, files and directories with the prefix “.”, files with the suffix “.md” or capitalized files name are allowed); found existing file “operator-sdk_darwin_arm64”
kustomize v3 (v3.8.7)不支持m1…
新项目的目录结构如下:
1 | . |
在Linux上操作…
wget https://github.com/operator-framework/operator-sdk/releases/download/v1.30.0/operator-sdk_linux_amd64
operator-sdk init --domain=dashen.tech --repo=github.com/cuishuang/shuang-operator
按自己改过的命令执行 ../operator-sdk create api --group grouptestByshuang --version v1 --kind operatorTestByshuang --resource --controller
会报各种问题:
Error: failed to create API: unable to inject the resource to “base.go.kubebuilder.io/v3”: either Group or Domain is invalid: [a DNS-1123 subdomain must consist of lower case alphanumeric characters, ‘-‘ or ‘.’, and must start and end with an alphanumeric character (e.g. ‘my-name’, or ‘abc-123’, regex used for validation is ‘a-z0-9?(?:.a-z0-9?)*’)]
…
FATA[0000] failed to create API: unable to inject the resource to “base.go.kubebuilder.io/v3”: either Group or Domain is invalid: [a DNS-1123 subdomain must consist of lower case alphanumeric characters, ‘-‘ or ‘.’, and must start and end with an alphanumeric character (e.g. ‘my-name’, or ‘abc-123’, regex used for validation is ‘a-z0-9?(?:.a-z0-9?)*’)]
还是按教程命令:
operator-sdk init --domain domain1test --repo github.com/test/test
operator-sdk create api --group grouptest --version v1 --kind OperatorTest --resource --controller
GOBIN=$(pwd)/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3
这个命令不太行
使用如下命令:
GOBIN=$(pwd)/ GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v4@latest
make generate
make manifests
装不了minikube…作罢。。
使用kind构建本地测试k8s集群
1 | brew install kind |
https://github.com/kubernetes-sigs/kind 这个库干什么用的?
kind 是 Kubernetes IN Docker 的缩写,是一个由 Kubernetes SIGs(Special Interest Groups,特别兴趣小组)维护的开源项目。它用于在本地计算机上快速创建和管理一个轻量级的 Kubernetes 集群。
kind 允许您在单个 Docker 容器中运行一个本地 Kubernetes 集群,它使用了 Docker 容器和 Kubernetes 控制平面组件的二进制文件。通过 kind,您可以在本地开发环境中轻松地创建和测试 Kubernetes 集群,从而加快开发、测试和调试应用程序的过程。
主要特点和用途包括:
快速创建和销毁集群:
kind可以在几秒钟内创建一个本地 Kubernetes 集群,并且在不需要时可以快速销毁。轻量级和隔离:
kind使用单个 Docker 容器作为 Kubernetes 集群,因此它在资源消耗方面非常轻量级,并且集群之间是相互隔离的。可靠的本地开发环境:通过
kind,您可以在本地计算机上模拟生产环境中的 Kubernetes 集群,以进行应用程序的本地开发和测试。适合测试和持续集成:
kind可以集成到持续集成(CI)流程中,用于在测试阶段运行单元测试、集成测试和端到端测试等。支持自定义配置:您可以使用
kind提供的配置选项来自定义集群的配置,包括节点数量、Kubernetes 版本、节点的配置参数等。
kind 是 Kubernetes 社区中受欢迎的工具之一,它简化了在本地环境中部署和管理 Kubernetes 集群的过程,是开发者和测试人员的有用工具。它还可以作为学习 Kubernetes 或测试应用程序在 Kubernetes 上运行的良好选择。您可以在 kind 的 GitHub 仓库上找到更多关于它的详细信息、用法和文档:https://github.com/kubernetes-sigs/kind
更多探索可参考 从零开始快速搭建本地 Kubernetes 测试环境
部署 kubebuilder
1 | curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) |
使用kubebuilder创建一个项目,包括CRD的GVK(group,version,kind)
1 | cd 某个目录 && go mod init demo-operator |
可以用下面的命令:
1 |
|
本地测试以及打包发布
1 | #部署crd到默认k8s集群,默认~/.kube/config |
说明是可以的~
TonyBai: 使用Go开发Kubernetes Operator:基本结构
原文链接: https://dashen.tech/2023/07/02/K8s二次开发operator/
版权声明: 转载请注明出处.