文章目录
一、概述
Operator
概念是由CoreOS
的工程师于2016年提出的,也是由 CoreOS 开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用
,如数据库、缓存和监控系统。- Operator SDK 是一个框架,它使用控制器运行时库通过提供以下功能使编写运算符更容易。
Operator SDK
是Operator Framework
的一个组件,这是一个开源工具包,用于以有效、自动化和可扩展的方式管理 Kubernetes 原生应用程序,称为Operators
。Operator Framework
框架包含两个主要的部分:Operator SDK
——无需了解复杂的 Kubernetes API 特性,即可让你根据你自己的专业知识构建一个 Operator 应用。Operator Lifecycle Management
——监督跨 Kubernetes 集群运行的所有 Operator(及其相关服务)的生命周期的安装、更新和管理。
Operator SDK
提供了构建、测试和打包 Operator 的工具。最初,SDK 促进了应用程序的业务逻辑(例如,如何扩展、升级或备份)与 Kubernetes API 的结合以执行这些操作。随着时间的推移,SDK 可以让工程师让应用程序更智能,并拥有云服务的用户体验。SDK 中包含了在 Operator 之间共享的领先实践和代码模式,以帮助防止重新发明轮子。Operator SDK
它本身也是一个框架,它使用控制器运行时库通过提供以下功能使编写运算符更容易:- 高级 API 和抽象,更直观地编写操作逻辑
- 用于快速启动新项目的脚手架和代码生成工具
- 涵盖常见操作员用例的扩展
官方文档:https://sdk.operatorframework.io/docs/overview/
在这里插入图片描述
二、Operator Lifecycle Manager(OLM)
Operator Lifecycle Manager
是便于管理 Kubernetes 集群上的 Operator 的基础。- 有了它,管理员可以控制哪些 Operator 在哪些命名空间中可用,以及谁可以与正在运行的 Operator 进行交互。
- 他们还可以管理 Operator 及其资源的整个生命周期,例如触发对 Operator 及其资源的更新或授予团队访问 Operator 以获取其集群切片的权限。
- 多个应用程序的生命周期在 Kubernetes 集群上进行管理。
- 简单的无状态应用程序可以利用
Operator Framework
的生命周期管理功能,而无需使用通用 Operator(例如Helm Operator)编写任何代码。 - 复杂和有状态的应用程序是 Operator 可以大放异彩的地方。编码到 Operator 代码中的类似云的功能可以提供高级用户体验,自动执行更新、备份和扩展等功能。
三、Operator 的三种类型
每种
Operator
类型都有一组不同的功能。在选择用于项目的类型时,了解每种项目类型的特性和限制以及Operator的用例非常重要。
SDK 提供了在 Go
、Ansible
或 Helm
中开发operators的工作流程。
Go Operator
类型的工作流程:
- 使用 SDK 命令行界面 (CLI) 创建新的Operator项目
- 通过添加自定义资源定义 (CRD) 来定义新的资源 API
- 定义控制器来监视和协调资源
- 使用 SDK 和控制器运行时 API 为控制器编写协调逻辑
- 使用 SDK CLI 构建和生成算子部署清单
Ansible Operator
类型的工作流程:
- 使用 SDK 命令行界面 (CLI) 创建新的Operator项目
- 使用 ansible 剧本和角色为您的对象编写协调逻辑
- 使用 SDK CLI 构建和生成算子部署清单
- (可选)使用 SDK CLI 添加其他 CRD 并重复步骤 2 和 3
Helm Operator
类型的工作流程:
- 使用 SDK 命令行界面 (CLI) 创建新的Operator项目
- 创建一个新的(或添加您现有的)Helm 图表以供操作员的协调逻辑使用
使用 SDK CLI 构建和生成算子部署清单 - (可选)使用 SDK CLI 添加其他 CRD 并重复步骤 2 和 3
四、Operator 项目目录结构
所有初始化的项目
operator-sdk init
都有一个共同的基础结构,它建立在kubebuilder 的项目布局上。每个项目类型都使用该类型语言的代码进一步定制。
1)公共目录/文件
文件/目录 | 描述 |
---|---|
Dockerfile | Operator项目的 Dockerfile,用于使用make docker-build 构建镜像。 |
Makefile | 使用帮助目标构建文件以帮助您处理项目。 |
PROJECT | 该文件代表项目的配置,用于跟踪 CLI 和插件的有用信息。 |
bin/ | 该目录包含有用的二进制文件,例如manager用于在本地运行项目的二进制文件和kustomize用于项目配置的实用程序。对于其他语言类型,它可能具有其他对开发Operator 有用的二进制文件。 |
bundle/ | 此目录包含用于将您的项目与OLM以捆绑格式集成的所有文件。它是从 Makefile 目标构建的make bundle。 |
bundle/manifests/ | 此目录包含您的bundle的OLM 清单。 |
bundle/metadata/ | 此目录包含您的捆绑包的OLM 元数据,例如索引图像注释。 |
bundle/tests/ | 此目录包含随您的Operator 包一起提供的记分卡测试。 |
config/ | 包含用于在集群上启动项目的配置文件。插件可能会使用它来提供功能。例如,为了让 CLI 帮助创建您的Operator 包,它将查找在此目录中搭建的 CRD 和 CR。您还将找到所有Kustomize YAML 定义。 |
config/crd/ | 包含自定义资源定义。 |
config/default/ | 包含一个Kustomize 基础配置,用于在标准配置中启动控制器。 |
config/manager/ | 包含清单以将您的操作员项目作为集群上的 pod 启动。 |
config/manifests/ | 包含在捆绑目录中生成 OLM 清单的基础。 |
config/prometheus/ | 包含使项目能够向Prometheus提供指标(例如ServiceMonitor资源)所需的清单。 |
config/scorecard/ | 包含允许您使用记分卡测试项目所需的清单。 |
config/rbac/ | 包含运行项目所需的RBAC权限。 |
config/samples/ | 包含自定义资源。 |
bundle.Dockerfile | 用于构建捆绑镜像的 Dockerfile。用于使用 make bundle-build 。 |
2)Operator Ansible 专属目录/文件
文件/目录 | 描述 |
---|---|
config/testing/ | 清单文件可帮助您测试项目。例如,更改Molecule 测试的映像策略或在 Ansible 日志中启用调试级别。 |
molecule/ | 包含分子测试的清单。 |
molecule/default | 包含默认分子任务。 |
molecule/kind | 包含要在集群上执行的Molecule任务。 |
playbooks/ | 包含 Ansible 剧本。 |
roles/ | 包含每个 Kind 脚手架的 Ansible 角色文件。 |
requirements.yml | 此文件指定需要安装的 Ansible 依赖项,您的Operator 才能正常工作。 |
watches.yaml | 包含组、版本、种类以及剧本和规则位置。用于配置Ansible Watches。 |
3)Operator Golang 专属目录/文件
文件/目录 | 描述 |
---|---|
api/ | 包含 api 定义 |
config/certmanager | 包含通过 Webhook 配置证书管理器的 Kustomize 清单。 |
config/webhook | 包含用于配置 Webhook 的 Kustomize 清单。 |
controllers | 包含控制器。 |
main.go | 实现项目初始化。 |
hack/ | 包含实用程序文件,例如用于为项目文件构建许可证头的文件。 |
4)Operator Helm 专属目录/文件
文件/目录 | 描述 |
---|---|
helm-charts | 包含可以使用operator-sdk init --plugins=helm [options]或初始化的每个 Kind 脚手架的 Helm 图表operator-sdk create api [options]。 |
watches.yaml | 包含组、版本、种类和 Helm 图表位置。用于配置Helm Watches 。 |
五、Operator SDK CLI 安装
下载地址:https://github.com/operator-framework/operator-sdk/releases
operator sdk 官方文档:https://sdk.operatorframework.io/docs/installation/
【温馨提示】根据k8s版本下载版本版本的Operator SDK CLI
1)operator-sdk(go)
wget https://github.com/operator-framework/operator-sdk/releases/download/v1.22.1/operator-sdk_linux_amd64
# 添加可执行权限
chmod +x operator-sdk_linux_amd64
# 添加软链
ln -s /opt/k8s/crd/Operator/operator-sdk_linux_amd64 /usr/local/bin/operator-sdk
operator-sdk version
kubectl version --output=json
kubelet --version
2)ansible-operator(ansible)
wget https://github.com/operator-framework/operator-sdk/releases/download/v1.22.2/ansible-operator_linux_amd64
# 添加可执行权限
chmod +x ansible-operator_linux_amd64
# 添加软链
ln -s /opt/k8s/crd/Operator/ansible-operator_linux_amd64 /usr/local/bin/ansible-operator
ansible-operator version
kubectl version --output=json
kubelet --version
3)helm-operator(helm)
wget https://github.com/operator-framework/operator-sdk/releases/download/v1.22.2/helm-operator_linux_amd64
# 添加可执行权限
chmod +x helm-operator_linux_amd64
# 添加软链
ln -s /opt/k8s/crd/Operator/helm-operator_linux_amd64 /usr/local/bin/helm-operator
helm-operator version
kubectl version --output=json
kubelet --version
六、简单使用
1)operator-sdk 简单使用
1、安装 go 环境
安装包下载地址为:https://golang.org/dl/
如果打不开可以使用这个地址:https://golang.google.cn/dl/
wget https://golang.google.cn/dl/go1.19.1.linux-386.tar.gz
tar -xzf go1.19.1.linux-386.tar.gz -C /usr/local/
export PATH=$PATH:/usr/local/go/bin
# ~/.bash_profile 或者 /etc/profile,并将以下命令添加该文件的末尾,这样就永久生效了:
export PATH=$PATH:/usr/local/go/bin
source ~/.bash_profile
# 或
source /etc/profile
# go get更换国内镜像源
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
go help
go version
2、初始化项目
mkdir memcached-operator ; cd memcached-operator
# 注意当前目录必须是空目录
operator-sdk init --domain example.com --repo github.com/example/memcached-operator
目录结构
3、创建api
operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller
4、构建镜像
# 如果需要push镜像,加上docker-push参数
make docker-build IMG="example.com/memcached-operator:v0.0.1"
5、运行Operator
准备镜像:
docker save example.com/memcached-operator:v0.0.1 > memcached.tar
ctr -n k8s.io image import memcached.tar
docker pull kubesphere/kube-rbac-proxy:v0.11.0
docker tag kubesphere/kube-rbac-proxy:v0.11.0 gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0
docker save gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0 > kube-rabc-proxy.tar
ctr -n k8s.io image import kube-rabc-proxy.tar
运行:
make deploy IMG=example.com/memcached-operator:v0.0.1
6、创建自定义资源
kubectl apply -f config/samples/cache_v1_memcached.yaml
7、删除自定义资源
kubectl delete -f config/samples/cache_v1_memcached.yaml
8、卸载 operator
make undeploy
2)helm-operator 简单使用
1、初始化项目
mkdir nginx-operator
cd nginx-operator
operator-sdk init --domain example.com --plugins helm
2、创建api
operator-sdk create api --group demo --version v1alpha1 --kind Nginx
3、构建镜像
make docker-build IMG="example.com/nginx-operator:v0.0.1"
4、运行Operator
准备镜像:
docker save example.com/nginx-operator:v0.0.1 > nginx.tar
ctr -n k8s.io image import nginx.tar
docker pull kubesphere/kube-rbac-proxy:v0.11.0
docker tag kubesphere/kube-rbac-proxy:v0.11.0 gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0
docker save gcr.io/kubebuilder/kube-rbac-proxy:v0.11.0 > kube-rabc-proxy.tar
ctr -n k8s.io image import kube-rabc-proxy.tar
运行:
make deploy IMG="example.com/nginx-operator:v0.0.1"
5、创建自定义资源
kubectl apply -f config/samples/demo_v1alpha1_nginx.yaml
6、删除自定义资源
kubectl delete -f config/samples/demo_v1alpha1_nginx.yaml
7、卸载 operator
make undeploy
关于 Kubernetes 有状态应用程序控制器 Operator
介绍和简单使用 就先到这里了,这里只是简单的演示了官方文档里的示例,后面会有企业实战案例,请小伙伴耐心等待哦,有疑问的小伙伴欢迎给我留言哦,会持续更新【云原生和大数据】相关的文章~