在k8s中有许多编排工具,目前比较热门的是包管理工具Helm,如果说docker是奠定的单实例的标准化交付,那么Helm则是集群化多实例、多资源的标准化交付,但是helm 只能实现简单的编排能力,一些特定场合的应用编排并不能依靠helm实现,比如当一个被依赖服务挂掉感知到之后,如何做一个特定的操作(重启各个依赖服务,操作数据库,发送特定的请求等等),再比如,自动初始化数据库,自动解决服务依赖 实现一键化部署, 再比如节点自愈。这些功能并不能使用helm去实现。

所以helm只是实现了自动化,以及标准化。但仅仅是这些并不能满足我们现有的业务架构。

operator则在实现自动化和标准化的同时实现了智能化,operator对于资源的管理则不仅是创建和交付。由于其可以通过watch的方式获取相关资源的变化事件,因此可以实现高可用、可扩展、故障恢复等运维操作。因此operator对于生命周期的管理不仅包括创建,故障恢复,高可用,升级,扩容缩容,异常处理,以及最终的清理等等。

其主要的工作流程是根据当前的状态,进行智能分析判断,并最终进行创建、恢复、升级等操作。而位于容器中的脚本,因为缺乏很多全局的信息,仅靠自身是无法无法达实现这些全部的功能的。而处于第三方视角的operator,则可以解决这个问题。他可以通过侧面的观察,获取所有的资源的状态和信息,并且跟预想/声明的状态进行比较。通过预置的分析流程进行判断,从而进行相应的操作,并最终达到声明状态的一个目的。这样所有的运维逻辑就从镜像中抽取出来,集中到operator里去。层次和逻辑也就更加清楚,容易维护,也更容易交付和传承。

operator可以说是另外一种controller。目前的controller manager集合的主要是基础的、通用的资源概念,比如rs/deployment,而对于特定的应用或者服务(如etcdcluster,都可以认为是一种资源),则放权给了第三方,也就是CRD。用户可以通过自定义的资源描述,以及自研的controller/operator进行接入。因此controller和operator的关系有点类似于标准库和第三方库的关系。

一般来说,对于不同的应用一般来说需要不同的operator进行处理。这时我们再来想下,以replicaset controller为例。rs的主要功能是保持副本数。当有pod因某种原因挂掉/删除,对于无状态的应用来说,恢复的方式就是再增加对应的pod数量。那么从这个角度来说,对于无状态的应用来说,rs controller其实就是无状态应用的operator。

使用kubebuilde编写自己的operater:

主要结构:

pkg/apis - 包含定义的 API 和自定义资源(CRD)的目录树,这些文件允许 sdk 为 CRD 生成代码并注册对应的类型,以便正确解码自定义资源对象。该目录下存在type文件,通过该文件下 会有一个类似于***Spec的struct 通过这个自定义字段

pkg/controller - 用于编写所有的操作业务逻辑的地方,该目录下的*_controller的文件 ,通过该文件下的Reconcile方法实现主要的operater逻辑

controller把轮训与事件监听都封装在这一个接口里了.你不需要关心怎么事件监听的.所有逻辑控制需要我们去更改的地方也不是很多,核心的就是Reconcile方法,该方法就是去不断的 watch 资源的状态,然后根据状态的不同去实现各种操作逻辑

operater要点:

CRD级联删除

在很多场景 当我们删除一个crd资源时,需要删除整个crd所产生的所有资源例如我们在创建deployment资源的时候,刚好这个deployment的功能有可能需要访问kubernetes的api接口 这个时候需要创建serviceaccount role rolebinding等相关资源,如果只是创建的话我们可以直接在Reconcile 编写相关资源直接创建,但删除的时候如果想在删除crd的同时删除所有该cr产生的资源 这个时候需要引入OwnerReferences,默认情况下 只有sts depolyment pod这些资源在使用operater创建的时候才会带有OwnerReferences,并且需要指定OwnerReferences的值为该crd的name

带有OwnerReferences 如图:

如图在编写该mysql资源的时候 我们需要在ObjectMeta里指定:

OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(m.GetObjectMeta(), m.GroupVersionKind()),},

订阅删除前的事件

如果在etcd中已经删除了资源后operator才watch到该事件,此时由于资源已经不复存在,很多逻辑操作无法得到足够的参数来执行处理

因此,因此我们需要的是在执行最终删除之前就能够watch到该事件,并执行一些销毁资源的操作。好在k8s api-server已经为我们提供了finalizer机制。

如果某个资源的finalizers不为空,当执行删除之前,会被operator watch到操作。此时,其meta.DeletionTimestamp不为null,对应operator应该在该次事件的handler中删除掉其注册上来的finalizer对象;并执行其他业务逻辑handler

finalizer比较典型的例子: 在删除namespace的时候 如果该namesapce下的还存在资源 这个时候执行delete操作的时候 是无法删除该namespace的,通过查看namespace的相关配置 我们也可以看到它是有带finalizer标签的

处理事件风暴

k8s operator 中reconcile方法 的作用就是不断的watch,当资源变化时 就会触发reconcile方法,理论上有多少次的变化就会执行多少次的reconcile方法,如果没有做好基于状态来终结循环的逻辑,那么就形成了死循环,产生事件风暴

例如服务依赖于mysql 在mysql没有启动完成之前 operater需要不断的读取myslq的状态,只有当mysql 启动完成之后 才能启动服务。

