美文网首页K8s
一文学会kubernetes operator

一文学会kubernetes operator

作者: sknfie | 来源:发表于2022-01-13 17:54 被阅读0次

    背景

    在 Kubernetes 中使用的 Deployment, DaemonSet,StatefulSet, Service,Ingress, ConfigMap, Secret 这些都是资源对象,而对这些资源对象的创建、更新、删除的动作都会被称为为事件(Event),Kubernetes 的 Controller Manager 负责事件监听,并触发相应的动作来满足期望(Spec),这种方式也就是声明式,即用户只需要关心应用程序的最终状态。

    引言

    当这些资源不能满足我们的需求的时候,Kubernetes 提供了自定义资源(Custom Resource Definition)和 opertor 为应用程序提供基于 kuberntes 扩展。


    CRD

    CRD 则是对自定义资源的描述(Custom Resource Definition):

    • 这个资源有什么属性
    • 这些属性的类型是什么
    • 结构是怎样的

    自定义资源详解

    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: postgresqls.xxx.com
      labels:
        app.kubernetes.io/name: postgres-operator
      annotations:
        "helm.sh/hook": crd-install
    spec:
      group: xxx.com
      names:
        kind: postgresql
        listKind: postgresqlList
        plural: postgresqls
        singular: postgresql
        shortNames:
        - pg  additionalPrinterColumns:
      - name: Team
        type: string
        description: Team responsible for Postgres CLuster
        JSONPath: .spec.teamId
      - name: Version
        type: string
        description: PostgreSQL version
        JSONPath: .spec.postgresql.version
      - name: Pods
        type: integer
        description: Number of Pods per Postgres cluster
        JSONPath: .spec.numberOfInstances
      - name: Volume
        type: string
        description: Size of the bound volume
        JSONPath: .spec.volume.size
    

    从上面的 CRD 文件可以看到 CRD 主要包括apiVersion、kind、metadata和spec四个部分。
    其中最关键的是apiVersion和kind:

    • apiVersion表示资源所属组织和版本,apiVersion一般由APIGourp和Version组成,这里的 APIGourp 是apiextensions.k8s.io,Version 是v1beta1,相关信息可以通过kubectl api-resoures查看。
    • kind 表示资源类型,这里是CustomResourceDefinition,表示是一个自定义的资源描述。

    operator

    operator 是一种 kubernetes 的扩展形式,利用自定义资源对象(Custom Resource)来管理应用和组件,允许用户以 Kubernetes 的声明式 API 风格来管理应用及服务。operator 定义了一组在 Kubernetes 集群中打包和部署复杂业务应用的方法,operator主要是为解决特定应用或服务关于如何运行、部署及出现问题时如何处理提供的一种特定的自定义方式。比如:

    • 按需部署应用服务
    • 实现应用状态的备份和还原,完成版本升级
    • 数据库 schema 或额外的配置设置的改动
    • 为分布式应用进行master选举,例如etcd,或者master-slave架构的mysql集群。

    operator SDK

    operator SDK —— operator framework,是 CoreOS 公司开发和维护的用于快速创建 operator 的工具,可以帮助我们快速构建 operator 应用。

    operator 安装

    安装 operator sdk:

    export RELEASE_VERSION=v0.13.0
    curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
    chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
    

    基于模板创建项目

    用operator sdk 创建项目模板,这里用官方提供的一个sample-controller的模板:
    operator-sdk new <controller-name> --repo github.com/kubernetes/sample-controller

    $ operator-sdk new test-controller --repo github.com/kubernetes/sample-controller
    

    创建CRD

    operator-sdk add api --api-version=<api的版本> --kind=<类型名称>
    创建CRD后,多出来了文件夹:

    $ operator-sdk add api --api-version=test.k8s.realibox.com/v1 --kind=Realibox
    

    编写controller

    创建好 CRD 后,我们可以编写 controller 了,先创建一个 controller 监听和核对新创建的realibox资源类型:
    命令行说明:
    operator-sdk add controller --api-version=<api的版本> --kind=<类型名称>
    运行结果:

    $ operator-sdk add controller --api-version=test.k8s.realibox.com/v1 --kind=Realibox
    

    在pkg/controller目录下生成了controller代码,在pkg/controller/realibox/realibox_controller.go编写代码逻辑即可。
    下面就可以运行 controller 了。

    运行 controller

    运行controller有两种方法,可以在本地直接运行controller,也可以打包到k8s运行。
    在本地运行controller直接go run就可以了:

    export WATCH_NAMESPACE=default
    go run cmd/manager/main.go
    

    注意:不管是在本地运行还是远程运行都需要先在集群中创建CRD

    运行好后我们可以编写一个CR资源,提交到k8s集群中:

    apiVersion: test.k8s.realibox.com/v1
    kind: Realibox
    metadata:
      name: example-realibox
    spec:
      domain: "realibox.com"
      oss: "xxx.com"
      size: "3Gb"
    

    打包提交到k8s运行

    如果我们controller完成,我们可以将其打包放到k8s上运行.

    相关文章

      网友评论

        本文标题:一文学会kubernetes operator

        本文链接:https://www.haomeiwen.com/subject/rxnncrtx.html