K8s二次开发operator

https://www.bilibili.com/video/BV188411S7jq/

前面我们介绍过控制器是什么。本节我们来介绍一下operator是什么。在K8S中,如果我们需要去管理复杂的应用或者服务的时候,仅仅使用这些核心的资源其实是不够的,不足以满足我们的需求。这个时候我们就需要使用operator了。

Operator是一种自定义管理的自定义控制器模式,可以让我们以更高级的方式去定义、部署、管理一些复杂的应用或者服务。想象一下,如果你要管理一个特定的应用程序,你需要考虑很多方面,比如说安装、配置、扩展、更新、监控等等。而operator可以帮助你将这些管理任务自动化,并以一个更抽象的方式去定义你的应用程序的行为和状态。

operator的核心概念包括两部分:自定义资源和自定义控制器。

  1. 自定义资源:你可以自定义自己的资源,以描述应用程序的特定行为和属性。例如,数据库的备份是一个行为,而什么时候备份则是一个属性。

  2. 自定义控制器:你需要编写一个自定义的控制器,它会去观察自定义资源的变化,并采取相应的操作,确保你的应用程序始终保持在你期望的状态。

举个例子,假设你有一个复杂的数据库应用程序。你可以创建一个自定义的资源来描述该数据库的配置、备份策略。然后编写一个自定义控制器,它会监视该自定义资源的状态,并根据定义的策略执行数据库的备份、调整容量等一系列操作。这些操作都是根据你定义好的期望状态自动调整的。

使用operator的好处是让你能够以一种更高级的方式去管理你的应用程序。你不再需要手动执行这些复杂的操作,而是通过自定义资源和控制器的方式来实现自动化管理。你只需要配置一下你的期望状态,然后剩下的交给控制器去实现就可以了。它就会让你的应用程序达到你想要的期望状态。

总之,operator是一种在K8S上管理应用程序或复杂服务的方式。它是通过自定义资源和自定义控制器的组合方式,能够让你以更高级的方式去定义、部署、管理你的应用程序,并自动化地执行一些管理任务。这样你可以更轻松地管理一些复杂的应用程序,并享受到自动化管理带来的好处。

这就是operator的一个大致介绍。大家简单先理解一下什么是operator就行了。然后我们就先到这里。

两个主要框架


https://github.com/operator-framework/operator-sdk 干什么用的?


Operator SDK 是一个开源工具集,用于简化 Kubernetes 上自定义Controller(Operators)的开发过程。自定义Controller是一种用于扩展 Kubernetes 功能的自定义控制器,它可以自动化和管理应用程序、服务或资源的生命周期。

Operator SDK 提供了以下主要功能:

  1. 项目初始化:Operator SDK 可以帮助你初始化一个自定义运算符项目的基本结构,包括必要的文件和目录布局。

  2. API 和控制器生成:Operator SDK 提供命令行工具,可以根据你定义的 API 规范自动生成自定义资源(Custom Resource Definitions,CRD)和相应的控制器代码。

  3. 开发和调试:Operator SDK 提供一组工具和库,帮助你在本地开发和调试自定义运算符。你可以使用这些工具运行一个本地的 Kubernetes 集群,进行快速迭代和测试。

  4. 运行时支持:Operator SDK 提供支持多种编程语言(如 Go、Ansible、Java 等)的运行时框架。你可以选择使用自己熟悉的语言和框架来编写自定义运算符。

使用 Operator SDK,开发人员可以更加轻松地创建、构建和部署自定义运算符,无需手动编写大量的模板代码和处理底层的 Kubernetes API。它提供了一种高级抽象和工具集,简化了自定义运算符的开发和维护,提高了开发效率和可靠性。

在自定义运算符中,你可以根据应用程序的需求定义自定义资源,通过控制器监视这些资源的状态,并在需要时自动执行相应的操作,例如扩容、配置更新、故障恢复等。这使得自定义运算符成为在 Kubernetes 上实现自动化管理和操作的强大工具。


https://github.com/kubernetes-sigs/kubebuilder 干什么用的?


