简介

你可能听过Kubernetes中Operator的概念,Operator可以帮助我们扩展Kubernetes功能,包括管理任何有状态应用程序。我们看到了它被用于有状态基础设施应用程序的许多可能性,包括版本升级、节点恢复、调整集群大小等。

本文我们将揭开Operator的神秘面纱,为如何构建可应用于实际的自定义Operator打下坚实的基础。

operator到底是什么?

为了说明operator到底是什么,让我们回到Kubernetes的架构上来,Kubernetes本质上是理想的状态管理器。你为你的应用程序提供了所需的状态(实例数,磁盘空间,使用的镜像等),并且如果任何事情失控,它都会尝试保持该状态。Kubernetes在Master节点上使用控制面,控制面包含许多控制器,这些控制器的工作是按照下面的方式与期望的状态进行协调(Reconcile):

  1. 监视现有的K8S对象(pods,deployments等)去确定他们的状态
  2. 比较该对象和它的K8s yaml配置
  3. 如果状态和配置不同,控制器将尝试进行修复(remedy)

进行协调的一个常见的场景是

一个pod被定义了三个副本,当一个挂了,K8s控制器的监视(watching)下,它意识到应该运行三个pod,而不是两个,然后,它将创建一个新的pod实例。

下图简单展示了控制器在K8s架构中的作用:

  1. kubectl CLI发送一个对象配置(Pod,Deployment等)到Master Node的API Server以便在集群运行
  2. Master Node将调度(schedule)对象去运行
  3. 一旦运行,一个控制器将持续件事这个对象并根据它的配置不断协调(Reconcile)

通过这种方式,Kubernetes方便的代替了大量手动工作,以维护运行时的无状态应用。然而,它仅限于K8S预定义的对象类型(Pod,Deployment,Namespace,Service,DaemonSet等),这些对象类型中的每一个都具有预定的行为和方式,如果它们和配置发生了偏离,他们就会与配置相协调(Reconcile),以达到所期望的配置。

现在,如果您的应用程序有更多复杂性,那么你需要自定义Operator以将达到期望的运行状态。

我们考虑一个有状态的应用程序,有一个运行在多个节点上的数据库应用程序。如果大多数节点出现故障,则需要按照特定步骤从指定快照重新加载数据库。使用Kubernetes中现有的对象类型和控制器,这是不可能实现的。再考虑节点扩容,升级新版本,或为我们的有状态应用程序进行灾难恢复。这些类型的操作通常需要非常具体的步骤,并且通常需要手动干预。

Kubernetes Operators允许你定义一个自定义控制器来watch你的应用程序并根据其状态执行自定义任务,从而扩展了Kubernetes(这是使我们上述的有状态应用程序自动维护的完美选择)。

你想要watch的应用程序在Kubernetes中被定义为一个新对象,一个CR(Custom Resource),它有自己的yaml spec和被API Server理解的对象类型(kind)。这样,你可以在自定义spec中定义任何需要关注的特定标准,并在实例与期望不匹配时进行协调。虽然Operator Controller主要使用自定义组件,但是它的spec和本地Kubernetes的控制器非常相似。

Operator 运行自定义控制器以协调spec。虽然API server能感知到自定义控制器,但是Operator是独立运行的,可以在集群内部或外部运行。

由于Operator是有状态应用程序的强大工具,因此我们看到CoreOS和其他贡献Etcd,Prometheus等提供了许多Operator,而这些是一个伟大的起点,但是Operator的价值实际上取决于你对它的处理方式:针对故障的具体做法是什么?以及Operator的功能如何与手动干预一起使用。

尝试构建Operator

  1. 定义我们要watch的应用程序的自定义资源CR spec以及该CR的API
  2. 编写一个Custom Controller来监视我们的应用程序
  3. 新控制器中的自定义代码,让我们知道如何使我们的CR与spec一致。
  4. 管理自定义控制器中的Operator
  5. 为了Operator和CR的一个Deployment

以上这些都可以通过手动编写go代码和spec来实现,同时我们可以使用kubebuild、operator-sdk来生成骨架代码,让我们更方便的去关注核心代码的编写。

参考文章:

https://www.linux.com/topic/cloud/demystifying-kubernetes-operators-operator-sdk-part-1/

