构建 Kubernetes Operator 的原则是什么?

news2024/10/5 15:31:08

Kubernetes(简称K8s)上数据服务的自动化越来越受欢迎。在K8s上运行有状态的工作负载意味着使用Operator。然而,它发展演化到今天已经变得非常复杂,像Operator这样的应用模式和扩展方式对于开发者与运维者而言愈发受到欢迎。
在这里插入图片描述
但工程师们经常对编写K8s Operator的复杂性感到吃力,这会影响到最终用户。据《2021年K8s数据报告》指出,K8s Operator的质量阻碍了公司进一步扩大K8s占有率。

Anynines首席执行官Julian Fischer已经构建自动化工具近十年了,他非常了解在处理在云原生平台和K8s等分布式基础设施上做状态管理的复杂性。

Julian首先分享了在构建 Operator时应该遵循的方法,他称之为运营模式,分为四个部分:

第1级:SysOp或DB要做什么

第2级:容器化,YAML + kubectl

第3级:编写 Operator

第4级: Operator 生命周期管理

通过他的分享,可以了解数据服务自动化中的常见陷阱以及如何避免,进而从技术和方法学角度编写更好的K8s Operator。

数据服务自动化

它在数据服务自动化的一般主题和K8s之间有点跳跃。一般来说,如果你谈论数据服务自动化,你必须做的第一件事就是明确范围,即你所说的数据服务自动化真正指什么。对于我们来说,任何时候都有一个使命,那就是将各种数据服务的整个生命周期完全自动化,以便在跨基础设施的云原生平台上大规模运行。
在这里插入图片描述
这里不是一些营销噱头,它是如何对数据服务自动化进行范围分析的一个例子。例如,为了使多个数据服务自动化,你希望看到某些共享效果,比如你可以将Operatar SDK以外的数据服务纳入自动化框架。因此,任务的背景会产生很大影响。例如,一个简单的K8s集群,有一个小单位用来运行他们的应用程序。假设使用Postgres数据库,Postgres一直是我最喜欢的例子。大家都知道,一个K8s集群对应一个Operator一个服务实例,应用程序将连接到那个数据库。这与我们今天想在这里谈论的故事不同。假设他们按需配置服务实例,Postgres数据库被表示为有状态集。Operator允许你创建多个实例。事情就会变得复杂,因为你有更多的数据服务实例,你必须处理好它。如果你随后引入更多数据服务,例如,将RabbitMQ、MongoDB或任何其他数据库添加到Operator的集合中,挑战将变得更加大。

现在我们协作的组织中,有时有数百或数千名员工,有数千名甚至一万名开发人员,令人难以置信的是,他们拥有数量庞大的工程师,也同时拥有许多K8s集群。我们认为,数以十计、数以百计的K8s集群对我们的经验是个考验。例如,在基于虚拟机的数据服务自动化中,它们通常有上千台虚拟机运行上千个服务实例,这取决于它们如何组建集群。你可以假设有一个服务实例对应三个pod,恰好正在运行这样一个小集群实例。在现有这个规模上,自动化的需求经常变更,对规模的影响很大。

如果你解决了制作“香肠”和分发“香肠”等简单任务,你可以想象,如果你要服务更大规模的用户,堆栈技术解决方案要进行调整。数据服务自动化也几乎一样。因此,如果我们考虑那些大型应用场景,拥有很多这样的服务实例,每个数据服务实例对某些用户都很重要。因此,自动化需要符合一定的标准。如果该标准没有达到自动化水平,那么自动化将用不起来,组织和技术的采用就不会发生。

使用K8s的数据服务

那么如何使用K8s的数据服务?首先,你如何实现一个Operator,如我认为社区应该知道的那样?最简单的方法是使用K8s、CRD和自定义资源定义,传输给K8s新的数据结构。例如,在描述你的Postgres实例时,要创建一个复数的Postgres实例,因为我们是按需配置,有一个控制器负责管理实例。该控制器将按你指定的对象的规范,将其转换为可运行的程序。因此,基本上,Operator所做的是将具有Postgres 12.2版本的主对象(如Postgres实例)的规范转换为辅助资源。据我所知,Operator SDK是构建CRD、生成CRD并为控制器提供模板代码的主流工具。这是讨论K8s相关的数据服务自动化时,我们想到了这两件事。同时,还有KUDO。
在这里插入图片描述
在开发阶段,如果你开发了一个Operator,挑战之一是你想如何系统地处理这项工作。有一个简单的模型,我们称之为操作模型,分为四个级别,这有助于你处理数据服务自动化,这是第一次提出。

