forK8SPod保护前言在Kubernetes中,为了保证业务不中断或业务SLA降级,需要将应用部署在集群中。通过PodDisruptionBudget控制器,可以设置处于运行状态的应用POD集群的最小数量,也可以设置处于运行状态的应用POD集群的最小百分比,从而保证应用POD在主动销毁时,太多的应用POD不会被一次性销毁,以保证服务不中断或服务SLA不降级。PodDisruptionBudget简介PodDisruptionBudget(pod中断预算)简称PDB,其实就是在终止pod之前通过labelSelector机制限制正常运行的pod数量。目的是防止自愿中断。Kubernetesversion>=1.7仅支持PodDisruptionBudgetPDB应用场景节点维护或升级(kubectldrain)注意:如果Node状态未就绪,PDB不会生效,因为PDB只有主动中断才能生效。下面介绍什么是自愿中断。自愿和非自愿中断[1]Pod不会消失,直到有人(人或控制器)破坏它们,或者发生不可避免的硬件或系统软件错误。我们将这些不可避免的情况称为应用程序的非自愿中断。例如:后端节点硬件故障物理机集群管理员误删除虚拟机(实例)cloudprovider或hypervisor故障使虚拟机消失内核崩溃(kernelpanic)由于节点ContainerEvictedforInsufficient导致集群网络分区导致节点从集群中消失资源除了资源不足的情况外,以下情况对于大多数用户来说应该很熟悉;它们不是特定于Kubernetes的。我们称这些情况为自愿中断。包括应用程序所有者发起的操作和集群管理员发起的操作。典型的应用程序所有者操作包括:删除管理pod的Deployment或其他控制器更新Deployment的pod模板导致pod重新启动直接删除pod(意外删除)集群管理员操作包括:清空节点以进行修复或升级。从集群中排出节点以缩小集群(了解集群自动缩放)。从节点中删除一个pod以允许其他pod使用该节点。这些动作可以由集群管理员直接执行,也可以由集群管理员或集群托管提供商自动执行。PDB关键参数及注意事项.spec.minAvailable:表示在主动中断的过程中,至少要保证可用Pod的数量或比例。spec.maxUnavailable:表示在主动中断的过程中,不可用Pod的最大数量或者上面的配置只能用来对应Deployment、RS、RC、StatefulSet的Pod。建议优先使用.spec.maxUnavailable。注意:.spec.minAvailable和.spec.maxUnavailable不能同时定义在同一个PDBObject中。前面提到,虽然在应用滚动更新时Pod的删除和不可用也是主动中断,但实际上滚动更新有自己的策略控制(marSurge和maxUnavailable),所以PDB不会干预这个过程。PDB只能保证主动中断期间的副本数。例如,.spec.minAvailable或.spec.maxUnavailable只是在evictpod过程中遇到的。这时候一个正常的Pod因为NodeDown突然挂掉了(非自愿中断),那么这个时候Pod的实际数量就少于PDB中需要的数量,所以PDB并不是万能的!在使用中,如果将.spec.minAvailable设置为100%或将.spec.maxUnavailable设置为0%,则意味着evictpod的过程将被完全阻塞(Deployment和StatefulSet的滚动更新除外)。PDB示例以下示例使用minAvailable参数:apiVersion:policy/v1beta1kind:PodDisruptionBudgetmetadata:name:nginx-pdbnamespace:defaultspec:minAvailable:2selector:matchLabels:app:nginx以下示例使用maxUnavailable参数:apiVersion:policy/indv1beta1kind:PodDisruptionBudgetmetadata:name:nginx-pdbnamespace:defaultspec:maxUnavailable:30%selector:matchLabels:app:nginx参考链接[1]https://jimmysong.io/kubernet...https://blog.csdn.net/horsefo...https://cloud.tencent.com/dev...本文由YP小站发表!
