开发者社区官方技术圈

阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。

阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。

1

回答

詹姆斯邦德00 2022-10-19 831浏览量 回答数 1

1

回答

詹姆斯邦德00 2022-10-19 931浏览量 回答数 1

首先随便翻看一本词典看一下operator 这个词的定义:操作员/运算符,是个名词。

那么,operator 描述的应该是一个围绕“操作、控制”概念的东西。为了让大家有个更直观的认识,我们来举一个例子,比如1+2=3,这个“+”就是一个operator(运算符),这个“+”让两个数字发生了一些互动(相加)。

有了词典里的概念铺垫后,我们继续往下分析,既然是一种操作或运算,那么在k8s中, 是谁来操作?而被操作的对象又是什么呢?让我们来看一下OperatorFramework 官网上对于Operator 的解释:

WHAT IS AN OPERATOR AFTER ALL?

An Operator represents human operational knowledge in software, to reliably manage an application. They are methods of packaging, deploying, and managing a Kubernetes application.

从这个定义中,我们可以看到,这个operator 是指由人发出的,对k8s 应用(Kubernetes application)展开的操作。一般围绕应用的操作有哪些?部署、升级、扩缩容、卸载等等。我们可以先这样理解,operator 应该就是一个类似控制器的东西,里面含有一些运维操作(后面会继续展开,其实不仅仅是这些)。

较真一点的读者可能会问,既然这样,这东西叫controller 是不是会更贴切一点呢?事实上,问出这个问题的读者,和真相很接近了,每个operator 基本都会有个控制器, 但又不仅仅只有一个控制器,还会有前面提到过的资源定义:CRD(CustomResourceDefinition)。每种自定义资源背后都会有一个或多个控制器,让这些资源看起来像活的一样,我们举一个比较切近生活的例子:

我们为家里的灯制作一个CRD 和operator,把这个operator 和灯开关连起来,当用户修改这个YAML 的时候,operator 会向开关转发指令。

image.png

从名字可以看出这盏灯被放在卧室(bedroom),当power=on 的时候电灯打开,power=off 的时候电灯关闭,修改亮度(brightness)和色温(colorTemperature)能操纵这盏灯在打开状态下的视觉效果。

通过上面这段灯的YAML 我们可以发现,在CRD+operator 的场景下,我们可以只关注对象终态,而不去关注其中的控制过程。比如当前家中网络不太稳定,要花1-2 秒,重试3 次operator 才能成功下发指令打开灯,这些重试我们是不感知的。我们只知道只要将power 设置为on,灯就会亮。类比到k8s 的日常实践,也是这样:

一个Pod 被放到集群后,控制器会想方设法去克服困难:从仓库拉取镜像,启动工作负载,如果crash 掉了就立即重试,直到稳定运行为止。我们只关心这个Pod 是否最终拉起可用。

所以,operator 其实是一种架构理念,它区别于常见的shell 等运维脚本方案:

operator 希望应用能够自己管理自己,而不是由运维人员写脚本从外围来控制他们。

不过,如果仅仅是这样,可能operator 也只能叫controller 了,只是一些自控制的逻辑而已。从最前面提到的operator 的概念可以看出,operator 能够让两种以上的资源产生一些互动关系,那么这是如何实现的呢?

我们继续用上面的灯的例子再加个YAML 让大家感受一下:

我们把自己的家也用一个自定义资源对象来描述,用来承载一些家中的全局设置。

image.png

当我们家中所有人都出门的时候,家中就没有人了,于是将nobody 设为true。然后Home 的operator 会遍历家中所有的开关、电器、灯等设备,全部都给关上(在YAML 上设置power=off)。同时也会根据常亮的策略(stayOpen),保持某些电器不关闭,比如冰箱。

image.png

从上面的例子可以看出,每个控制器只负责自己的那部分,但从顶层往下看,已经实现了级联控制,能够实现牵一发而动全身的效果。这个就是上面所提到的operator 的更深一层的机制:能够像运算符一样,让几种资源产生某种互动关系,一起协作完成一些复杂的工程动作。

以上内容摘自《SREWorks 云原生数智运维工程实践》电子书,点击https://developer.aliyun.com/ebook/download/7784可下载完整版。

胡嘞嘞 评论 0

1

回答

詹姆斯邦德00 2022-10-19 1088浏览量 回答数 1

不管是原生YAML/Helm 还是Kustomize,都是通过配置来搞定各类事情。然而CRD+Operator 就不一样了,它们让你直接接入apiserver,作为K8S 的一部分监听所有你关心的对象,并通过代码进行状态维持及管理。因为CRD 的开发是非常复杂的,除了业务逻辑之外,还需要做很多基础的工作,非常不便,所以有了Operator的开发框架(常见的有KubeBuilder 和Operator-SDK),让开发人员专注于CRD的业务代码开发。

