K8s和声明式编程

发布时间 2024-01-07 15:27:43作者: 桓公子

转载:原文链接

认识k8s之后,他的操作模式对我来说是一种很不错的体验。他提供了更接近现实世界的面向对象接口。

什么是k8s?

Kubernetes(K8s)是一种开源容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它简化了容器化应用的管理,提供自动化、可扩展的部署,并允许高效管理跨多个主机的容器化应用程序。

在Kubernetes中有许多对象。其中,Deployment创建ReplicaSets,ReplicaSets负责创建Pod。ReplicaSets它们是一组具有相同配置的Pod的集合。Pod是Kubernetes的最小部署单元,可容纳一个或多个容器。ReplicaSets确保指定数量的Pods运行,如果失败则重新创建,而Deployment则管理和配置ReplicaSets,确保应用程序可靠地运行。

我要如何操作他?

在使用中,我需要关心Deployment如何创建ReplicaSets吗?我需要关心ReplicaSets如何创建Pod吗?实际上我并不需要,我对此一无所知。我只需要对他们的spec进行定义即可。什么意思呢?我只需要告诉系统(控制面)每个对象应该是什么(或者定义对象的模板),例如需要几个pod,升级策略是什么(注意:不是如何升级,而是升级应该确保什么?例如确保有3个可用的pod)。控制面会监控每个对象的情况,并尽可能的让他们的实际情况接近我定义的情况。至于他们是怎么做的我完全不需要理会。

声明式编程

没错,上面的体验正是我想说的:声明式编程。与过程式编程不同,声明式编程只用告诉机器我需要怎样的东西,而不需要告诉他我要怎么做。例如SQL,我只声明了我要怎样的数据,却不用告诉机器如何查找,不需要告诉他走哪个索引或者全表搜索。

如何在实务中使用声明式编程

我们可以做一个事件处理系统,前端发送来请求,记录到事件里面去。事件处理系统收到事件,则进行处理,再反馈给前端。前端的请求是精准的一个大的需求,而不是多次的分步的请求。事件处理系统更像是一个大的状态机,根据前端发来的各种请求,改变各种状态,以达到需求。

例如,我要实现当用户的密码被修改(包括用户修改和管理员修改),然后发送短信通知用户的请求。

首先,前端发送用户修改请求,状态机收到信息,修改密码,更新密码修改时间。此时系统达到了第一个状态。

很快,系统轮询发现,密码修改通知的事件早于密码最新修改的事件,就触发密码修改通知,然后更新密码修改通知的事件为当前时间(晚于密码最新修改时间)。

再次,前端发送管理员修改请求,状态机同样修改密码,更新修改密码时间。随后,系统轮询再次发现密码修改通知的事件早于密码最新修改的事件,就触发密码修改通知,然后更新密码修改通知的事件为当前时间(晚于密码最新修改时间)。

好了,有人可能就会问了。我搞这么复杂,还要轮询维护状态,为什么不直接修改密码请求的时候,一并发送通知呢?我给出的例子实际上是简化的,只有两个修改密码的方式。如果其他情况,我要100个,1000个修改方式呢?甚至我允许直接改数据库修改呢?是不是就没办法及时响应了。

当然,问题也很明显了。需要许多CPU算力和内存来监控数据变化,轮询各种事件。即便什么都没做,监控与轮询依然存在,这将非常消耗资源。

希望在不久的将来,资源不再成为问题。