本文转自Rancher Labs

你是否曾经想过SRE团队是如何有效地成功管理复杂的应用?在Kubernetes生态系统中,Kubernetes Operator可以给你答案。在本文中,我们将研究Operator是什么以及它们如何工作。

Kubernetes Operator这一概念是由CoreOS的工程师于2016年提出的,这是一种原生的方式来构建和驱动Kubernetes集群上的每一个应用,它需要特定领域的知识。它提供了一种一致的方法,通过与Kubernetes API的紧密合作,自动处理所有应用操作过程,而不需要任何人工干预。换句话说,Operator是一种包装、运行和管理Kubernetes应用的方式。

Kubernetes Operator模式遵循Kubernetes的核心原则之一:控制理论(control theory)。在机器人和自动化领域,它是一种持续运行动态系统的机制。它依赖于一种快速调整工作负载需求的能力,进而能够尽可能准确地适应现有资源。其目标是开发一个具有必要逻辑的控制模型,以帮助应用程序或系统保持稳定。在Kubernetes世界中,这部分由controller处理。

在循环中,Controller是个特殊的软件,它可以对集群的变化做出响应,并执行适应动作。第一个Kubernetes controller是一个kube-controller-manager。它被认为是所有Operator的前身,Operator是后来建立的。

什么是Controller Loop?

简单来说,Controller Loop是Controller动作的基础。想象一下,有一个非终止的进程(在Kubernetes中称为和解循环)在不断地发生,如下图所示:

这个过程至少观察一个Kubernetes对象,该对象包含有关所需状态的信息。比如:

  • Deployment

  • Services

  • Secrets

  • Ingress

  • Config Maps

这些对象由JSON或YAML中的manifest组成的配置文件定义。然后controller根据内置逻辑,通过Kubernetes API进行持续调整,模仿所需状态,直到当前状态变成所需状态。

通过这种方式,Kubernetes通过处理不断的更改来处理Cloud Native系统的动态性质。为达到预期状态而执行的修改实例包括:

  • 注意到节点宕机时,要求更换新的节点。

  • 检查是否需要复制pods。

  • 如果需要,创建一个新的负载均衡器。

Kubernetes Operator如何工作?

Operator是一个特定应用程序的controller,它扩展了一个Kubernetes API,替代运维工程师或SRE工程师来创建、配置和管理复杂的应用程序。在Kubernetes官方文档中对此有以下描述:

Operator是Kubernetes的软件拓展,它利用自定义资源来管理应用程序及其组件。Operator遵循Kubernetes的原则,尤其遵循control loop。

到目前为止,你已经了解Operator会利用观察Kubernetes对象的controller。这些controller有点不同,因为它们正在追踪自定义对象,通常称为自定义资源(CR)。CR是Kubernetes API的扩展,它提供了一个可以存储和检索结构化数据的地方——你的应用程序的期望状态。整个操作原理如下图所示:

Operator会持续跟踪与特定类型的自定义资源相关的集群事件。可以跟踪的关于这些自定义资源的事件类型有:

  • Add

  • Update

  • Delete

当Operator接收任何信息时,它将采取行动将Kubernetes集群或外部系统调整到所需的状态,作为其在自定义controller中的和解循环(reconciliation loop)的一部分。

如何添加一个自定义资源

自定义资源通过添加对你的应用有帮助的新型对象来扩展Kubernetes功能。Kubernetes提供了两种向集群添加自定义资源的方法:

通过API Aggregation添加,这是一种高级方法,需要你建立自己的API服务器,但你有更多的控制权限。

通过自定义资源定义(CRD)添加,一种不需要复杂编程知识就可以创建的简单方式,作为Kubernetes API服务器的扩展。

这两种方案满足了不同用户的需求,他们可以在灵活性和易用性之间进行选择。Kubernetes社区对两者进行了比较,将帮助你决定哪种方法适合你,但目前最受欢迎的选项是CRD:

https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#choosing-a-method-for-adding-custom-resources

自定义资源定义(CRD)

自定义资源定义(CRD)的出现已经有一段时间了,第一个主要的API规范是与Kubernetes 1.16.0一起发布的。下面的manifest介绍了一个例子:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: application.stable.example.com
spec:
group: stable.example.com
version: v1
scope: Namespaced
names:
plural: application
singular: applications
kind: Application
shortNames:
- app

这个CRD可以让你创建一个名为“Application”的CR(我们将会在下一个部分使用它)。前两行定义了apiVersion和你要创建的对象种类。

Metadata描述了资源名称,但这里最重要的部分是“spec”字段。它让你可以指定组、版本以及可见性范围——命名空间或集群范围。

然后,你可以用多种格式定义名称,并创建一个方便的缩写,让你执行命令kubectl get app来获取现有的CR。

自定义资源

以上CRD可以让你创建以下自定义资源的manifest。

apiVersion: stable.example.com/v1
kind: Application
metadata:
name: application-config
spec:
image: container-registry-image:v1.0.0
domain: teamx.yoursaas.io
plan: premium

