小佰恩 發表於 2025-12-29 12:57:00

k8s~Kubernetes PDB

<p>在Kubernetes(k8s)中,<code>PodDisruptionBudget</code>(PDB)是一种资源对象,用于限制在<strong>自愿中断</strong>(voluntary disruptions)期间同时终止的Pod数量,从而保障应用的可用性。以下是详细说明:</p>
<hr>
<h2 id="我们为deployment配置了pdbpoddisruptionbudget目的是在自愿中断如节点维护升级时保证一定数量的pod副本可用但是pdb并不影响非自愿中断如节点故障资源不足导致的驱逐因此测试pdb功能是否生效我们需要模拟自愿中断的场景">我们为Deployment配置了PDB(PodDisruptionBudget),目的是在自愿中断(如节点维护、升级)时,保证一定数量的Pod副本可用。但是,PDB并不影响非自愿中断(如节点故障、资源不足导致的驱逐)。因此,测试PDB功能是否生效,我们需要模拟自愿中断的场景。</h2>
<h3 id="poddisruptionbudget-的作用"><strong>PodDisruptionBudget 的作用</strong></h3>
<ol>
<li>
<p><strong>核心目标</strong></p>
<ul>
<li>确保在<strong>主动运维操作</strong>(如节点排水、集群升级、自动缩容等)时,应用始终有指定数量的Pod保持运行。</li>
<li>防止因同时终止过多Pod导致服务不可用。</li>
</ul>
</li>
<li>
<p><strong>适用场景</strong></p>
<ul>
<li>节点维护(<code>kubectl drain</code>)</li>
<li>集群自动扩缩容(如Cluster Autoscaler)</li>
<li>控制器(如Deployment)的滚动更新<strong>不适用</strong>(PDB仅针对非控制器触发的终止)。</li>
</ul>
</li>
<li>
<p><strong>关键字段 <code>spec.minAvailable</code></strong></p>
<ul>
<li><strong>定义</strong>:指定必须保持可用的Pod的最小数量(或百分比)。</li>
<li><strong>示例</strong>:<pre><code class="language-yaml">spec:
minAvailable: 2# 绝对数值
# 或
minAvailable: "50%"# 百分比形式
</code></pre>
</li>
<li><strong>行为</strong>:当用户或系统尝试终止Pod时,Kubernetes会确保至少<code>minAvailable</code>个Pod处于运行状态。如果违反此约束,操作会被拒绝。</li>
</ul>
</li>
<li>
<p><strong>其他相关字段</strong></p>
<ul>
<li><code>maxUnavailable</code>(与<code>minAvailable</code>二选一):允许不可用的Pod的最大数量(或百分比)。<pre><code class="language-yaml">spec:
maxUnavailable: 1# 最多允许1个Pod不可用
</code></pre>
</li>
</ul>
</li>
</ol>
<hr>
<h3 id="使用注意事项"><strong>使用注意事项</strong></h3>
<ol>
<li><strong>选择器(Selector)</strong><br>
PDB通过<code>selector</code>匹配Pod,需确保与目标Pod的标签一致:<pre><code class="language-yaml">selector:
matchLabels:
    app: my-app
</code></pre>
</li>
</ol>
<p>注意:deployment中的选择器也是这个,它们是一个的,上面的<code>my-app</code>并不是deployment的name</p>
<pre><code>spec:
   selector:
   matchLabels:
       app: my-app
</code></pre>
<ol start="2">
<li>
<p><strong>与控制器协作</strong></p>
<ul>
<li>PDB不控制Pod的创建/删除,需配合Deployment、StatefulSet等使用。</li>
<li>例如:设置<code>minAvailable: 1</code>确保Deployment的Pod至少有一个始终可用。</li>
</ul>
</li>
<li>
<p><strong>资源冲突</strong></p>
<ul>
<li>若<code>minAvailable</code>值过大(如超过副本数),可能导致节点无法排水(需手动调整)。</li>
</ul>
</li>
<li>
<p><strong>非自愿中断</strong></p>
<ul>
<li>PDB仅对<strong>自愿中断</strong>生效(如节点排水)。硬件故障、OOM Kill等非自愿中断不受PDB约束。</li>
</ul>
</li>
</ol>
<hr>
<h3 id="示例配置"><strong>示例配置</strong></h3>
<pre><code class="language-yaml">apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: "50%"# 至少50%的Pod保持可用
selector:
    matchLabels:
      app: hello
---

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 3
selector:
    matchLabels:
      deployment: hello# ← 查找标签为deployment=hello的Pod
template:
    metadata:
      labels:
      deployment: hello# ← 创建Pod时给它打上deployment=hello标签
    spec:
      containers:
      - name: nginx
      image: nginx:1.14.2
</code></pre>
<hr>
<h3 id="总结"><strong>总结</strong></h3>
<ul>
<li><strong><code>minAvailable</code></strong>:是PDB的核心字段,直接定义应用的高可用底线。</li>
<li><strong>适用性</strong>:适合有状态服务或对可用性敏感的无状态服务。</li>
<li><strong>平衡</strong>:需根据业务需求在“可维护性”和“可用性”之间权衡(如设置过高可能导致维护困难)。</li>
</ul>


</div>
<div id="MySignature" role="contentinfo">
    <p></p>
<div class="navgood">
<p>作者:仓储大叔,张占岭,<br>
荣誉:微软MVP<br>QQ:853066980</p>

<p><strong>支付宝扫一扫,为大叔打赏!</strong>
<br><img src="https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG"></p>
</div><br><br>
来源:https://www.cnblogs.com/lori/p/19415251
頁: [1]
查看完整版本: k8s~Kubernetes PDB