在kubebuilder中也为我们提供了解决方案:

在判断状态逻辑的时候 如果状态一直没有走到最终状态 我们在watch到该事件的时候 可以return reconcile.Result{RequeueAfter: SyncBuildStatusInterval} 这样就不会不会执行到下面的状态更新操作,而是直接返回,operator会将该资源变动的event重新放入队列,然后等到RequeueAfter参数指定的时间间隔之后重新取出来再调用reconcile处理。这样的优点是,到达的效果一样,但不会频繁的写etcd,从而保障k8s集群不受影响。

编写自己的kubernetes operater相关推荐

  1. C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

    关于 Neting 刚开始的时候是打算使用微软官方的 Yarp 库,实现一个 API 网关.目前写完了查看 Kubernetes Service 信息.创建 Route 和 Cluster 和绑定 K ...

  2. 微软推出Visual Studio Kubernetes工具包预览版

    微软表示,利用 Visual Studio Kubernetes 这个工具,使用者可以直接在该环境中,构建 Kubernetes 容器应用程序项目,或者让现有的 .NET 网页应用程序也兼容 Kube ...

  3. Kubernetes 是如何调度的?

    作者 | 阿文,责编 | 郭芮 头图 | CSDN 下载自东方IC 出品 | CSDN(ID:CSDNnews) 自互联网出现以来 ,云计算的概念已经提出了有 50 年.从1957 年,John Mc ...

  4. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验

    作为Rancher 2.0的重要组件,Rancher Kubernetes Engine(RKE)现已正式全面发布!这是Rancher Labs推出的新的开源项目,一个极致简单易用.闪电般快速.支持一 ...

  5. Docker和Kubernetes应用程序打包:Metaparticle、Pulumi与Ballerina比较

    \ 本文要点 \\ 随着微服务架构的出现,软件行业正向着云原生应用程序开发和部署发展.\\t Docker和Kubernetes是现代化云原生部署自动化的关键要素.\\t 目前常见的做法是借助容器创建 ...

  6. Kubernetes学习总结(12)—— 学习 kubernetes 的10个技巧或建议

    一.学 GO 语言 Kubernetes是基于 GO 编写的,所有的组件都是基于 GO 编写的,kubernetes甚至使用GO编写了一个客户端.学习使用 GO 语言编写的 Kubernetes 客户 ...

  7. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验 1

    2019独角兽企业重金招聘Python工程师标准>>> 作为Rancher 2.0的重要组件,Rancher Kubernetes Engine(RKE)现已正式全面发布!这是Ran ...

  8. kubernetes 简介:调度器和调度算法((Affinity/Anti-Affinity, Taints and Tolerations, 自定义调度器 )

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 简介 scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: ...

  9. CentOS 使用二进制部署 Kubernetes 1.13集群

    CentOS 使用二进制部署 Kubernetes 1.13集群 一.概述 kubernetes 1.13 已发布,这是 2018 年年内第四次也是最后一次发布新版本.Kubernetes 1.13 ...

最新文章

  1. 信息安全 数据赛 铁人三项_2018信息安全铁人三项数据赛题解
  2. FreeBSD基金会添加新成员,梁莉成为第一位来自微软和中国的基金会董事
  3. java final 变量 回收_java入门教程-Java中final,finally,finalize三个关键字的区别
  4. python 任务计时器 apscheduler.schedulers
  5. 【AutoML】当前有哪些可用的AutoML平台?
  6. HUE配置文件hue.ini 的zookeeper模块详解(图文详解)(分HA集群)
  7. 2019ICPC(沈阳) - Flowers(二分)
  8. php 获取相反值,php – 以相反的顺序从单向数组中获取数据
  9. HTML+CSS+JS实现 ❤️H5图片列表滑动特效❤️
  10. 以数据库思维理解区块链
  11. Android开发之 Android 的基本组件的概述
  12. 没事学学docker(三):配置阿里云镜像加速以及解决docker起不来的问题
  13. PHP使用缓存生成静态页面
  14. sqlyog与mysql编码语法_如何解决sqlyog连接的数据库乱码的问题
  15. Elasticsearch 集成 SpringBoot并进行CRUD操作
  16. 教你如何用python把玩守望先锋新英雄
  17. android备份基带,备份过SHSH,保留基带,直刷5.0.1系统完美详细教程
  18. Java实现CCF/CSP 201312-2 ISBN编号(零分!!!
  19. Python爬虫之链家二手房数据爬取
  20. Silverlight 2.5D RPG游戏技巧与特效处理:(十四)体感系统

热门文章

  1. SpringBoot+Vue前后端分离的Java快速开发框架 工作流开发框架
  2. 三维重建工具——pclpy使用教程
  3. 毕业设计- 基于Android的校园活动发布平台(带流程图)
  4. 【JS图形学基础】平面向量的计算和运用实例
  5. RAID0 RAID1 RAID5 RAID10 RAID50
  6. 华为devcloud使用git代码托管
  7. d盘不能扩展卷_一篇看懂!Linux磁盘的管理(分区、格式化、挂载),LVM逻辑卷,RAID磁盘阵列...
  8. 列表table,将合计行进行单元格合并,element-ui
  9. 苹果正在三星电视上安装iTunes;科技部鼓励民营企业参与国家科技 雷锋早报...
  10. 2012年国产空间信息软件测评结果