我们可以来看一下operator 的架构实现,这个有助于我们理解operator 的工作原理:

image.png

如图可知,Operator 内部有个控制器来监听CR 的变化,同时由于每个变化对应的函数执行需要一定的耗时,所以引入一个队列来依次执行这些函数。由于整个逻辑的执行链路不同于普通的web服务,所以也需要一个框架来承载请求的流转。

市面上的KubeBuilder 或Operator-SDK 开发框架可以降低Operator 的难度,但Operator 的开发在当前所有的几类组件托管方案当中仍然是最为复杂的。前前后后需要CRD 设计及安装,编译Operator 及部署到集群,最后再下发CR,外围为了配套这些内容可能还需要上面Helm 或Kustomize 的协助,配合对应的CICD 流程及工具。

• Spark Operator

Spark Operator 是大数据分布式系统在k8s 场景一次经典的实践。原本Spark 的作业提交是需要通过spark-submit 命令,但有了Spark Operator 之后,我们可以直接向k8s 提交作业YAML,然后Spark Operator 监听CR,将这一作业提交给控制器。实现了我们前文提到的,将作业资源放在k8s 集群进行管理这一目标。

image.png

以上内容摘自《SREWorks 云原生数智运维工程实践》电子书,点击https://developer.aliyun.com/ebook/download/7784可下载完整版。

胡嘞嘞 评论 0

1

回答

Kustomize 相对于Helm而言,更加的轻量,只有一个CLI 工具。也集成到了kubectl自身,使用及配置成本接近于0。Kustomize 放弃了对模板的要求,改为参考Docker镜像的形式,通过Base+Overlay 的方式对应用的原始YAML 进行派生。

• Base YAML 管控:Helm最大的特点是定制仅限于预先存在的配置选项。不仅如此,Chart 作者还必须用有点麻烦的模板化方式实现这些定制选项。这个时候Kustomize 不受限制的Overlay 会更加灵活,想怎么覆盖就怎么覆盖。所以Helm对Base YAML 强管控;而Kustomize 虽然也有Base,但Overlay 的存在让这个限制几乎不存在。

• 模板语法层面:Kustomize 相较于Helm去掉了模板语法,入门门槛更低,更易使用。当然如果玩的高阶,两者都要学习很多东西。

• 部署层面:虽然Kustomize 最为轻量,但因为Helm3 取消了Tiller 依赖,所以差别也不是很大,两者都是二进制命令工具生成YAML 后直接下发。

• 工作流程上:

 Helm:定义Chart->填充->运行。在Chart 中没有定义的内容是无法更改的。

 Kustomize:Base 和Overlay 都是可以独立运作的,增加新对象,或者对编写Base 时未预料到的内容进行变更,都非常简单。

基于上述工作流程的对比,如果是要公开发布一个复杂的组件,编写一个复杂而设计良好的Helm Chart 可以给用户很大帮助。用户在缺失了自由性之下,仅仅通过values.yaml 的阅读和配置就可以对这种复杂的部署产生一个较为深入的认知。

如果是常见的业务应用,虽然不同的部署之间差异不大(比如日常预发生产),但是因为快速迭代及需求变化,未必可以一开始就做好相关的变化限制,用Kustomize是更好的选择。

对于承载应用(Application)这个概念而言,Kustomize 和Helm 的短板是一致的,都没有进一步提供包之间的依赖处理、外部资源申请及维护、变量间传递等能力。

对于承载组件(Component)这个概念而言,Kustomize 和Helm类似,都是合适的工具。虽然Helm和Kustomize 在自身的能力和流程上有着很多区别,但最终流程都是:开发者(一堆YAML)->合适的参数映射及渲染方式->使用者(填参/覆盖)->apply 到目标K8S 中。萝卜青菜,各有所爱。"

以上内容摘自《SREWorks 云原生数智运维工程实践》电子书,点击https://developer.aliyun.com/ebook/download/7784可下载完整版。

胡嘞嘞 评论 0

1

回答

詹姆斯邦德00 2022-10-19 618浏览量 回答数 1

Helm 将上述对象都看作一个程序包内的部分,当我们想要对程序执行操作的时候,不需要告诉helm 我们要对哪个对象进行变更,只用传入程序名称,Helm 会帮助我们对程序下的每个对象执行相应的操作。

这个包含了一组yaml 文件的程序包,就叫做Helm Chart。Chart 是一个描述Kubernetes 相关资源的文件集合,它的格式如下:

image.png

开发时通常不会将name 硬编码在资源中,用户可以通过插入发布名称来生成name 字段。

所以我们的job.yaml 就变为了:

image.png

模板命令{ {.Release.Name}}将发布名称注入了模板。值作为一个命名空间对象传给了模板,用点(.)分隔每个命名空间的元素。

