5.8 Pod中断预算

尽管Deployment或ReplicaSet一类的控制器能够确保相应的Pod对象的副本数量不断逼近期望的数量,但它却无法保证某一时刻一定会存在指定数量或比例的Pod对象,然而这种需求在某些强调服务可用性的场景中却是必备的。于是,Kubernetes自1.4版本起开始引入Pod中断预算(PodDisruptionBudget,简称PDB)类型的资源,用于为那些资源(Voluntary)中断做好预算方案(Budget),限制可自愿中断的最大Pod副本数或确保最少可用的Pod副本数,以确保服务的高可用性。

Pod对象会一直存在,除非有意将其销毁,或者出现了不可避免的硬件或系统软件错误。非自愿中断是指那些由不可控外界因素导致的Pod中断退出操作,例如,硬件或系统内核故障、网络故障以及节点资源不足导致Pod对象被驱逐等;而那些由用户特地执行的管理操作导致的Pod中断则称为“自愿中断”,例如排空节点、人为删除Pod对象、由更新操作触发的Pod对象重建等。部署在Kubernetes的每个应用程序都可以创建一个对应的PDB对象以限制自愿中断时最大可以中断的副本数或者最少应该保持可用的副本数,从而保证应用自身的高可用性。

PDB资源可以用来保护由控制器管理的应用,此时几乎必然意味着PDB使用等同于相关控制器对象的标签选择器以精确关联至目标Pod对象,支持的控制器类型包括Deployment、ReplicaSet和StatefulSet等。同时,PDB对象也可以用来保护那些纯粹是由定制的标签选择器自由选择的Pod对象。

定义PDB资源时,其spec字段主要嵌套使用以下三个字段。

  • selector <Object>:当前PDB对象使用的标签选择器,一般是与相关Pod控制器使用同一个选择器。
  • minAvailable <string>:Pod自愿中断的场景中,至少要保证可用的Pod对象数量或比例,要阻止任何Pod对象发生自愿中断,可将其设置为100%。
  • maxUnavailable <string>:Pod自愿中断的场景中,最多可转换为不可用状态的Pod对象数量或比例,0值意味着不允许Pod对象进行自愿中断;此字段与minAvailable互斥。

下面的示例定义了一个PDB对象,它对5.3.1节中由Deployment控制器myapp-deploy创建的Pod对象设置了Pod中断预算,要求其最少可用的Pod对象数量为2个:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: myapp

PDB资源对象创建完成后,在它的简要信息输出中也标明了最少可用的Pod对象个数,以及允许中断的Pod对象个数:

**[terminal]
**[delimiter $ ]**[command kubectl get pdb]
NAME        MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
myapp-pdb   2               N/A               1                     12s

接下来可通过手动删除myapp-deploy控制器下的所有Pod对象模拟自愿中断过程,并监控各Pod对象被终止的过程来验证PDB资源对象的控制功效。

results matching ""

    No results matching ""