先说一下StatefulSet的更新策略
StatefulSet的.spec.updateStrategy 字段可以配置和禁用掉自动滚动更新
Pod 的容器、标签、资源请求或限制、以及注解。
spec.updateStrategy 有两个允许的值:RollingUpdate和OnDelete
RollingUpdate 更新策略
对 StatefulSet 中的 Pod 执行自动的滚动更新。这是默认的更新策略
OnDelete更新策略
StatefulSet 将不会自动更新 StatefulSet 中的 Pod
当StatefulSet 的 .spec.template 设置出现变动
用户必须手动删除 Pod 以便让控制器创建新的 Pod
当 StatefulSet 的 .spec.updateStrategy.type 被设置为 RollingUpdate 时, 属于默认滚动更新策略,
这个时候如果template发生变化,StatefulSet 控制器会自动发起调度,进行删除和重建 StatefulSet 中的
每个 Pod。 它将按照与 Pod 终止相同的顺序(从最大序号到最小序号)进行,每次更新一个 Pod。
Kubernetes 控制面会等到被更新的 Pod 进入 Running 和 Ready 状态,然后再更新其前身Pod。
如果你设置了 .spec.minReadySeconds(最短就绪秒数)
控制面在 Pod 就绪后会额外等待一定的时间再执行下一步。
分区滚动更新是滚动更新策略中的一个特殊场景,StatefulSet 控制一定范围内的Pod进行滚动更新,
调度为新版本Pod运行,而范围外的Pod继续维持老版本运行。
可以理解为,学校16个班级,校长通知说:"今天最后5个班级留下来打扫卫生"
通过声明 .spec.updateStrategy.rollingUpdate.partition 的方式,RollingUpdate 更新策略可以实现分区。
如果声明了一个分区,当 StatefulSet 的 .spec.template 被更新时
1)所有序号大于等于该分区序号的 Pod 都会被更新
2)所有序号小于该分区序号的 Pod 都不会被更新
1.假设原来有5个Pod
ng-0
ng-1
ng-2
ng-3
ng-4
2.SS滚动更新
ng-4 更新
ng-3 更新
ng-2 更新
ng-1 更新
ng-0 更新
3.如果指定 partition=2
那么SS执行滚动更新时
ng-4 更新
ng-3 更新
ng-2 更新
ng-1 不更新
ng-0 不更新
提示:需要注意的是,分区范围外的Pod,即使他们被删除或是重新调度,也会依据之前的旧版本进行重建,不会依赖当前最新版本重建。
此外,如果 StatefulSet 的 .spec.updateStrategy.rollingUpdate.partition 大于它的 .spec.replicas 对它的 .spec.template 的更新将不会传递到它的 Pod,此时所谓分区更新将失去意义。
在大多数情况下,你不需要使用分区,但如果你希望进行阶段式更新、执行金丝雀或执行分阶段上线,则分区更新会非常有用。
究竟是什么情况?我们都知道k8s中当StatefulSet或者它管理的Pod被删除时并不会删除关联的卷,当重新调度完成后,新Pod应该会挂载原PV,继续使用上一个Pod的数据。
举个例子:本应该继续使用原PV,皆大欢喜,可是线上告警发现PV 持久卷无法使用,导致数据丢失。咦,失联了???
k8s删除 StatefulSet 管理的 Pod 并不会删除关联的PV卷,这是为了确保你有机会重新调度Pod之后继续使用原PV卷,或者在删除卷之前从卷中复制数据,保证数据不会丢失。当一个 Pod 被调度(重新调度)到节点上时,它的 volumeMounts 会挂载与其 PVC相关联的 PV。
删除StatefulSet 和Pod虽然不会删除关联的PV卷,但是删除PVC就不一定了,问题就出现在这里,在 Pod 离开终止状态后删除 PVC ,可能会触发删除背后的 PV 持久卷,具体触发策略要取决配置的存储类和回收策略。
警告:永远不要假定在 PVC 删除后仍然能够访问卷
警告:删除 PVC 时要谨慎,因为这可能会导致数据丢失
为什么缩容无法正常执行?
StatefulSet 执行缩容操作,需要保证管辖范围内的Pod处于健康状态。如果某些Pod发生故障,则缩容会陷入阻塞,无法继续执行。
仅当 StatefulSet 等待到所有 Pod 都处于运Running和 Ready 状态后才可继续进行缩容操作。
如果 spec.replicas 大于 1,Pod副本数量大于1 ,Kubernetes 无法直接判定 Pod 不健康的原因。
Pod 不健康可能是由于永久性故障造成也可能是瞬态故障。
##永久性故障
如果该 Pod 不健康是由于永久性故障导致,则在不纠正该故障的情况下进行缩容可能会导致 StatefulSet
成员 Pod 数量低于应正常运行的副本数,这种状态也许会导致 StatefulSet 不可用。
#瞬态故障
瞬态故障可能是节点升级或维护而引起的节点重启造成的。
如果由于瞬态故障而导致 Pod 不健康,一般情况下,Pod 最终会再次变为可用,但是瞬态错误也可能会干扰 你对 StatefulSet 的扩容/缩容操作。
一些分布式数据库在同时有节点加入和离开时会遇到问题。
在这些情况下,最好是在应用级别进行分析扩缩操作的状态,并且只有在确保 Stateful 应用的集群是完全健康时才执行扩缩操作。
对于k8s集群来说有状态的副本集都会用到持久存储。
Deployment中的Pod template里定义的存储卷,是基于模板配置调度,所有副本集共用一个存储卷,数据是相同的。
StatefulSet职责是管理有状态应用,所以它管理的每个Pod都要自已的专有存储卷,它的存储卷就不能再用Pod模板来创建。
所以 StatefulSets 需要一种新方式来为管辖的Pod分配存储卷。
就这样VolumeClaimTemplate来了,k8s 给 StatefulSets 设置了VolumeClaimTemplate,也就是卷申请模板。
VolumeClaimTemplate:基于静态或动态地PV供给方式为Pod资源提供专有且固定的存储,它会为每个Pod都生成不同的PVC,并且绑定PV,实现每个Pod都有自己独立专用的存储卷。
StatefulSets 提供了有序且优雅的部署和扩缩保证。
SS是如何优雅部署和扩缩的呢?
当部署 Pod 时,它们是依次创建的,顺序为 0..N-1。
当删除 Pod 时,它们是逆序终止的,顺序为 N-1..0。
在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。
在 Pod 终止之前,所有的继任者必须完全关闭
定义副本数replicas=3
SS会创建3个Pod
分配有序序号
ng-0, ng-1, ng-2
SS严格执行部署或调度顺序,按序部署
ng-0 开始部署...
ng-0 进入Running 和 Ready 状态
SS 检测 ng-0 部署状态
确定ng-0,符合Running 和 Ready 状态
ng-1 开始部署
ng-1 进入Running 和 Ready 状态
SS 检测 ng-0 和 ng-1 部署状态
确定ng-0 和 ng-1 都符合Running 和 Ready 状态
才会执行 ng-2 部署
假设此时 ng-0 发生故障
那么ng-2 会阻塞,等待 ng-0 重新部署完成
ng-2 开始部署
ng-2 进入Running 和 Ready 状态
类似StatefulSet进行缩容跟扩容整体规则是一样的,只不过缩容时,终止顺序和创建顺序相反。
按照ng-2, ng-1, ng-0的顺序进行缩容操作。
ng-2没有完全停止和删除前,ng-1不会进行终止操作。
注意:如果SS在缩容过程中,有些Pod发生了故障,那么终止会进入阻塞,等待发生故障的Pod重新调度,进入Running和Ready状态之后才会继续执行SS缩容。
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)
让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
怎样说才是明智的呢?if@thing=="01"or"02"or"03"or"04"or"05"(数字包含在数据类型字符串的列中。) 最佳答案 制作数组并使用.include?if["01","02","03","04","05"].include?(@thing)如果值真的都是连续的,你可以使用像(1..5).include?这样的范围对于字符串,你可以使用:if("01".."05").include?(@thing) 关于ruby-优雅的链式'or'用于测试Ruby中的相同变量,我
我必须编写一个Ruby方法:遍历数组,如果其中一个元素符合特定条件则执行Foo。如果没有数组元素符合条件,则执行Bar操作。在任何其他语言中,我会在进入循环之前设置一个bool变量,并在执行Foo时切换它。该变量的值会告诉我是否需要Bar。但这感觉不像Rubyish那样不优雅。谁能提出更好的方法?编辑一些非常好的答案,但由于我本应提及的细节,它们不太有效。Foo所做的事情是对符合条件的数组元素完成的。此外,保证最多有一个元素匹配条件。 最佳答案 是否有任何项目匹配?如果是,则做一些不涉及匹配项目的事情。ifitems.any?{|i
我需要一个用于大型动态任务集合的调度程序。目前我正在查看resque-scheduler,rufus-scheduler,和clockwork.如果您提供有关选择使用哪一个(或其他替代方案)的建议,我将不胜感激。一些细节:有大量要定期执行的任务(最多100K)。最短执行周期为1h。新任务可能会不时出现。现有任务可能会更改或删除。调度延迟最小化在这里不是关键任务(可扩展性和可持续性最重要)。任务执行不是繁重的操作,可以轻松并行。总结,我需要类似cron的Ruby项目,它可以处理大量动态变化的任务集合。更新:我花了一天时间尝试调度库,现在我想简单总结一下新获得的经验。我已经不再关注Cloc
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据
我需要根据起点对Range类型的对象表进行排序。为此,我有以下代码可以正常工作:ranges=@ranges.sortdo|a,b|(a.min)(b.min)end我只是想知道是否有更短、更优雅的方法来做同样的事情。 最佳答案 怎么样:ranges=@ranges.sort_by(&:min)或者如果您实际上指的是起点而不是最小值,因为可能存在诸如(5..3)的范围:ranges=@ranges.sort_by(&:first) 关于ruby-在ruby中对范围进行排序的最优雅的方