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


    一、概述

    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    六、简单使用

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    2、初始化项目
    mkdir memcached-operator ; cd memcached-operator
    # 注意当前目录必须是空目录
    operator-sdk init --domain example.com --repo github.com/example/memcached-operator
    
    • 1
    • 2
    • 3

    目录结构
    在这里插入图片描述

    3、创建api
    operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller
    
    • 1
    4、构建镜像
    # 如果需要push镜像,加上docker-push参数
    make docker-build IMG="example.com/memcached-operator:v0.0.1"
    
    • 1
    • 2
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行:

    make deploy IMG=example.com/memcached-operator:v0.0.1
    
    • 1
    6、创建自定义资源
    kubectl apply -f config/samples/cache_v1_memcached.yaml
    
    • 1
    7、删除自定义资源
    kubectl delete -f config/samples/cache_v1_memcached.yaml
    
    • 1
    8、卸载 operator
    make undeploy
    
    • 1

    2)helm-operator 简单使用

    1、初始化项目
    mkdir nginx-operator
    cd nginx-operator
    operator-sdk init --domain example.com --plugins helm
    
    • 1
    • 2
    • 3
    2、创建api
    operator-sdk create api --group demo --version v1alpha1 --kind Nginx
    
    • 1
    3、构建镜像
    make docker-build IMG="example.com/nginx-operator:v0.0.1"
    
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行:

    make deploy IMG="example.com/nginx-operator:v0.0.1"
    
    • 1
    5、创建自定义资源
    kubectl apply -f config/samples/demo_v1alpha1_nginx.yaml
    
    • 1
    6、删除自定义资源
    kubectl delete -f config/samples/demo_v1alpha1_nginx.yaml
    
    • 1
    7、卸载 operator
    make undeploy
    
    • 1

    关于 Kubernetes 有状态应用程序控制器 Operator 介绍和简单使用 就先到这里了,这里只是简单的演示了官方文档里的示例,后面会有企业实战案例,请小伙伴耐心等待哦,有疑问的小伙伴欢迎给我留言哦,会持续更新【云原生和大数据】相关的文章~

  • 相关阅读:
    MySQL8.0.28在Win10下安装
    Gbase数据库
    Laravel 第七章 回复数据
    Web基础与HTTP协议
    prometheus 告警
    c语言:初识指针
    原生js实现扫雷
    LeetCode中等题之求解方程
    Vuepress 三分钟搭建一个精美的文档或博客
    【数据结构初阶】Leetcode二叉树基础练习&&完全二叉树判断
  • 原文地址:https://blog.csdn.net/qq_35745940/article/details/126805077