给一点建设性的意见,要把你的注意力放在任务上。例如,我们建议在第一级实现Postgres的自动化。你需要掌握的第一件事是助理或者DBA要做什么。特别是,这对应用程序开发人员有什么影响?他们到底想要什么?

例如,应用程序开发人员对Postgres的平均期望是什么?他们需要自动故障转移的集群实例吗?在这种情况下,他们更喜欢同步复制还是异步复制?你想使用哪种故障转移和集群管理器,还是使用首选仓库管理器,或者更确切地说,使用Prometheus(普罗米修斯)?

而且,基本上你要搞清楚如何配置文件,对Postgres完成基本设置,这是操作模型一级。只需假设你有一台虚拟机,你可以做任何你想做的事情,安装软件包,配置数据库等等。因此,一旦你这样做了,你知道配置文件应该是什么样子,所有的这些都是Operator可以做到的。你可以考虑容器化,它可以选择现有的容器映像,并将其组装到有状态集服务的K8s规范中,并创建自有的模板,这是操作模型二级中的YAML部分。因此,在操作模型二级的最终操作中,无论你是选择了现有的容器映像还是自己创建了它们,你都有K8s规范,可以与kubectl一起使用,以手动创建自己的服务实例。一旦你这样做了,你基本上可以创建你的Postgres实例,比如说,用三个副本和同步流复制,假定你已经知道如何手动做到这一点,然后你可以通过思考问题,如何编写gde,创建特定的有状态设置的无头服务来处理特定的保密数据,你可以更容易地实现这样的一个Operator。

现在,假设我们提醒自己,我们正在谈论的环境可能包含1000多个数据服务实例,跨越许多K8s集群的多个数据服务。在这种情况下,我们还需要接受Operator生命周期管理本身是我们工具链的重要组成部分。因此,我们还需要自动化来管理Operator本身的生命周期。

无论是Operator生命周期管理器,还是其他技术在这一点上都无关紧要,最重要的是你需要知道,这是你整体数据服务自动化挑战的一部分。现在,如果你想到K8s Operator,并且提到自定义资源定义,像这样的YAML结构描述了一种可以传递给K8s API的新数据类型,然后K8s API将向你提供节点,并持久地将规范存储在etcd中。这里格式不是很好。但你可以在这里看到特定资源定义的自定义资源会是什么样子,我们教K8s如何创建这样的对象。

然而,仅凭你的CRD不会有任何效果,因为你需要控制器,控制器通过代码实现事件观测,例如创建了一个对象。然后,控制器可以确认这个特定的服务实例是否已经存在,确认辅助资源,需要一个服务密钥访问,以及需要创建的有状态集。因此,正如我之前所说,K8s控制器基本上将主要资源转换为次要资源的组合。在我们的示例中,到目前为止,这些资源一直是K8s的内部资源,但实际情况不一定如此。我们稍后再讨论。

如果你还想在那里开始编写Operator,Operator SDK会就Operator的成熟度级别提出建议,Operator分为五个不同的等级。我真的不确定你们是否都了解这些等级的区别。但如果从现在开始,这绝对是一个好的开端。学会正确提问,这些问题也在文档中。如果你真的构建Operator,你需要用到一些核心功能,例如在没有备份的情况下更新补丁,以及备份和恢复功能。通常这些是必备的,但用户可能会拒绝解决方案,或者他们没有解决方案。但你知道,你早晚要这么做,因此这会对你有所帮助。所以请记住,常见的陷阱,由分布式系统的编程问题引起的Bug,会有很多个,就看我们排除多少。
在这里插入图片描述
例如企业使用Git引发的问题。根据我的经验,总的来说,数据服务自动化最有可能的最大问题是,人们低估了实现数据服务自动化的复杂性和所需努力,表现形式包括基本生命周期操作的覆盖范围不足,以及鲁棒性和可观察性等质量特性较低。基于这点来说,了解使用的门槛是有必要的,你需要知道,自动化要做什么才能被目标受众接受。虽然这在很大程度上取决于目标受众本身,但现在我可以分享一些我学到的对我们大客户很重要的事情,但说不完,因为现在时间不够多了,这有点耗时。

