Kubernetes群集的零停机更新-使用drain驱逐POD去维护NODE

标签: | 发表时间:2021-07-25 18:20 | 作者:
出处:https://mp.weixin.qq.com

原文标题:Zero Downtime Server Updates For Your Kubernetes Cluster

发布时间:Jan 26, 2019

原文链接:https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33

文章作者:yorinasub17

在Kubernetes集群的生命周期中,总会有某个时候,你需要对集群的宿主机节点进行维护。这可能包括程序包更新,内核升级或部署新的VM映像。在Kubernetes中,这些操作被视为“自愿中断”。

译注:参考Kubernetes对自愿中断和非自愿中断的定义

链接:https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#voluntary-and-involuntary-disruptions

这篇文章是一个分为四部分的博客系列的第一篇,下一篇文章会介绍如何优雅地关闭 Pod。

在这个系列中我们会介绍 Kubernetes 提供的所有用来实现 集群中工作节点的零宕机时间更新的工具。

问题说明

我们将从简单直接的维护宿主机节点的方法开始,确定该方法的挑战和潜在风险,并逐步构建解决我们在整个系列中发现的每个问题的方法。在这个博客系列结束时我们将完成一个Kubernetes配置,该配置利用生命周期钩子,就绪探针(redinessProbe)和 PodDisruptionBudgets 来实现 Kubernetes集群的零停机时间部署。

译注:推荐阅读「 Pod的活性探针和就绪探针

为了开始我们的旅程,让我们看一个具体的例子。假设我们有一个两节点的 Kubernetes 集群,集群上运行着一个使用了两个 Pod 和一个 Service 资源的应用程序。

现在的问题是我们要升级集群中两个宿主机节点的内核版本。我们将如何执行升级?简单粗暴的方法是使用更新的配置启动新节点,在启动新节点后关闭旧节点。尽管这种方法有效,但是这种方法存在一些问题:

  • 当关闭旧节点时,节点上的 Pod 也会被删除。如果 Pod 需要清理以正常关闭上面运行的应用程序该怎么办?底层的VM技术可能不会等待 Pod 执行清理过程。
  • 如果同时关闭所有节点怎么办?在将 Pod 重新启动到新节点中时,你的应用程序服务会短暂中断。

我们想要的是一种从旧节点上正常迁移 Pod 的方法,以确保在对节点进行更改时,没有任何工作负载在运行。或者,如示例中所述,如果要完全替换群集(例如替换VM镜像),我们希望将工作负载从旧节点移到新节点。在这两种情况下,我们都希望避免调度新的 Pod 到旧节点上,我们可以使用 kubectl drain命令来实现这一点。

把Pod调度到节点之外

排出操作( kubectl drain)实现了将所有 Pod 重新调度到节点之外的目的。在排出操作期间,该节点会被标记为不可调度(通过给节点添加 NoSchedule 污点实现)。这样可以防止新建的Pod被调度到节点上。之后,排出操作开始从节点上驱逐 Pod,通过将 TERM 信号发送到 Pod 的底层容器来关闭当前在节点上运行的容器。

尽管 kubectl drain将很好地处理将Pod 逐出节点的工作,但仍有两个因素可能会在 kubectl drain触发的操作运行期间导致服务中断:

  • 运行中的应用程序需要能够优雅地处理 TERM 信号,当一个 Pod 驱逐时,Kubernetes 会向 Pod 发送 TERM 信号,然后在强制终结容器前会等待一段时间让容器自己关闭,这个等待时间是可以配置的。但是,如果 Pod 里的应用程序不能优雅地处理 TERM 信号,则仍然会导致不干净地关闭 Pod,比如应用程序正在工作期间(例如提交数据库事务等)。
  • 应用程序将失去为其提供服务的所有 Pod 。在新节点上启动新容器时,您的服务会遭遇停机。

避免停机

为了最大程度地减少因维护集群等自愿性中断而导致的停机时间,Kubernetes 提供以下中断处理功能:

  • Graceful termination
  • Lifecycle hooks
  • PodDisruptionBudgets

本系列的其余部分中,我们将使用 Kubernetes 的这些功能来减轻驱逐事件造成的服务中断。为了使后续操作更容易,我们将在上面的示例中使用以下资源配置:

    ---      
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15
        ports:
        - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    targetPort: 80
    port: 80

