(译)Kubernetes 如何控制你的集群

原文地址:https://hackernoon.com/level-triggering-and-reconciliation-in-kubernetes-1f17fe30333d

kubernetes 是到目前为止最流行的容器编排系统,它的成功主要源自于它的稳定性。所有的软件都会有bug,但在容器编排领域,kubernetes比它的其他竞争者更可靠。

kubernetes不管怎么样,最终都会达到并且一直保持运行着你期望的容器副本数。它的官方文档称其为kubernetes是能自愈的系统。这种行为能力来自于 Kubernetes 设计的核心理念。

控制循环的目标行为是非常稳定的。这一点在kubernetes中,那些未注意到的异常会随着时间推移从而被纠正过来得到了证实。

如果你是边缘触发,你有可能面临永久丢失状态的风险。如果你是水平触发,这种方式是有容错的,它会调整组件以满足按照期望状态运行。这些就是Kubernetes运行良好的原因。

- Joe Beda,Heptio 的首席技术官(引用自云原生基础设施,作者 Justin Garrison 和 Kris Nova)

中断:边缘和水平触发的同一信号

(译)Kubernetes 如何控制你的集群_第1张图片

边缘触发和水平触发是电子工程中的概念,它们指的是系统应如何随时间响应数字信号的变化。系统应当关注何时信号从高电平切换到低电平、从低电平切换到高电平以及信号是否一直处于高电平。

以另一种方式解释它,就是说:

> let a = 3;

> a += 4;

< 7

在边缘触发的操作视图中,我们会看到:

add 4 to a

当某一时刻触发时,这个将会发生一次。

在水平触发的操作视图中,我们会看到:

a is 7

在某一时刻触发时,这个将会一直持续,直到下一事件产生。

分布式系统中的边缘和水平触发

一般来说,边缘和水平两者之间并没有显著的不同。在现实世界中,即使在系统编程级别,我们也必须处理实际问题。一个常见的问题就是采集率。如果系统没有用足够的频率去采集信号,那么无论是边缘的转变还是短暂的水平的变化,系统都可能会错过信号的触发。

在大规模的集群和网络中,会有许多问题需要应对,网络是不可靠的,人们很难及时发现,错误会一直产生。在某种程度上,这些问题就像糟糕的或者是不一致的采样率一样,它让我们对信号的发生产生费解。

认识发生变化时的异常

让我们看一下一个异常的信号将如何分别对边缘触发系统和水平触发系统的变化造成影响:

##### 理想的情况

(译)Kubernetes 如何控制你的集群_第2张图片

边缘和水平触发系统如果中断信号

在理想的情况下,边缘触发和水平触发系统都会正确的接收到信号。当信号从高电平转换为低电平,他们都能马上变成低电平的状态。

两个异常

(译)Kubernetes 如何控制你的集群_第3张图片

上升沿和下降沿的异常会使丢失触发,但最终会得到正确的状态。

在最开始的两个信号变化的而发生的异常中,边缘触发系统和水平触发系统的区别是很明显的。边缘触系统发丢失了信号的第一次上升沿。水平触发系统会把信号设置成它最后观察到的状态直到发生其他的变化。这样会使信号保持正确,只不过在异常之后会有一定的延迟。

一个异常

(译)Kubernetes 如何控制你的集群_第4张图片

一次不巧的异常会对边缘触发系统产生巨大影响。

更少的异常并不意味着会得到好的结果。随着信号从高电平切换到低电平的接收异常,水平触发系统总能保持正确的状态。边缘触发系统只看到了两次上升沿,从而使信号未处于正确的状态。

再次用加法表示信号的变化:

let a = 1;
a += 1;
a -= 1;
a += 1;
< 2

但边缘触发系统会得出:

let a = 1;
a += 1;
a += 1;
< 3

协调期望和实际的状态

kubernetes会同时观察两种信号:集群的期望状态和当前的实际状态。期望状态是指人们希望集群中的对象处于的状态(例如我的应用需要运行两个实例。)理想中,实际的状态应当和期望的状态匹配,但是实际上,它会受到硬件问题和其他干扰的影响,从而无法总是保证运行在期望状态。甚至时间也是一个因素,因为不可能立即使实际状态与期望状态相匹配。容器镜像必须从镜像仓库中下载,应用程序需要时间来平滑关闭,等等

kubernetes不得不先得到当前实际状态,并朝着期望状态协调。这种情况在不停的进行中,获取两种状态,确定它们之间的差异,把实际状态朝着期望状态更新。

在kubernetes中扩容Deployment

(译)Kubernetes 如何控制你的集群_第5张图片

在边缘触发系统中,我们可能会得到于期望大相径庭的结果

即便没有网络的异常,试图协调两种状态的边缘触发系统也可能以错误的结果而告终

如果我们启动一个容器副本,并期望它能扩容成5个,之后变成2个,一个边缘触发系统会对期望状态发生如下变化:

let replicas = 1;
replicas += 4;
replicas -= 3;

系统真实的状态并不能马上反应如上的指令。像在图中所示,他最终会在只有三个副本运行的时候终止,最后只会得到0个副本而不是期望的2个。

在水平触发系统中,我们总是在完整地比较期望状态和实际状态,这会减少状态不同步现象的发生。

优化

边缘触发并不是一无是处的。它比起水平触发的优势在于,当发生变化时,能实时反馈。

边缘触发系统的异常问题是能够被缓解的。这需要它像水平触发系统那样周期性的同步完整状态。异常也能通过带有明确版本和排序的事件来缓解。

对kubernetes而言,通过对水平触发系统中的思考和改进给用户带来了一个简洁的分布式计算架构。

你可能感兴趣的:(k8s,docker,kubernetes,云原生,容器)