接受配置更新很重要,因为应用程序开发人员能够通过自动化配置来使用数据库和应用程序。如果应用程序有特殊要求,你需要稍微调整一下数据库配置。这是真实的需求,要尽可能地利用资源。因此,你需要采访目标受众,并了解这些配置选项是否已经在自动化文档中。你需要善于根据特定需求调整自动化。如果你知道组织内有更多的开发人员,所有的云原生需求都在那里,比如,友好的可观测性,透明使用基础设施。有了K8s,在某种程度上你已经获得了。但在备份的上下文中,当你需要将备份存储在某个地方时,你通常必须将备份写入对象存储。这就是人们对S3 API的存在做出假设的地方,例如,你应该选择一些隐藏底层对象存储的抽象库。

服务实例的水平可扩展性

例如,你需要一个服务实例,你可以考虑单个Postgres用一个pod,也可以考虑集群Postgres使用异步流复制。一旦你想进行水平扩展,将副本从一个扩展到三个,就会在自动化中引入许多复杂性。因为Postgres不是那么简单做自动化服务,这让人喜欢用它举例。因此,你需要添加一个集群管理器来进行故障检测,你需要有一个主节点选举和主节点晋升逻辑来帮助你实现。

此外,如果你恰好有多个可用区域的数据中心,可以分发你的pod来使用它们,这样不会出现单个K8s节点。只要是可用区域,并建立了K8s集群,那么几乎会100%这样使用。一般来说,在整个生命周期中会重建状态集很多次,比如计划、切换、升级,或者垂直扩展使pod变大,数据被合并。我们将再次讨论备份和恢复的问题,这显然非常重要,因为应用程序开发人员无需等待平台运营商的手动干预即可恢复应用程序,这通常是最后的措施。

因此,这一切都与按需自助服务有关,到目前为止,应用程序开发人员可以自助服务,创建服务实例,然后修改它们,重新配置它们,如果服务实例碰巧出现异常,或者数据被意外删除,他们需要按应用程序的要求恢复数据,防止潜在数据丢失。

有一个需求不太明显,有时要提供最新的数据服务版本。假设Postgres的最新版本是不错的,活跃用户自然会喜欢。但对于某个组织来说,有些应用程序可能处于长期维护状态,它们不会立即使用新版本,因此,应用程序开发人员需要能够选择数据服务版本,可以使用版本号管理Operator,以支持所有自动化版本的启用和退出。这是你必须为自动化制定的政策。如果你提供太多的版本,这也会给团队提供很多的支持。但是,文档也可能会减少对你的支持。

安全性也很重要,通常要求具备加密存储、传输加密。例如,你希望被加密的磁盘上的数据没有被读取使用,从客户端发送到数据服务实例的数据也是如此,有状态集中的端口都应该加密。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【勝讯云 Finops Crane 集训营】基于 FinOps 的云资源分析与成本优化平台实操及说明

介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目,遵循 FinOps 标准,已经获得FinOps基金会授予的全球首个认证降本增效开源方案。它为使用 Kubernetes 集群的企业提供了一种简单、可靠且强大的自动化部署工具。 Crane 的设计初衷…

来这公司一年碰到的问题比我过去10年都多

无意间发现我们 Kafka 管理平台的服务的 open files 和 CPU 监控异常,如下图,有一台机器 CPU 和 opfen files 指标持续在高位,尤其是 open files 达到了4w。 原因分析 第一反应是这个服务请求很高?但是这个服务是一个管理服务不应…

云安全的挑战与发展:云原生安全将是未来趋势吗?

引言 随着企业数字化转型的推进和云计算的普及,云安全已经成为了当下IT行业的热点话题之一。尽管云计算已经被广泛应用,但在云安全方面仍存在一些挑战和问题。本文将探讨当前云安全面临的挑战,并分析云原生安全在未来的发展趋势。 第一章 云…

Opera One将取代 Opera 浏览器

导读Opera 日前推出了一款名为 Opera One 的新浏览器,该浏览器正处于开发者预览阶段,用户可以访问官网下载试用(链接)。这个浏览器的终极目标是在今年晚些时候取代其当家的 Opera 浏览器。 Opera One 遵循 "模块化设计理念&q…

Netty(2)

Netty 文章目录 Netty4 Netty 模型4.1 Netty 模型介绍4.2 Netty demo4.3 Netty 异步模型4.3.1 基本介绍4.3.2 异步模型4.3.3 Future-Listener 机制4.4 Netty 任务队列 task 4 Netty 模型 4.1 Netty 模型介绍 Netty 线程模式:Netty 主要基于主从 Reactor 多线程模型…

2023年开源社项目委员会介绍