Kubebuilder 是一个用于简化在 Kubernetes 上构建自定义控制器的开源工具集。它提供了一组命令行工具和库,帮助开发人员快速创建、测试和部署符合 Kubernetes API 标准的自定义资源和控制器。

Kubebuilder 的主要功能包括:

  1. 项目初始化:Kubebuilder 可以帮助你初始化一个自定义控制器项目的基本结构,包括必要的文件和目录布局。

  2. CRD 和控制器生成:Kubebuilder 提供代码生成工具,可以根据你定义的 API 规范自动生成自定义资源(Custom Resource Definitions,CRD)和相应的控制器代码。这些生成的代码遵循 Kubernetes API 的最佳实践和约定。

  3. 声明式开发:Kubebuilder 支持使用声明式配置来定义自定义资源和控制器的行为。你可以使用 Kubernetes 风格的 YAML 或 JSON 文件来指定资源的结构和行为,并利用 Kubebuilder 提供的工具进行验证和处理。

  4. 单元测试和集成测试:Kubebuilder 提供了一组测试框架和工具,用于编写单元测试和集成测试,确保自定义控制器在不同场景下的正确性和稳定性。

  5. CRD 版本管理:Kubebuilder 管理和追踪 CRD 版本的变化,帮助你管理自定义资源的演进和升级过程。

使用 Kubebuilder,开发人员可以更加高效地构建和部署符合 Kubernetes 标准的自定义控制器。它提供了一种规范化的开发流程和工具集,简化了自定义控制器的开发、测试和维护过程,同时也提供了一致性和可靠性。

自定义控制器是一种扩展 Kubernetes 功能的自定义控制器,它可以通过自定义资源的监视和管理,自动化执行一系列操作,例如创建、删除、调度和扩容等。Kubebuilder 提供了一个框架和工具,使得构建和管理这些自定义控制器变得更加容易和高效。

operator:初识 Operator

扩展 Kubernetes/Operator模式


二者哪个更好?


