k8s集群StatefulSets的Pod优雅调度问题思考

考点之你能解释一下为什么k8s的 StatefulSets 需要VolumeClaimTemplate嘛?
考点之简单描述一下StatefulSets 对Pod的编排调度过程?
考点之针对线上StatefulSet 的Pod缩容故障无法正常缩容的情况,你能灰度分析一下嘛?
考点之聊聊什么是StatefulSet的分区滚动更新吧?什么场景需要使用分区更新?
考点之StatefulSet提供优雅稳定的存储,但是线上告警StatefulSet Pod重新调度后数据丢失?

囧么肥事-胡说八道

你能解释一下为什么k8s的 StatefulSets 需要VolumeClaimTemplate嘛?

对于k8s集群来说有状态的副本集都会用到持久存储

Deployment中的Pod template里定义的存储卷,是基于模板配置调度所有副本集共用一个存储卷,数据是相同的。

StatefulSet职责是管理有状态应用,所以它管理的每个Pod都要自已的专有存储卷,它的存储卷就不能再用Pod模板来创建。

所以 StatefulSets 需要一种新方式来为管辖的Pod分配存储卷。

就这样VolumeClaimTemplate来了,k8sStatefulSets 设置了VolumeClaimTemplate,也就是卷申请模板

说了为什么需要它,那么VCT到底是什么呢?

VolumeClaimTemplate:基于静态或动态地PV供给方式为Pod资源提供专有且固定的存储,它会为每个Pod都生成不同的PVC,并且绑定PV,实现每个Pod都有自己独立专用的存储卷。

简单描述一下StatefulSets 对Pod的编排调度过程?

StatefulSets 提供了有序且优雅的部署和扩缩保证

SS是如何优雅部署和扩缩的呢?

对于包含 N 个 副本的 StatefulSet

当部署 Pod 时,它们是依次创建的,顺序为 `0..N-1`。

当删除 Pod 时,它们是逆序终止的,顺序为 `N-1..0`。

在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。

在 Pod 终止之前,所有的继任者必须完全关闭

创建或扩容过程,以Nginx举例

定义副本数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缩容。

针对线上StatefulSet 的Pod缩容故障无法正常缩容的情况,你能灰度分析一下嘛?

为什么缩容无法正常执行?

StatefulSet 执行缩容操作,需要保证管辖范围内的Pod处于健康状态。如果某些Pod发生故障,则缩容会陷入阻塞,无法继续执行。

仅当 StatefulSet 等待到所有 Pod 都处于运Running和 Ready 状态后才可继续进行缩容操作。

了解完为什么缩容无法执行,那么再聊聊可能导致无法正常缩容原因都有哪些?

如果 spec.replicas 大于 1,Pod副本数量大于1 ,Kubernetes 无法直接判定 Pod 不健康的原因。

Pod 不健康可能是由于永久性故障造成也可能是瞬态故障

永久性故障

如果该 Pod 不健康是由于永久性故障导致,则在不纠正该故障的情况下进行缩容可能会导致 StatefulSet 成员 Pod 数量低于应正常运行的副本数。这种状态也许会导致 StatefulSet 不可用。

瞬态故障

瞬态故障可能是节点升级或维护而引起的节点重启造成的。

如果由于瞬态故障而导致 Pod 不健康,一般情况下,Pod 最终会再次变为可用,但是瞬态错误也可能会干扰 你对 StatefulSet 的扩容/缩容操作。

一些分布式数据库在同时有节点加入和离开时会遇到问题。

在这些情况下,最好是在应用级别进行分析扩缩操作的状态,并且只有在确保 Stateful 应用的集群是完全健康时才执行扩缩操作。

聊聊什么是StatefulSet的分区滚动更新吧?什么场景可以使用分区更新?什么情况分区更新会失效?

先说一下StatefulSet的更新策略

StatefulSet.spec.updateStrategy 字段可以配置和禁用掉自动滚动更新 Pod 的容器、标签、资源请求或限制、以及注解。

spec.updateStrategy 有两个允许的值:RollingUpdateOnDelete

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 被更新时

所有序号大于等于该分区序号的 Pod 都会被更新
所有序号小于该分区序号的 Pod 都不会被更新

分区更新,就是进行分段处理

假设原来有5个Pod
ng-0
ng-1
ng-2
ng-3
ng-4 SS滚动更新
ng-4 更新
ng-3 更新
ng-2 更新
ng-1 更新
ng-0 更新 如果指定 partition=2
那么SS执行滚动更新时
ng-4 更新
ng-3 更新
ng-2 更新
ng-1 不更新
ng-0 不更新

需要注意的是,分区范围外的Pod,即使他们被删除或是重新调度,也会依据之前的旧版本进行重建,不会依赖当前最新版本重建。

此外,如果 StatefulSet 的 .spec.updateStrategy.rollingUpdate.partition 大于它的 .spec.replicas,对它的 .spec.template 的更新将不会传递到它的 Pod,此时所谓分区更新将失去意义。

分区更新应用场景?

在大多数情况下,你不需要使用分区,但如果你希望进行阶段式更新、执行金丝雀或执行分阶段上线,则分区更新会非常有用。

