渔业生产者 發表於 2019-6-7 08:40:00

kubernetes之PDB

<blockquote>
<p>系列目录</p>
</blockquote>
<p>上一节我们讲到了由于一些人为的或者不可避免的原因,pod可能会中断,而使用<code>Pod Disruption Budget</code>可以最大限度地保证在pod中断发生时集群仍然保持能够接受的状态.</p>
<p>一句话,PDB能够限制同时中断的pod的数量,以保证集群的高可用性.</p>
<h2 id="使用poddisruptionbudget来保护集群">使用PodDisruptionBudget来保护集群</h2>
<ol>
<li>
<p>确定你想要使用<code>PodDisruptionBudget (PDB)</code>来保护的集群</p>
</li>
<li>
<p>考虑集群如何影响中断</p>
</li>
<li>
<p>使用yaml文件创建PDB定义</p>
</li>
<li>
<p>使用yaml文件创建PDB对象</p>
</li>
</ol>
<h2 id="确定想要保护的应用对象">确定想要保护的应用对象</h2>
<p>最常见的要保护的对象是是以下kubernetes内置的controller创建的应用对象之一:</p>
<ul>
<li>Deployment</li>
<li>ReplicationController</li>
<li>ReplicaSet</li>
<li>StatefulSet</li>
</ul>
<h2 id="考虑集群如何响应中断">考虑集群如何响应中断</h2>
<p>决定在短时间内有多少个实例可能会被宕掉(由于自愿中断,前面一节我们讲到过何为自愿中断,非自愿中断不被PDB控制)</p>
<ul>
<li>无状态的前端</li>
</ul>
<p>关注点:服务能力不能减少超过10%</p>
<p>解决方案: 使用一个包含<code>minAvailable 90%</code>值的PDB</p>
<ul>
<li>单实例有状态应用</li>
</ul>
<p>关注点:不要在不知情情况下中断</p>
<p>可能的解决方案1:不使用PDB,容易偶尔的宕机</p>
<p>可能的解决方案2:使用PDB,设置<code>maxUnavailable=0</code>.当集群管理员想要终止pod的时候,他需要联系你,然后删除掉PDB以准备应对中断,然后重新创建.(如果maxUnavailable=0则不能进行自愿中断操作)</p>
<ul>
<li>多实例有状态应用,例如zookeeper,etcd,consul等</li>
</ul>
<p>关注点:运行的实例数不能低于法定数量</p>
<p>可能的解决方案1:把maxUnavailable to 1(根据不同集群要求不同,可以设置为不同的值)<br>
可能的解决方案2:把minAvailable设置为法定数量.</p>
<h2 id="指定一个poddisruptionbudget">指定一个PodDisruptionBudget</h2>
<p>一个PDB有三个字段:</p>
<ol>
<li>
<p>一个label选择器<code>.spec.selector</code>,用来指定要选择的pod集合,此为必选项</p>
</li>
<li>
<p><code>.spec.minAvailable</code>,在pod被驱离的情况下,必须保证的最小可用的pod数量.<code>minAvailable</code>可以是一个绝对数值或者一个百分数</p>
</li>
<li>
<p><code>.spec.maxUnavailable</code>(kubernetes 1.7以后版本),在发生驱离的情况下,最大的不可用副本的数量,值可以是绝对数值或者一个百分比.</p>
</li>
</ol>
<p>在一个PDB定义中,只能指定<code>minAvailable</code>或<code>maxUnavailable</code>其一.<code>maxUnavailable</code>中能用于有控制器控制的pod的驱离.</p>
<blockquote>
<p>maxUnavailable 值为 0% (或 0),或者minAvailable值为100%(或者与replicas的值相等)则会完全阻止pod驱离.</p>
</blockquote>
<p>以下示例的PDB会选择labels值包含<code>app: zookeeper</code>的pod</p>
<ul>
<li>使用<code>minAvailable</code>的示例</li>
</ul>
<pre><code class="language-yml">apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
    matchLabels:
      app: zookeeper
</code></pre>
<ul>
<li>使用<code>maxUnavailable</code>的示例</li>
</ul>
<pre><code class="language-yml">apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
maxUnavailable: 1
selector:
    matchLabels:
      app: zookeeper
</code></pre>
<p>例如以上<code>zk-pdb</code>对象选择了一个pod数量为3的有状态集合,上面两种定义意义完全相同,推荐使用<code>maxUnavailable</code></p>
<h2 id="创建pdb对象">创建PDB对象</h2>
<p>你可以使用<code>kubectl apply -f xxx.yaml</code>来创建一个PDB对象</p>
<blockquote>
<p>PDB对象不能被更新,你只能够删除它然后重新创建.</p>
</blockquote>
<h2 id="检测pdb的状态">检测PDB的状态</h2>
<p>使用kubectl来检测pdb是否被创建.</p>
<p>假设没有pod匹配<code>app: zookeeper</code>,你将会看到如下信息</p>
<pre><code class="language-bash">kubectl get poddisruptionbudgets
</code></pre>
<pre><code class="language-bash">NAME      MIN-AVAILABLE   ALLOWED-DISRUPTIONS   AGE
zk-pdb    2               0                     7s
</code></pre>
<p>如果有匹配的pod(比如说3个),则你看到的信息将类似如下</p>
<pre><code class="language-bash">kubectl get poddisruptionbudgets
</code></pre>
<pre><code class="language-bash">NAME      MIN-AVAILABLE   ALLOWED-DISRUPTIONS   AGE
zk-pdb    2               1                     7s
</code></pre>
<p><code>ALLOWED-DISRUPTIONS</code>值不为0意味着中断控制器已经发现pod,计算了匹配的pod数量,然后更新了PDB的状态</p>
<p>你可以使用以下命令获取更多PDB的状态信息</p>
<pre><code class="language-bash">kubectl get poddisruptionbudgets zk-pdb -o yaml
</code></pre>
<pre><code class="language-yml">apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
creationTimestamp: 2017-08-28T02:38:26Z
generation: 1
name: zk-pdb
...
status:
currentHealthy: 3
desiredHealthy: 3
disruptedPods: null
disruptionsAllowed: 1
expectedPods: 3
observedGeneration: 1
</code></pre><br><br>
来源:https://www.cnblogs.com/tylerzhou/p/10987576.html
頁: [1]
查看完整版本: kubernetes之PDB