zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【云原生】Kubernetes 有状态应用程序控制器 Operator

Kubernetes状态应用程序 原生 控制器 Operator
2023-09-14 09:12:55 时间

一、概述

  • Operator 概念是由 CoreOS 的工程师于2016年提出的,也是由 CoreOS 开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。
  • Operator SDK 是一个框架,它使用控制器运行时库通过提供以下功能使编写运算符更容易。
  • Operator SDKOperator Framework的一个组件,这是一个开源工具包,用于以有效、自动化和可扩展的方式管理 Kubernetes 原生应用程序,称为 OperatorsOperator 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 提供了在 GoAnsibleHelm 中开发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)公共目录/文件

文件/目录描述
DockerfileOperator项目的 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 介绍和简单使用 就先到这里了,这里只是简单的演示了官方文档里的示例,后面会有企业实战案例,请小伙伴耐心等待哦,有疑问的小伙伴欢迎给我留言哦,会持续更新【云原生和大数据】相关的文章~