在执行helm install 命令时,模版渲染引擎会将括在{ {和}}之间的模版命令替换为values.yaml 中定义的值或用户通过--set 设置的值,并将渲染后的文件发送到templates/目录中,然后收集结果并发送给Kubernetes。

可以通过helm 命令对chart 执行相应的操作:

image.png

还能用Helm 创建自己的charts,也可以从Helm仓库中下载。

社区的Helm Chart仓库位于Artifact Hub,可以下载其他人上传的chart 到本地使用,也可以将自己制作的chart 上传到仓库中。同时Helm 也支持创建并运行私有仓库,供个人和组织内部使用。

以上内容摘自《SREWorks 云原生数智运维工程实践》电子书,点击https://developer.aliyun.com/ebook/download/7784可下载完整版。

胡嘞嘞 评论 0

1

回答

詹姆斯邦德00 2022-10-19 464浏览量 回答数 1

Helm 是Kubernetes 生态系统中的一个软件包管理工具,类似于类似于Ubuntu 中的apt、CentOS 中的yum 等。它可以被用于自动创建、打包、配置和部署应用程序和服务到Kubernetes 集群。

Kubernetes 为用户提供了自动部署、扩展和管理容器化应用程序的能力,然而用户部署在Kubernetes 集群上的应用可能会非常复杂,一个典型的应用(以SREWorks为例)通常会有一系列对象进行内部交互来使得程序正常运转。

首先我们需要Deployment 用于部署我们想要运行的pods,例如Mysql 数据库;StorageClass 用于动态分配存储卷;Persistent Volume(PV)用于储存数据库;Service 用于指定pod 的访问策略使得外部可以访问pod 的服务;Job 用于执行任务保证指定数量的pods 部署成功……

image.png

在Helm出现之前,每个对象都需要一个单独的yaml文件来配置,然后通过kubeclt apply 逐一创建这些对象。如果需要对其中的一些内容进行更改,必须找到对应的yaml 文件并在其中找到对应的属性;而如果想要升级其中的一些组件,也要仔细地编辑多个文件,防止错误和遗漏;当要删除这个应用程序时,也要手动删除其对应的所有组件……

Kubernetes 并不是从“应用程序”的层面来管理集群中的各个组件,它只是将用户提交上去的yaml 保存在集群中并各自运行,实际上它并不知道用户声明的各个对象,例如Job、Service、StorageClass、Deployment 等,是同一个应用程序下不同的组成成分。

当应用较为复杂的时候,要记住变量的位置并人工执行操作是一件冗余且复杂的事,并且会给多人协作开发应用增加难度。

在这样的基础上,Helm应运而生,为开发人员提供了模块化的应用管理工具,降低了Kubernetes 用户的工作量和工作复杂度。

以上内容摘自《SREWorks 云原生数智运维工程实践》电子书,点击https://developer.aliyun.com/ebook/download/7784可下载完整版。

胡嘞嘞 评论 0

在Pod running阶段的时候,Pod 就迎来对其健康的检查,当前kubelet 提供三种方式判定:

• readiness:检查Pod 是否为健康。

• liveness:件看Pod 是否正常,若检查失败,则重启容器。

• readinessGate:提供给第三方组件健康验证,第三方组件验证不过,则Pod 不为健康。

image.png

readiness 与liveness 检查参数都是一致的。

• httpGet/tcpSocket:都是检查方式,一种是http 请求验证,一种是tcpSocket,其中也有exec执行命令,以及grpc形式验证。

• initialDelaySeconds:延迟多久开始检查,原因在于容器启动的时候,通常需要过段时间进行验证。

• periodSeconds:检验时间周期。

• failureThreshold:连续几次失败,则代表这轮检验失败。

• successThreshold:连续几次成功,则代表这轮检验成功。

• timeoutSeconds:代表检验超时时间,若检验在该配置时间内没有返回,则认为检验失败。

readiness、liveness 虽然参数不一样,但对检验的结果行为不一致。

• readiness 默认状态下为false,也就是Pod 为不健康,直到检查通过,才将Pod变为健康。

• liveness 默认状态下为true,不会在刚开始就将Pod 重启,只有等检查不通过后,才会进行容器重启操作。

readinessGate 是Pod 健康的扩展, kubelet 会基于此, 默认在pod.status.conditions 上配置对应的condition,比如当前例子readinessGate 为conditionType:TestPodReady,则相应就会有conditions。

image.png

当该condition.status 为false 时,则Pod 就会一直是不健康,哪怕readiness 检查通过,直到第三方系统去操作更新Pod 该condition.status 为true,才可以将Pod 变为健康,这样就可以接入更多的Pod 健康指标。

以上内容摘自《SREWorks 云原生数智运维工程实践》电子书,点击https://developer.aliyun.com/ebook/download/7784可下载完整版。

胡嘞嘞 评论 0

公告

阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。

展开