一文学会kubernetes operator

背景

在 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 --repo github.com/kubernetes/sample-controller

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

创建CRD

operator-sdk add api --api-version= --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= --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)