2023 项目委员会成员 项目委员会主席:石垚 (tech-querykaiyuanshe.org) 项目委员会秘书 :丁文昊 (dingwenhaokaiyuanshe.org) 开源社官网项目组: 组长:石垚 (tech-queryk…

2023 ATTCK v13版本更新指南

一、什么是ATT&CK ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。 二、ATT&CK 发展历史 1996年&#xff1…

【UE】高级载具插件-04-坦克瞄准开火

在上一篇文章中(【UE】高级载具插件-03-子弹击中目标时使目标破碎),我们实现了坦克开火的功能。本篇博客介绍的是实现坦克瞄准开火的功能。 效果 步骤 1. 首先将学习FPS游戏时用到的动态准心控件蓝图资源导入 2. 在项目设置中增加两个操作…

穿越有序链表的迷宫:探索力扣“合并两个有序链表”的解题思路

本篇博客计划讲解力扣“21. 合并两个有序链表”这道题,这是题目链接。 老规矩,先来审下题干。 输出示例如下: 提示: 这道题目相当经典,同时是校招的常客。大家先思考一下,再来听我讲解。 思路&…

7.1 幂法和反幂法

学习目标: 如果我要学习幂法及反幂法,我会遵循以下步骤: 1. 学习理论知识:首先我会找到可靠的教材或者网上资源,学习幂法及反幂法的理论知识,包括其原理、公式、算法流程、收敛性等方面的内容。这些知识可…

Cadence Allegro BGA类器件扇孔操作教程

对于BGA扇孔,同样过孔不宜打孔在焊盘上,推荐打孔在两个焊盘的中间位置。很多工程师为了出线方便,随意挪动BGA里面过孔的位置,甚至打在焊盘上面,如图1所示,从而造成BGA区域过孔不规则,易造成后期…

3.shell脚本例子

文章目录 1.计算从1到100所有整数的和2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和3.求从1到100所有整数的偶数和、奇数和4.用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在&a…

【Java EE】-Servlet(一) 创建Maven下的webapp项目

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 在满园弥漫的沉静的光芒之前,一个人更容易看到时间,并看到自己的身影。——史铁生《我与地坛》 主要内容:创建一个基于maven…

【云计算•云原生】5.云原生之初识OpenStack

文章目录 OpenStack起源OpenStack基本组件HorizonNovaSwiftCinderKeystoneNeutronGlanceCeilometerTroveHeat OpenStack简单框架模型 OpenStack起源 OpenStack是一个由NASA和Rackspace合作研发并发起的,以Aapache许可证授权的自由软件和开放源代码项目。为公有云及…

JS 实现区块链分布式网络

JS 实现区块链分布式网络 这里主要 JS 实现区块链 实现的部分继续下去,对 Blockchain 这个对象有一些修改,如果使用 TS 的话可能要修改对应的 interface,但是如果是 JS 的话就无所谓了。 需要安装的依赖有: express body-parse…

字节跳动ByteHouse与亚马逊云科技携手打造新一代云数仓服务

随着全球化的发展,越来越多的中国企业开始涉足海外市场,开展跨境业务。在这个过程中,强大的数据分析能力是出海企业不可或缺的重要一环。通过有效的数据分析,能帮助企业更好地了解全球市场对产品的需求便于调整产品战略&#xff0…

微服务---RabbitMQ进阶(消息可靠性,延迟队列,惰性队列,集群部署)

RabbitMQ进阶(消息可靠性,延迟队列,惰性队列,集群部署) 消息队列在使用过程中,面临着很多实际问题需要思考: 1.消息可靠性 消息从发送,到消费者接收,会经理多个过程: 其中的每一步都可能导致消息丢失,常见…

Python每日一练(20230506) 存在重复元素I、II、III

目录 1. 存在重复元素 Contains Duplicate I 2. 存在重复元素 Contains Duplicate II 3. 存在重复元素 Contains Duplicate III 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 存在重…

项目管理-数据管理能力DCMM模型

DCMM 数据管理能力成熟度评估模型简介 DCMM(Data Management Capability Maturity Assessment Model,数据管理能力成熟度评估模型)是我国首个数据管理领域国家标准,将组织内部数据能力划分为八个重要组成部分,描述了每…

重新定义座舱智能化的下半场?谁能抓住弯道超车的窗口期

2020年,高通8155上车之前,行业的定义更多是4G联网互联网生态(智能手机的复刻),以斑马智行为代表;而随着集成异构计算、高性能AI引擎(8TOPS算力)的高通8155密集上车,驱动行…