谈谈 Kubernetes Operator的更多相关文章

  1. Kubernetes Operator基础入门

    本文转自Rancher Labs 你是否曾经想过SRE团队是如何有效地成功管理复杂的应用?在Kubernetes生态系统中,Kubernetes Operator可以给你答案.在本文中,我们将研究Op ...

  2. 当我们聊kubernetes operator时,我们在聊些什么

    不聊什么 在开始聊operator前,先说说这篇文章里我们不聊什么.我们这里不聊operator的具体实现,不聊operator的由来历史,不聊operator的hello world.如果想了解这些 ...

  3. Kubernetes Operator: Operator

    Operator 就可以看成是 CRD 和 Controller 的一种组合特例,Operator 是一种思想,它结合了特定领域知识并通过 CRD 机制扩展了 Kubernetes API 资源,使用 ...

  4. [Kubernetes]谈谈Kubernetes的本质

    当下k8s算是比较火的一个内容,那么它到底是什么呢,它为什么会这么火呢,它解决的是什么问题呢.这篇文章就尝试着来讲讲,Kubernetes的本质. 当我们谈Kubernetes的时候,总是会想起来Do ...

  5. Kubernetes Operator: CRD

    Custom Resource Define 简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式.CRD 资源可以动态注册到集群中,注册完毕后,用户可以 ...

  6. 在Kubernetes上运行有状态应用:从StatefulSet到Operator

    一开始Kubernetes只是被设计用来运行无状态应用,直到在1.5版本中才添加了StatefulSet控制器用于支持有状态应用,但它直到1.9版本才正式可用.本文将介绍有状态和无状态应用,一个通过K ...

  7. 亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争

    如果我问你,如何把一个 etcd 集群部署在 Google Cloud 或者阿里云上,你一定会不假思索的给出答案:当然是用 etcd Operator! 实际上,几乎在一夜之间,Kubernetes ...

  8. Spark in action on Kubernetes - Spark Operator的原理解析

    前言 在上篇文章中,向大家介绍了如何使用Spark Operator在kubernetes集群上面提交一个计算作业.今天我们会继续使用上篇文章中搭建的Playground进行调试与解析,帮助大家更深入 ...

  9. 12 . Kubernetes之Statefulset 和 Operator

    Statefulset简介 k8s权威指南这样介绍的 "在Kubernetes系统中,Pod的管理对象RC.Deployment.DaemonSet和Job都面向无状态的服务.但现实中有很多 ...

随机推荐

  1. Scala函数高级篇

    一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...

  2. JVM性能调优与实战基础理论篇-下

    JVM内存管理 JVM内存分配与回收策略 对象优先在Eden分配,如果Eden内存空间不足,就会发生Minor GC.虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在 ...

  3. JDBC加强

    一.使用PreparedStatement预编译语句防止SQL注入 什么是SQL注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行 ...

  4. 正则表达式以及re模块的使用

    内容概要 正则表达式简介 字符组 特殊符号 量词 贪婪匹配与非贪婪匹配 取消转义 正则表达式简介 '''正则表达式是一门语言,如果想在python中使用,需要导入re模块''' # 什么是正则表达式? ...

  5. Solution -「六省联考 2017」「洛谷 P3750」分手是祝愿

    \(\mathcal{Description}\)   Link.   有 \(n\) 盏编号为 \(1\sim n\),已知初始状态的灯,每次操作选取 \(x\in[1,n]\),使得所有编号为 \ ...

  6. 关于NSMutableAttributedString进行富文本 UILabel 的制作

    //1.初始化与其他无异 NSMutableAttributedString *AttributedStr2 = [[NSMutableAttributedString alloc]initWithS ...

  7. [VM trunk ports]opensatck VM 单网卡,多VLAN配置

    描述 需求产生场景 1.用户在虚机运行 K8S ,采用 VLAN 模式组网,要求 VM 端口要支持 trunk,支持多个 VLAN 网络数据在同一虚拟网卡上传输. 2.需要动态的增删虚拟机上的网络接口 ...

  8. 手把手教你如何通过CC2531抓取Zigbee包,并解析加密Zigbee包

    前言 好久不见啊,大伙假期过得咋样? 最近我在研究 Zigbee ,使用了EFR32(购买链接)的开发板,之前也研究过一点,水了几篇文章,但是没有深了解和使用.最近 arduino 玩腻了,我开始回过 ...

  9. stegsolve.jar压缩包打开和使用方法

    1.stegsolve.jar下载 下载地址:http://www.caesum.com/handbook/Stegsolve.jar 2.stegsolve.jar打开方法 (1)需要下载java并 ...

  10. 从数据源支持、支持方式等角度深入了解Smartbi与Tableau

    对数据分析来讲,数据源支持是基本功.让数据分析工具与数据保持一个通道,建立会话.用数据分析应用服务器与我们需要分析的业务数据进行连接,拿到需要的数据进行分析.Smartbi.Tableau系统给我们提 ...