StatefulSet提供优雅稳定的存储,但是线上告警StatefulSet 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 时要谨慎,因为这可能会导致数据丢失

获取更多干货(MySQL、K8S),欢迎关注微信公众号:囧么肥事

k8s集群StatefulSets的Pod优雅调度问题思考?的更多相关文章

  1. k8s集群StatefulSets的Pod调度查询丢失问题?

    k8s集群StatefulSets的Pod调度查询丢失问题? 考点之简单介绍下StatefulSets 和 Deployment 之间有什么本质区别?特定场景该如何做出选择呢? 考点之你能辩证的说说看 ...

  2. 如何用prometheus监控k8s集群中业务pod的metrics

    一般,我们从网上看到的帖子和资料, 都是用prometheus监控k8s的各项资源, 如api server, namespace, pod, node等. 那如果是自己的业务pod上的自定义metr ...

  3. 【故障公告】没有龙卷风,k8s集群翻船3次,投用双集群恢复

    今天没有龙卷风(异常的高并发请求),故障却依然出现,问题非常奇怪. 某种异常情况会造成短时间内, k8s 集群中大量 pod (超过60%)因健康检查失败而处于 CrashLoopBackOff 状态 ...

  4. k8s集群启动了上万个容器(一个pod里放上百个容器,起百个pod就模拟出上万个容器)服务器超时,无法操作的解决办法

    问题说明: 一个POD里放了百个容器,然后让K8S集群部署上百个POD,得到可运行上万个容器的实验目的. 实验环境:3台DELL裸机服务器,16核+64G,硬盘容量忽略吧,上T了,肯定够. 1.一开始 ...

  5. kubeadm搭建K8s集群及Pod初体验

    基于Kubeadm 搭建K8s集群: 通过上一篇博客,我们已经基本了解了 k8s 的基本概念,也许你现在还是有些模糊,说真的我也是很模糊的.只有不断地操作去熟练,强化自己对他的认知,才能提升境界. 我 ...

  6. k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?

    k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...

  7. 如何使用helm优雅安装prometheus-operator,并监控k8s集群微服务

    前言:随着云原生概念盛行,对于容器.服务.节点以及集群的监控变得越来越重要.Prometheus 作为 Kubernetes 监控的事实标准,有着强大的功能和良好的生态.但是它不支持分布式,不支持数据 ...

  8. 案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul

    #案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul #项目背景 多套业务系统, 所有节点注册到consul集群,方便统一管理 使用consul的dns功能, 所有节点hostnam ...

  9. 为K8S集群建立只读权限帐号

    参考URL: https://www.jianshu.com/p/a1a0d64f1245 https://mritd.me/2018/03/20/use-rbac-to-control-kubect ...

随机推荐

  1. 初识 oracle!

    /** * 一.oracle的简介? * 1.是一个关系型数据库,强大! * * 软件名 开发商 用途 * * oracle oracle 专门的软件公司 收费!1.连接的用户数,2.服务器的cpu的 ...

  2. Java的代理机制

    Java的代理机制 使用代理 Proxzy 可以在运行时创建一组给定接口的新类,这种功能只有在编译时无法确定需要实现哪种接口时才需要使用. 1. 使用代理的时机 假如有一个表示接口的 Class 对象 ...

  3. JVM学习一:常用JVM配置参数

    原文链接:https://www.cnblogs.com/pony1223/p/8661219.html 在IDE的后台打印GC日志: 既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技 ...

  4. php表单初始化

    转载请注明来源:https://www.cnblogs.com/hookjc/ //初始化表单值的函数function  InitForm($row,$form="form1"){ ...

  5. 淘大大出了composer镜像 -- 给力

    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

  6. 认识BufferedReader的readLine、ready,以及InputStream的available

    最近,同学做实验的时候,在读取服务器端返回的时候,使用了BufferedReader类的readLine,他是这么写的,while(reader.ready()) {//执行读取操作,即readLin ...

  7. iOS应用性能调优的建议和技巧--中高级--王朋

    中级(这些是你可能在一些相对复杂情况下可能用到的) 9. 重用和延迟加载Views 10. Cache, Cache, 还是Cache! 11. 权衡渲染方法 12. 处理内存警告 13. 重用大开销 ...

  8. Spark算子 - reduce

    释义 reduce将partition内所有记录最终计算成1个记录,结果类型与reduce 时数据类型一致 方法签名如下: def reduce(f: (T, T) => T): T = wit ...

  9. Linux vi 命令 – 文本编辑器

    vi命令是linux系统字符界面下的最常用的文本编辑器. vi编辑器是所有linux的标准编辑器,用于编辑任何ASCⅡ文本,对于编辑源程序尤其有用.iv编辑器功能非常强大,可以对文本进行创建,查找,替 ...

  10. 基于6U VPX TMS320C6678+XC7K325T 的信号处理板

    一.板卡概述 本板卡基于6U VPX结构设计无线电信号处理平台.板卡包含1片C6678芯片,1片 FPGA XC7K325T-2FFG900I:4路AD,4路DA:三个双排插针接口,要求承接前端射频电 ...