简介:operator 是一种 kubernetes 的扩展形式,可以帮助用户以 Kubernetes 的声明式 API 风格自定义来管理应用及服务,operator已经成为分布式应用在k8s集群部署的事实标准了,在云原生时代系统想迁移到k8s集群上编写operator应用是必不可少的能力,这里介绍用 CoreOS 的 operator framework 工具如何快速构建一个 operator 应用。

CRD

在 Kubernetes 中我们使用的 Deployment, DamenSet,StatefulSet, Service,Ingress, ConfigMap, Secret 这些都是资源,而对这些资源的创建、更新、删除的动作都会被成为为事件(Event),Kubernetes 的 Controller Manager 负责事件监听,并触发相应的动作来满足期望(Spec),这种方式也就是声明式,即用户只需要关心应用程序的最终状态。当我们在使用中发现现有的这些资源不能满足我们的需求的时候,Kubernetes 提供了自定义资源(Custom Resource)和 opertor 为应用程序提供基于 kuberntes 扩展。
CRD 则是对自定义资源的描述(Custom Resource Definition),也就是介绍这个资源有什么属性呀,这些属性的类型是什么,结构是怎样的这类。

我们看一个postgres-operator的CRD:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: postgresqls.acid.zalan.dolabels:app.kubernetes.io/name: postgres-operatorannotations:"helm.sh/hook": crd-install
spec:group: acid.zalan.donames:kind: postgresqllistKind: postgresqlListplural: postgresqlssingular: postgresqlshortNames:- pgadditionalPrinterColumns:- name: Teamtype: stringdescription: Team responsible for Postgres CLusterJSONPath: .spec.teamId- name: Versiontype: stringdescription: PostgreSQL versionJSONPath: .spec.postgresql.version- name: Podstype: integerdescription: Number of Pods per Postgres clusterJSONPath: .spec.numberOfInstances- name: Volumetype: stringdescription: Size of the bound volumeJSONPath: .spec.volume.size
...

从上面的 CRD 文件可以看到 CRD 主要包括apiVersionkindmetadataspec四个部分。其中最关键的是apiVersionkindapiVersion表示资源所属组织和版本,apiVersion一般由APIGourpVersion组成,这里的 APIGourp 是apiextensions.k8s.io,Version 是v1beta1,相关信息可以通过kubectl api-resoures查看。kind表示资源类型,这里是CustomResourceDefinition,表示是一个自定义的资源描述。

operator是什么

CoreOS 在 2016 年底提出了 Operator 的概念,当时的一段官方定义如下:

An Operator represents human operational knowledge in software, to reliably manage an application.

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

  • 按需部署应用服务(总不能用一大堆configmap来管理吧,也会很混乱~w(゚Д゚)w)
  • 实现应用状态的备份和还原,完成版本升级,比如
  • 数据库 schema 或额外的配置设置的改动
  • 为分布式应用进行master选举,例如etcd,或者master-slave架构的mysql集群。

operator SDK

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

  • KUDO (Kubernetes 通用声明式 Operator)
  • kubebuilder,kubernetes SIG 在维护的一个项目
  • Metacontroller,可与 Webhook 结合使用,以实现自己的功能。

如果希望查看 Operator 生态,可以上 http://operatorhub.io ,也可以将自己创建的应用发布上去。

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
$ tree
.
├── build
│   ├── bin
│   │   ├── entrypoint
│   │   └── user_setup
│   └── Dockerfile
├── cmd
│   └── manager
│       └── main.go
├── deploy
│   ├── operator.yaml
│   ├── role_binding.yaml
│   ├── role.yaml
│   └── service_account.yaml
├── go.mod
├── go.sum
├── pkg
│   ├── apis
│   │   └── apis.go
│   └── controller
│       └── controller.go
├── tools.go
└── version└── version.go

创建CRD

operator-sdk add api --api-version=<api的版本> --kind=<类型名称>

