K8s StatefulSet

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s StatefulSet相关的知识,希望对你有一定的参考价值。

参考技术A StatefulSet和Deployment一样,可以保证集群中运行指定个数的pod,也支持横向扩展。除此之外StatefulSet中每一个pod会分配一个内部标记用来区分。尽管StatefulSet的pod确实是从同一个pod模板创建的,但每个pod都是不可互换的。无论pod被怎样调度,它们的标记都不会改变。StatefulSet的这个特性,使得其下管理的每个pod具有不同的网络标识(可以指定发送请求到具体哪个pod,这些pod之间也可以相互通信),也可以绑定不同的持久化存储(pod重新调度之后,和它绑定的存储仍然是原先那个)。

下面是一个创建StatefulSet的例子,注意在此之前创建了一个配套的headless service。

StatefulSet中每个pod的标识都是不同的。pod标识包含一个整数序号,固定的网络标识和存储标识。无论pod被调度到哪个节点运行,这些标识始终会跟随这个pod。

如果StatefulSet运行了n个pod,这些pod会被编号,从0到n - 1。

建立了对应的headless service之后,StatefulSet每个pod对应的DNS遵循如下的命名规则:

例如:

每个pod都分配了一个单独的PV,PV和pod是强关联的。如果pod意外停止,无论再次启动的时候被调度到了何处,它仍然绑定到之前相同的PV上。如果这个pod,甚至是StatefulSet被删除,PV也不会被自动删除。需要手工操作。

StatefulSet创建pod的时候会自动为pod添加一个 statefulset.kubernetes.io/pod-name 标签。可用于专门为某个特定的pod绑定service。

需要注意如下几点:

StatefulSet不应该配置 pod.Spec.TerminationGracePeriodSeconds 为0,会有潜在的问题。

配置项位于 .spec.podManagementPolicy 。用来配置pod的创建和销毁是否可以并行操作。有如下两个配置值:

用来配置滚动升级的行为。配置项位于 .spec.updateStrategy 。

可供配置的值如下:

如果滚动升级发生问题,某个pod总是无法进入就绪状态,StatefulSet会停止滚动升级,进入等待状态。

发生这种情况的时候,仅仅将pod template修改正确是不够的。必须手工将无法启动的pod删除掉,StatefulSet会重新以正确的配置创建pod。否则StatefulSet仍会处于无限等待状态。

StatefulSet会最大程度确保序号相同的pod同时只运行1个。比如说这个场景:集群中某个节点突然和集群失去网络联系,这个节点又恰好运行了某StatefulSet的一个pod。此时,这个pod不会立刻停止运行,状态会改变为Unknown。如果操作集群其他正常节点,手工删除这个pod,这个pod也不会真正删除,仅会被标记为删除(mark for deletion)。这时候k8s不会创建序号相同的pod,直到那个失去连接的节点重新连接到集群,k8s才会把这个pod删除,并创建出新的序号相同的pod。如果需要强制删除这个pod,可以执行如下命令(web-0为要强制删除的pod名称):

什么是K-S检验

Kolmogorov-Smirnov是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法。其原假设H0:两个数据分布一致或者数据符合理论分布。D=max|
f(x)-
g(x)|,当实际观测值D>D(n,α)则拒绝H0,否则则接受H0假设。KS检验与t-检验之类的其他方法不同是KS检验不需要知道数据的分布情况,可以算是一种非参数检验方法。当然这样方便的代价就是当检验的数据分布符合特定的分布事,KS检验的灵敏度没有相应的检验来的高。在样本量比较小的时候,KS检验作为非参数检验在分析两组数据之间是否不同时相当常用。
假定两个样本的样本量分别为n1和n2,用F1(X)和F2(X)分别表示两个样本的累积经验分布函数。再记Dj=F1(Xj)-F2(Xj)。检验统计量近似正态分布,表达式为:Z=max|
Dj
|根号下(n1n2/(n1+n2))
方法步骤是:
(1)令f(x)为假设所特定的理论累积分布函数;
(2)令sn(x)为n个观察值的样本累积函数。对每一个观察值x,sn(x)=k/n,k是小于或等于x的观察例数;
(3)确定最大距离D,定义为:
D=max|f(x)-sn(x)|
检验假设H0:
f(x)=sn(x)
备择假设H1:
(4)对于选定的显著水平,如果D值等于或大于附表的临界值,则拒绝原假设
参考技术A Kolmogorov-Smirnov是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法。其原假设H0:两个数据分布一致或者数据符合理论分布。D=max| f(x)- g(x)|,当实际观测值D>D(n,α)则拒绝H0,否则则接受H0假设。KS检验与t-检验之类的其他方法不同是KS检验不需要知道数据的分布情况,可以算是一种非参数检验方法。当然这样方便的代价就是当检验的数据分布符合特定的分布事,KS检验的灵敏度没有相应的检验来的高。在样本量比较小的时候,KS检验作为非参数检验在分析两组数据之间是否不同时相当常用。
假定两个样本的样本量分别为n1和n2,用F1(X)和F2(X)分别表示两个样本的累积经验分布函数。再记Dj=F1(Xj)-F2(Xj)。检验统计量近似正态分布,表达式为:Z=max| Dj |根号下(n1n2/(n1+n2))
方法步骤是:
(1)令f(x)为假设所特定的理论累积分布函数;
(2)令sn(x)为n个观察值的样本累积函数。对每一个观察值x,sn(x)=k/n,k是小于或等于x的观察例数;
(3)确定最大距离D,定义为:
D=max|f(x)-sn(x)|
检验假设H0: f(x)=sn(x)
备择假设H1:
(4)对于选定的显著水平,如果D值等于或大于附表的临界值,则拒绝原假设
参考技术B K-S检验是统计学中在对一组数据进行统计分析是所用到的一种方法。它是将需要做统计分析的数据和另一组标准数据进行对比,求得它和标准数据之间的偏差的方法。一般在K-S检验中,先计算需要做比较的两组观察数据的累积分布函数,然后求这两个累积分布函数的差的绝对值中的最大值D。最后通过查表以确定D值是否落在所要求对应的置信区间内。若D值落在了对应的置信区间内,说明被检测的数据满足要求。反之亦然。

以上是关于K8s StatefulSet的主要内容,如果未能解决你的问题,请参考以下文章

k8s启动单点mysql

k8s入门教程详解

k8s入门教程详解

k8s入门教程详解

[k8s系列六]K8S网络补充之DNS

利用K8S技术栈打造个人私有云(连载之:K8S环境理解和练手)