无法确定哪个工具集(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 20docker logs -f --tail=20


开始



新老版本很多命令看起来已经发生了改变

operator-sdk new shuang-operator --skip-validation=true --repo=github.com/cuishuang/shuang-operator


operator-sdk 如何新建一个项目

要使用 operator-sdk 创建一个新的 Kubernetes 操作符(Operator)项目,你可以按照以下步骤进行操作:

  1. 确保已安装 operator-sdk 工具。如果尚未安装,请按照上一个回答中的步骤进行安装。

  2. 使用 operator-sdk init 命令创建新项目。在终端中执行以下命令:

1
operator-sdk init --domain=example.com --repo=github.com/example/memcached-operator
  • --domain 标志用于设置项目的域名。
  • --repo 标志用于设置项目的存储库地址。
  1. 进入新创建的项目目录:
1
cd memcached-operator
  1. 使用 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 标志用于创建一个用于管理资源的控制器。
  1. 完成以上步骤后,你将在项目目录下看到一个包含你创建的资源的文件夹。例如,你将在 api/v1alpha1 目录下找到 memcached_types.go,它定义了你创建的 Memcached 资源的类型。

  2. 编辑这些文件来定义你的自定义资源的规格和状态,以及添加控制器逻辑来管理你的资源。

  3. 构建和部署你的操作符(Operator):

1
2
3
4
make generate
make manifests
make install
make run

以上命令将生成 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── config
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_auth_proxy_patch.yaml
│   │   └── manager_config_patch.yaml
│   ├── manager
│   │   ├── kustomization.yaml
│   │   └── manager.yaml
│   ├── manifests
│   │   └── kustomization.yaml
│   ├── prometheus
│   │   ├── kustomization.yaml
│   │   └── monitor.yaml
│   ├── rbac
│   │   ├── auth_proxy_client_clusterrole.yaml
│   │   ├── auth_proxy_role.yaml
│   │   ├── auth_proxy_role_binding.yaml
│   │   ├── auth_proxy_service.yaml
│   │   ├── kustomization.yaml
│   │   ├── leader_election_role.yaml
│   │   ├── leader_election_role_binding.yaml
│   │   ├── role_binding.yaml
│   │   └── service_account.yaml
│   └── scorecard
│   ├── bases
│   │   └── config.yaml
│   ├── kustomization.yaml
│   └── patches
│   ├── basic.config.yaml
│   └── olm.config.yaml
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
└── main.go

10 directories, 29 files


在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

这个命令不太行

kustomize

使用如下命令:

GOBIN=$(pwd)/ GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v4@latest


make generate

make manifests

装不了minikube…作罢。。




使用Kubebuilder编写operator 简单流程


使用kind构建本地测试k8s集群


1
2
3
4
5
6
7
8
9
brew install kind

#创建一个单节点k8s集群
kind create cluster --name kind
#展示出集群
kind get clusters
#为了与特定集群进行交互,您只需在 kubectl 中将集群名称指定为上下文
kubectl cluster-info --context kind-kind


https://github.com/kubernetes-sigs/kind 这个库干什么用的?


kind 是 Kubernetes IN Docker 的缩写,是一个由 Kubernetes SIGs(Special Interest Groups,特别兴趣小组)维护的开源项目。它用于在本地计算机上快速创建和管理一个轻量级的 Kubernetes 集群。

kind 允许您在单个 Docker 容器中运行一个本地 Kubernetes 集群,它使用了 Docker 容器和 Kubernetes 控制平面组件的二进制文件。通过 kind,您可以在本地开发环境中轻松地创建和测试 Kubernetes 集群,从而加快开发、测试和调试应用程序的过程。

主要特点和用途包括:

  1. 快速创建和销毁集群kind 可以在几秒钟内创建一个本地 Kubernetes 集群,并且在不需要时可以快速销毁。

  2. 轻量级和隔离kind 使用单个 Docker 容器作为 Kubernetes 集群,因此它在资源消耗方面非常轻量级,并且集群之间是相互隔离的。

  3. 可靠的本地开发环境:通过 kind,您可以在本地计算机上模拟生产环境中的 Kubernetes 集群,以进行应用程序的本地开发和测试。

  4. 适合测试和持续集成kind 可以集成到持续集成(CI)流程中,用于在测试阶段运行单元测试、集成测试和端到端测试等。

  5. 支持自定义配置:您可以使用 kind 提供的配置选项来自定义集群的配置,包括节点数量、Kubernetes 版本、节点的配置参数等。

kind 是 Kubernetes 社区中受欢迎的工具之一,它简化了在本地环境中部署和管理 Kubernetes 集群的过程,是开发者和测试人员的有用工具。它还可以作为学习 Kubernetes 或测试应用程序在 Kubernetes 上运行的良好选择。您可以在 kind 的 GitHub 仓库上找到更多关于它的详细信息、用法和文档:https://github.com/kubernetes-sigs/kind


更多探索可参考 从零开始快速搭建本地 Kubernetes 测试环境


部署 kubebuilder

1
2
3
curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)

chmod +x kubebuilder && mv kubebuilder /usr/local/bin/

使用kubebuilder创建一个项目,包括CRD的GVK(group,version,kind)


1
2
3
4
5
6
7
8
9
10
11
12
cd 某个目录 && go mod init demo-operator

#arm os架构初始化crd所属domain
kubebuilder init --domain my.domain --plugins="kustomize/v2-alpha,base.go.kubebuilder.io/v3" (m1在这一步会报错)
#其他比如amd等os架构
kubebuilder init --domain my.domain"
#创建crd 的schema以及controller逻辑
kubebuilder create api --group webapp --version v1 --kind DemeOperator
> y
> y
#创建crd资源清单
make manifests

可以用下面的命令:

1
2
3
4
5
6
7
8

kubebuilder init --domain cloud.com --owner "yuanqh" --skip-go-version-check

kubebuilder create api --group hft --version v1 --kind VirtualMachine
y
y

make manifests

本地测试以及打包发布


1
2
3
4
#部署crd到默认k8s集群,默认~/.kube/config
make install
#运行controller
make run

说明是可以的~


TonyBai: 使用Go开发Kubernetes Operator:基本结构