如你所见,在这里包含了运行特定情况下的应用程序所需的所有必要信息。这个自定义资源将被我们的Operator观察到——准确地说,是被Operator的自定义controller观察到。根据controller中的内置逻辑,将模仿所需的状态。它可以为我们的应用程序创建部署、服务和必要的ConfigMaps。运行它,并在特定的域上通过 ingress 暴露它。这只是一个简单的用例,但你可以根据自己的需求对它进行任何设计。

Operator还可以配置在Kubernetes之外的资源。你可以在不离开Kubernetes平台的情况下控制外部路由器的配置或在云中创建数据库。

Kubernetes Operators:案例研究

为了对Kubernetes Operator有一个整体清晰的认识,我们来看看Prometheus Operator,它是最早也是最流行的Operator之一。它简化了Prometheus、Alertmanager以及相关监控组件的部署和配置。

Prometheus Operator的核心功能是监控Kubernetes API服务器上指定对象的变化,并确保当前的Prometheus部署与这些对象相匹配。Operator作用于以下自定义资源定义(CRD):

  • Prometheus:定义了所需Prometheus部署

  • Alertmanager:定义了所需的Alertmanager部署

  • ServiceMonitor:它声明性地指定了应该如何监控Kubernetes服务的组。Operator会根据API服务器中对象的当前状态自动生成Prometheus scrape配置。

  • PodMonitor:声明性地指定了应如何监控一组 pod。Operator 会根据 API 服务器中对象的当前状态自动生成 Prometheus scrape 配置。

  • PrometheusRule:定义了一组所需的 Prometheus 告警和/或记录规则。Operator会生成一个规则文件,可供 Prometheus 实例使用。

Prometheus Operator会自动检测Kubernetes API服务器中对上述任何对象的更改,并确保匹配的部署和配置保持同步。

Kubernetes Operator基础入门的更多相关文章

  1. 零基础入门 Kubernetes,你需要知道这些

    Kubernetes是什么? 大概很多人对此都有疑问,不过在容器领域,Kubernetes却无人不晓. 阿里.字节跳动.腾讯.百度等中国互联网行业巨擘们,近年来都在深耕容器领域,而Kubernetes ...

  2. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  5. .NET正则表达式基础入门

    这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...

  6. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  7. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  8. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  9. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

随机推荐

  1. Linux的VMWare中Centos7文件权限管理chown 和 chmod

    文件管理 chown  chmod 1./根目录下目录功能划分 /boot/  存放系统启动程序菜单及核心   --可以单独使用文件系统     /etc/   存放系统中所有配置文件 /bin/   ...

  2. [NewLife.Net]单机400万长连接压力测试

    目标 对网络库NewLife.Net进行单机百万级长连接测试,并持续收发数据,检测网络库稳定性. [2020年8月1日晚上22点] 先上源码:https://github.com/NewLifeX/N ...

  3. 001_centos7配置网络动态获取IP地址

    笔者今天刚装完centos7的虚拟机,发现无法获取IP地址,经过网上查询资料,发现centos7是默认没有网络配置的,需要手工配置. 而centos7与centos6不同,没有了config命令,所以 ...

  4. 手把手教你使用Python网络爬虫获取招聘信息

    1.前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息.可是招聘信息有一些是错综复杂的.而且不能把全部的信息全部罗列出来,以外卖的58招聘网站来看,资料整理的不清晰. ...

  5. 利用mybatis的Generator的插件生成代码

    1 在resources文件夹下创建generatorConfig.xml文件来做相关配置 <?xml version="1.0" encoding="UTF-8& ...

  6. 线程通讯wait&notify

    目录 相关概念 生产者&消费者模型 相关概念 锁:解决线程间冲突的问题 wait&notify:解决线程间协作的问题 wait和sleep的区别 wait期间对象锁是释放的,而slee ...

  7. Loss 总结:IoU loss总结

    object detection 损失:更加接近人眼的损失 what is IoU 如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度).同时因为loss=0,没有梯度回传,无法 ...

  8. 【API进阶之路】高考要考口语?我用多模态评测API做了一场10w+刷屏活动

    摘要:闲着没事用多模态评测API做了一个测评英语口语的互动小游戏,居然成了一场10万人参与的刷屏级活动. 上一期故事说到,我成为了公司技术委员会副主席,上任后的第一件事是建立了一个云容器化的研发资料库 ...

  9. C#LeetCode刷题之#326-3的幂(Power of Three)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3867 访问. 给定一个整数,写一个函数来判断它是否是 3 的幂次 ...

  10. three.js 制作机房(上)

    three.js使用的人太少了,一个博文就几百个人看,之前发js基础哪怕是d3都会有几千的阅读量,看看以后考虑说一说d3了,哈哈.吐槽完毕回归正题.前几天郭先生看到网上有人开发了3D机房,正愁博客没什 ...