上面的配置里包含了一个 Deployment 资源的最简示例,这个 Deployment 会始终维持集群中有两个标签为 app: nginx的 Pod,另外配置里还提供了一个可用于访问集群内 Nginx Pod 的 Service 资源的定义。

我们将在本系列的整个过程中逐步增加其内容,以构建最终配置,以实现Kubernetes提供的所有功能,最大程度地减少维护操作期间的停机时间。

下一篇文章,我们将会讲解如何利用 Kubernetes 的生命周期钩子(Lifecycle Hooks)来正常关闭 Pod。

推荐阅读

玩转Kubernetes滚动更新


相关 [kubernetes 更新 drain] 推荐:

Kubernetes群集的零停机更新-使用drain驱逐POD去维护NODE

- -
原文标题:Zero Downtime Server Updates For Your Kubernetes Cluster. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33.

Kubernetes:玩转 Pod 滚动更新

- - IT瘾-dev
今天推荐一篇关于Kubernetes上服务滚动更新相关的配置选项的文章,文章列出了最常用的几个配置项,解释了他们是怎么影响调度器对服务进行滚动更新的,同时还带出了 Kubernetes项目中 Pod这个逻辑单元的 Ready状态是怎么确定的,并不是容器运行起来后 Pod就进入 Ready状态的.

Kubernetes 集群零停机更新-使用preStop优雅关停POD

- -
原文标题:Gracefully Shutting Down Pods in a Kubernetes Cluster. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/zero-downtime-server-updates-for-your-kubernetes-cluster-902009df5b33.

Kubernetes & Microservice

- - 午夜咖啡
这是前一段时间在一个微服务的 meetup 上的分享,整理成文章发布出来. 谈微服务之前,先澄清一下概念. 微服务这个词的准确定义很难,不同的人有不同的人的看法. 比如一个朋友是『微服务原教旨主义者』,坚持微服务一定是无状态的 http API 服务,其他的都是『邪魔歪道』,它和 SOA,RPC,分布式系统之间有明显的分界.

Kubernetes 集群零停机更新-使用PDB保证最少可用POD数

- -
原文标题:Avoiding Outages in your Kubernetes Cluster using PodDisruptionBudgets. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/avoiding-outages-in-your-kubernetes-cluster-using-poddisruptionbudgets-ef6a4baa5085.

Kubernetes 集群零停机更新-增加preStop延迟实现POD摘流

- -
原文标题:Gracefully Shutting Down Pods in a Kubernetes Cluster. 发布时间:Jan 26, 2019. 原文链接:https://blog.gruntwork.io/delaying-shutdown-to-wait-for-pod-deletion-propagation-445f779a8304.

Kubernetes学习(Kubernetes踩坑记)

- - Z.S.K.'s Records
记录在使用Kubernetes中遇到的各种问题及解决方案, 好记性不如烂笔头. prometheus提示 /metrics/resource/v1alpha1 404. 原因: 这是因为[/metrics/resource/v1alpha1]是在v1.14中才新增的特性,而当前kubelet版本为1.13.

kubernetes移除Docker?

- -
两周前,Kubernetes在其最新的Changelog中宣布1.20之后将要弃用dockershime,也就说Kubernetes将不再使用Docker做为其容器运行时. 这一消息持续发酵,掀起了不小的波澜,毕竟Kubernetes+Docker的经典组合是被市场所认可的,大量企业都在使用. 看上去这个“弃用”的决定有点无厘头,那么为什么Kubernetes会做出这样的决定.

Kubernetes 完全教程

- - 午夜咖啡
经过一个阶段的准备,视频版本的 《Kubernetes 完全教程》出炉了. 课程一共分为七节,另外有一节 Docker 预备课,每节课大约一个多小时. 目标是让从没接触过 Kubernetes 的同学也能通过这个课程掌握 Kubernetes. 为什么要学习 Kubernetes. 在介绍课程之前,先说说为什么要学习 Kubernetes 以及什么人需要学习 Kubernetes.

Kubernetes 监控详解

- - DockOne.io
【编者的话】监控 Kubernetes 并不是件容易的事. 本文介绍了监控 Kubernetes 的难点、用例以及有关工具,希望可以帮助大家进一步了解监控 Kubernetes. 如果想要监控 Kubernetes,包括基础架构平台和正在运行的工作负载,传统的监控工具和流程可能还不够用. 就目前而言,监控 Kubernetes 并不是件容易的事.