背景
Kubernetes Operator 是 Kubernetes 生态系统中的一个重要概念,它是一种自动化管理和运维应用程序的方式。Operator 是一个自定义控制器,它扩展了 Kubernetes API,使您能够定义和使用自定义资源,并在这些资源的状态发生变化时采取特定的操作。
传统的 Kubernetes 控制器负责管理内置资源,如 Deployments、Services、Pods 等,它们对于 Kubernetes 的核心功能至关重要。但是,许多应用程序需要更高级的管理,以满足特定的业务需求,这就是 Operator 出现的原因。
Operator 通过将应用程序专业知识内嵌到 Kubernetes 控制器中,实现了对应用程序的自动化管理。这使得 Operator 能够在 Kubernetes 上自动执行复杂的应用程序操作,而不仅仅是简单的部署和伸缩。
Operator 的特点包括:
-
自定义资源定义(CRD): Operator 使用自定义资源定义来扩展 Kubernetes API。通过定义自己的 CRD,您可以在 Kubernetes 中创建自定义资源,这些资源由 Operator 进行管理。
-
自动化管理: Operator 能够根据定义的规则自动处理自定义资源的状态变化,如创建、更新和删除资源。
-
声明式配置: 通过使用 CRD,Operator 使应用程序的配置和管理变得声明式。您只需要定义期望状态,Operator 会负责确保实际状态与期望状态一致。
-
多种工具支持: 有许多工具和框架可用于开发 Operator。其中,Operator SDK 是一个流行的工具,它提供了一组开发工具、模板和框架,简化了 Operator 的开发过程。
-
社区驱动: Kubernetes Operator 生态系统是一个活跃的社区,有许多开源 Operator 可供使用,涵盖了各种不同的应用程序和服务。
Operator 在许多方面都有用武之地,例如数据库管理、应用程序配置管理、监控和自愈、复杂服务部署等。它们能够为 Kubernetes 用户提供更高级、更智能的管理体验,简化了应用程序的部署和运维工作。
要开发自己的 Operator,可以使用 Operator SDK 或手动编写 Kubernetes 控制器代码。然后,通过自定义资源定义来描述您的应用程序,并实现 Operator 的逻辑,以根据应用程序的需求自动化管理和维护。
现在我们正式开始一步步搭建k8s operator应用。
一.搭建开发环境
1.安装kubernetes
推荐先安装docker-desktop,然后在配置中选择部署k8s进行一键安装
https://www.docker.com/products/docker-desktop/
2.安装operator-sdk
macOS: 直接使用使用homebrew
brew install operator-sdk
linux: 指定目录然后执行一下命令
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.30.0
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
3.创建项目
上一步我们把operator-sdk放到了bin目录,现在可以直接执行命令,一下命令均以linux系统为例
mkdir idc-demo-operator
cd idc-demo-operator
operator-sdk init --plugins go/v3 --domain idc.demo.com --owner "Myname"
一上命令我们在idc-demo-operator创建了项目,可以看到项目结构如下
tree
.
├── 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
4.创建自定义资源 (CRD)
在这个例子中我们利用operator部署套应用,下面我们定义应用都需要的资源-数据库,资源名称叫MyDatabase
operator-sdk create api --group idc.demo --version v1alpha1 --kind MyDatabase
然后我们再创建一个资源叫MyApplication
operator-sdk create api --group idc.demo --version v1alpha1 --kind MyApplication
至此,一个简单的operator框架已搭建完成。
项目结构如下:
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── api
│ └── v1alpha1
│ ├── groupversion_info.go
│ ├── myapplication_types.go
│ ├── mydatabase_types.go
│ └── zz_generated.deepcopy.go
├── bin
│ └── controller-gen
├── config
│ ├── crd
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_myapplications.yaml
│ │ ├── cainjection_in_mydatabases.yaml
│ │ ├── webhook_in_myapplications.yaml
│ │ └── webhook_in_mydatabases.yaml
│ ├── 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
│ │ ├── myapplication_editor_role.yaml
│ │ ├── myapplication_viewer_role.yaml
│ │ ├── mydatabase_editor_role.yaml
│ │ ├── mydatabase_viewer_role.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ ├── samples
│ │ ├── idc.demo_v1alpha1_myapplication.yaml
│ │ ├── idc.demo_v1alpha1_mydatabase.yaml
│ │ └── kustomization.yaml
│ └── scorecard
│ ├── bases
│ │ └── config.yaml
│ ├── kustomization.yaml
│ └── patches
│ ├── basic.config.yaml
│ └── olm.config.yaml
├── controllers
│ ├── myapplication_controller.go
│ ├── mydatabase_controller.go
│ └── suite_test.go
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
└── main.go
17 directories, 50 files
其中:
api目录下的是我们需要修改的实体类
controller目录下的我们需要实现我们的部署逻辑,以上将在下一期介绍
5.结语
本篇文章介绍了如何搭建operator项目框架,下一期我将介绍如何实现operator的逻辑。