创建CRD后,多出来了文件夹:

$ operator-sdk add api --api-version=test.k8s.realibox.com/v1 --kind=RealiboxINFO[0000] Generating api version test.k8s.realibox.com/v1 for kind Realibox.
INFO[0000] Created pkg/apis/test/group.go
INFO[0002] Created pkg/apis/test/v1/realibox_types.go
INFO[0002] Created pkg/apis/addtoscheme_test_v1.go
INFO[0002] Created pkg/apis/test/v1/register.go
INFO[0002] Created pkg/apis/test/v1/doc.go
INFO[0002] Created deploy/crds/test.k8s.realibox.com_v1_realibox_cr.yaml
INFO[0004] Created deploy/crds/test.k8s.realibox.com_realiboxes_crd.yaml
INFO[0004] Running deepcopy code-generation for Custom Resource group versions: [test:[v1], ]
INFO[0014] Code-generation complete.
INFO[0014] Running CRD generation for Custom Resource group versions: [test:[v1], ]
INFO[0014] Created deploy/crds/test.k8s.realibox.com_realiboxes_crd.yaml
INFO[0014] CRD generation complete.
INFO[0014] API generation complete.      $ tree
...
├── pkg
│   ├── apis
│   │   ├── addtoscheme_test_v1.go
│   │   ├── apis.go
│   │   └── test
│   │       ├── group.go
│   │       └── v1
│   │           ├── doc.go
│   │           ├── realibox_types.go
│   │           ├── register.go
│   │           └── zz_generated.deepcopy.go
│   └── controller
│       └── controller.go
...

