简介

你可能听过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. Java中==、equals、hashCode的区别

    "=="是运算符,用来比较两个值.两个对象的内存地址是否相等: "equals"是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过& ...

  2. Redis 竟然能用 List 实现消息队列

    分布式系统中必备的一个中间件就是消息队列,通过消息队列我们能对服务间进行异步解耦.流量消峰.实现最终一致性. 目前市面上已经有 RabbitMQ.RochetMQ.ActiveMQ.Kafka等,有人 ...

  3. Kinect v2 + WPF获取RGB与Depth图像

    date: 2017-09-04 14:51:07 Kinect V2的Depth传感器采用的是「Time of Flight(TOF)」的方式, 通过从投射的红外线反射后返回的时间来取得Depth信 ...

  4. 手把手带你安装最小化suse 12 linux

    当然. 你需要现有一个vmware,还要有一个suse的镜像,suse镜像可以直接去官网获取,只需要注册一个suse的账号就可以了,官网下载会有点慢,可以使用迅雷下载 F2 可以设置安装界面的语言,可 ...

  5. TCP/IP详解 读书笔记:TCP:传输控制协议

    TCP的服务 TCP为应用层提供一种面向连接的.可靠的字节流服务. 一个TCP连接中,仅有两方进行彼此通信,所以广播和多播不能用于TCP. TCP通过以下方式提供可靠性: 应用数据被切割为TCP认为最 ...

  6. web开发 小方法1-禁止横向滚动

    最近学了学做了个公司的网站  总结了一些小方法 比如取消横向滚动条并禁止的横向滚动 这样就可以吧超出的切掉让网页更和谐 在body 标签 body{ text-align: center; overf ...

  7. MySQL高级优化

    MySQL高级 1.索引是什么? (1)索引是排好序可以快速查找的数据结构 (2)方便快速查找,索引实际上也是一张表所以也是要占内存的 2.索引存在哪里? (1)InnoDB引擎 ①索引是和数据存放在 ...

  8. Acme-https证书申请

    Linux下使用acme.sh 配置https 免费证书 简单来说acme.sh 实现了 acme 协议, 可以从 let's encrypt 生成免费的证书. acme.sh 有以下特点: 一个纯粹 ...

  9. [题解]UVA10700 Camel trading

    链接:http://vjudge.net/problem/viewProblem.action?id=21358 描述:给出一个算式,算式里面有加法和乘法,可以任意添加括号从而改变计算顺序.求可能得到 ...

  10. 一文告诉你dashboard究竟有多重要!

    dashboard,我们一看这个词可能会觉得困惑,这是什么意思?看起来很高大上的样子. 实际上它的中文含义即是我们BI界老生常谈的话题--仪表盘.dashboard是商业智能仪表盘的简称,它是一般商业 ...