升级Kubernetes集群时的应用程序容错

他们在评论中以某种方式询问了参与Slurm与阅读Kubernetes手册有何不同的问题。 我请Slurm-2和MegaSlurm的发言人Pavel Selivanov给出一个小例子,说明他将对Slurms讲些什么。 我请他发言。


我正在管理Kubernetes集群。 最近,我需要更新k8s的版本,包括重新启动集群中的所有计算机。 我从12:00开始工作,到工作日结束,一切都准备就绪。 第一次,我仍然关注更新的进度,第二次我去吃了1.5个小时的午餐(公平地说,是拿着笔记本电脑)。 群集本身进行了更新,没有我的参与,并且对客户无形地显示,开发过程没有发现任何东西,继续部署,该服务照常运行。


看起来像什么。


可能的问题


重新启动计算机时,有两种不良情况。


  1. 开发人员在一个实例中启动了/ redis应用程序。 无论您多么谨慎地将汽车停运,都将导致停机。
  2. 该应用程序有2个副本,其中一个已部署。 她出去了,只有一个副本,然后管理员来扑灭了最后一个副本。 同样,直到副本在部署后上升之前,都将出现停机时间。

他们说,我可以协调重启与开发的关系,停止部署,检查实例,然后重启机器,但是我喜欢DevOps的想法,即应尽量减少人际交流。 一次设置自动化比每次协调操作要好。


任务条件


我使用Amazon的便利性和稳定性。 一切都是自动化的,您可以创建和熄灭虚拟机,检查其可用性等。


我非常喜欢通过kops实用程序来部署,管理和更新Kubernetes集群。
更新kops时,它会自动排空一个节点(kubectl排空节点),等待所有内容从该节点撤离,将其删除,在Amazon中使用正确版本的Kubernetes组件创建一个新节点,将其附加到集群,验证该节点是否已正确进入集群,因此将所有节点围成一个圆圈,直到所需的Kubernetes版本无处不在。


解决方案


在CI中,我使用kube-lint检查将在Kubernetes中启动的所有清单。 Helm Template抛出了将要启动的所有内容,我设置了一个lint进行卸载,然后根据给定的规则对所有内容进行评估。


例如,其中一条规则规定,对于Kubernetes集群中的任何应用程序,副本数必须至少为2。
如果根本没有副本(默认为1),则副本为0或1,kube-lint禁止将其部署到群集中,以避免将来出现问题。


假设按设计部署是设计成只有一个副本。 对于这种情况,有一个pod中断预算,其中为在Kubernetes中运行的应用程序设置了max_unavailable和min_available。 如果要始终至少有1个副本,请设置min_available = 1。
有2个副本,开始部署,1个副本死亡,剩下1个。在副本所在的计算机上,管理员启动kubectl排放节点。 从理论上讲,Kubernetes应该开始删除此活动副本并将其传输到另一个节点。 但是豆荚破坏预算有效。 Kubernetes对管理员说:抱歉,副本位于此处,如果我们删除副本,将违反Pod中断预算。 智能排放节点在超时到期之前挂起并尝试使该节点漂移。 如果部署完成并且两个副本都可用,则将显示此节点上的副本。


在MegaSlerme,我将展示一套完整的规则,允许我在咖啡馆中喝咖啡,而Kubernetes集群通过重新启动所有节点进行更新。


我关于Slurm的主题:


  • 介绍Kubernetes,关键组件
  • 集群设备,主要组件,容错能力,k8s网络
  • 高级Kubernetes抽象
  • 记录与监控

我在MegaSlerme上的主题


  • 内部故障转移群集过程
  • 使用外部提供程序的集群授权
  • 集群中的安全和高可用性应用程序
  • 实施除RollingUpdate以外的部署策略
  • Kubernetes的故障排除

Source: https://habr.com/ru/post/zh-CN425217/


All Articles