test 文件夹下面放得就是 CRD,我们通过pkg/apis/test/v1/*_types.go文件定义我们的CRD结构,主要是SpecStatus

vim pkg/apis/test/v1/realibox_types.go
...
// RealiboxSpec defines the desired state of Realibox
type RealiboxSpec struct {// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file// Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html
}type RealiboxStatus struct {// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file// Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html
}
...

这里我们只改Spec字段,将RealiboxSpec结构体改为:

type RealiboxSpec struct {Domain string `json:"domain,omitempty"`OSS string `json:"oss,omitempty"`Size    string `json:"size,omitempty"`
}

更新CRD文件:

operator-sdk generate k8s
operator-sdk generate crds

CRD本质是一种k8s的资源,因此要使用crd,需要在K8s集群上创建CRD:

kubectl apply -f deploy/crds/test.k8s.realibox.com_realiboxes_crd.yaml

$ kubectl get crd
NAME CREATED AT
http://clusterauthtokens.cluster.cattle.io 2020-08-29T06:41:42Z
http://clusteruserattributes.cluster.cattle.io 2020-08-29T06:41:42Z
http://realiboxes.test.k8s.realibox.com 2020-08-29T07:57:44Z

编写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$ tree
...
├── pkg
│   ├── apis
│   │   ├── addtoscheme_test_v1.go
│   │   ├── apis.go
│   │   └── test
│   │       ├── group.go
│   │       └── v1
│   │           ├── doc.go
│   │           ├── realibox_types.go
│   │           ├── register.go
│   │           └── zz_generated.deepcopy.go
│   └── controller
│       ├── add_realibox.go
│       ├── controller.go
│       └── realibox
│           └── realibox_controller.go
...

参考链接:

https://zhuanlan.zhihu.com/p/243132067

基于operator sdk编写一个k8s自定义资源管理应用相关推荐

  1. java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...

    如今,深度学习模型处于持续的演进中,它们正变得庞大而复杂.研究者们通常通过组合现有的 TensorFlow 或 PyTorch 操作符来发现新的架构.然而,有时候,我们可能需要通过自定义的操作符来实现 ...

  2. 基于数组,编写一个迷你DVD碟片租赁系统。

    功能包括: 新增DVD.删除DVD.修改DVD.查看DVD.借出DVD.归还DVD.退出系统 效果图大概如下图所示: 代码如下: package com.cx1;import java.time.Lo ...

  3. 语言建立一个学生籍贯管理簿_编写一个Excel自定义函数,身份证信息提取如探囊取物...

    观看视频更直观 我们建立信息表时不仅要输入性别.生日和年龄等信息,往往也需要输入身份证号码,而身份证号码中包含有籍贯.性别.生日和年龄等信息,从身份证号码中提取上述信息可以减少输入工作量,提高工作效率 ...

  4. Android开发:基于Android Studio编写一个简单的账本

    目录 前言 用户注册/登录 新建资金记录 查询当前用户的所有资金记录 demo界面展示 后记 前言 最近在写的程序涉及到了用户注册/登录.SQLite数据库操作.因此将编写的代码整理了一下,写了一个简 ...

  5. 【iOS】APP IM聊天框架的设计(基于第三方SDK)

    [iOS]APP IM聊天框架的设计(基于第三方SDK) 前言 在开发社交聊天类型的APP的时候,IM是必不可少的功能,而且很多公司的IM服务都是接的第三方的,很少用自研的,国内的IM厂商也都很成熟, ...

  6. 编写一个程序,用户使用for循环输入5个数字,所有这些数字将存储在一个数组中。之后,程序将添加这五个数字并显示结果。程序必须支持运算符重载的概念。

    Write a program in which users enter 5 numbers using for loop and all these numbers will store in an ...

  7. Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)

    日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...

  8. k8s自定义controller三部曲之三:编写controller代码

    本文是<k8s自定义controller三部曲>的终篇,前面的章节中,我们创建了CRD,再通过自动生成代码的工具将controller所需的informer.client等依赖全部准备好, ...

  9. 基于PYQT编写一个人脸识别软件(2)

    前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件.鉴于使用的是开源库--face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时效 ...

最新文章

  1. Android开源项目发布jCenter
  2. 数据挖掘中分类算法小结
  3. Difference between prop and attr in different version of jquery
  4. C#中的var和dynamic
  5. 2014年各种编程语言的薪资和市场需求
  6. 自定义requestAnimationFrame帧频
  7. JVM 调优实战--JVM字节码
  8. 数据库学习(MySQL):JDBC的简单增删改查实现
  9. adobe stream的最后一行空行_Excel VBA 7.66 如何快速删除数据间空行?手动慢又乱!VBA快又准...
  10. python 3d大数据可视化_Python大数据可视化编程实践-绘制图表
  11. ECCV 2020 Oral | BorderDet : 用边界特征做检测
  12. 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)
  13. TDD LTE 中的HARQ过程
  14. 学python对excel有用吗_程序员必修课:为什么非要用Python做数据分析?Excel不好吗?...
  15. java .jpackage,任何人都知道jpackage到底做什么? - java
  16. icd11中文版精神障碍pdf_精神与行为障碍类别目录(ICD-11)(借鉴资料)
  17. 基于java可视化的会议室管理系统
  18. Infor M3咨询服务调研报告-Infor M3咨询服务生产基地、总部、竞争对手及市场地位
  19. ORACLE EBS/ERP 固定资产总账模块分录
  20. 我的第一个油猴脚本--微博超话自动签到

热门文章

  1. c++计算eigen随笔(10)-数组、矩阵、向量(3)
  2. 【机器学习】全面解析Kmeans聚类算法(Python)
  3. 一文串起从NLP到CV 预训练技术和范式演进
  4. 【Python】扫盲帖:关于在Windows、Linux和Mac上安装设置Python的问题
  5. 【深度学习】array, list, tensor,Dataframe,Series之间互相转换总结
  6. 面向机器学习的特征工程翻译版
  7. 台大林轩田《机器学习基石》系列课程教材的习题更新完毕了
  8. 转发:Datawhale第七期组队学习计划
  9. 搜索推荐系统实战:终极奥秘
  10. 年前最后一波成绩单,请查收!