1.pdb介绍

当我们对某工作节点执行drain操作的时候,会立即把该worker上运行的pod立即删除,然后在其他节点上创建对应的pod。

比如有一个名字为web1的deploy,有6个副本,worker1和worker2上各运行了3个副本。现在如果对worker1执行drain操作的话,会立即删除worker1上的3个pod,然后在worker2上创建。但是如果pod的创建速度比较慢的话,那么此时整个环境里只有3个pod对外提供工作了。

那么如何确保在对worker执行drain操作的时候,保证pod必须以一个指定的数目的副本数运行呢?此时可以利用pdb (PodDisruptionBudget)实现。

2.实验环境

pdb基于命名空间,只对指定的pod生效。
本实验环境如下:

kubernetes版本:1.24.2
master:  vms71.rhce.cc
worker1: vms72.rhce.cc
worker2: vms73.rhce.cc

先创建一个名字为web1的deploy,共有2个副本,pod名及所在节点如下显示。

[root@vms71 ~]# kubectl get pods -l app=web1 -owide
NAME                 READY   STATUS  RESTARTS      AGE     IP       NODE
web1-55bcbb879f-lk8qd   1/1     Running   0     21s   10.244.5.222   vms72.rhce.cc
web1-55bcbb879f-sx8qz   1/1     Running   0     21s   10.244.88.31   vms73.rhce.cc
[root@vms71 ~]#

这两个pod的标签为app=web1。

3.创建pdb

确保当前命名空间不存在pdb。

[root@vms71 ~]# kubectl get pdb
No resources found in chap3-pod namespace.
[root@vms71 ~]#

创建pdb的yaml文件,内容如下。

[root@vms71 ~]# cat mypdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:name: mypdb
spec:minAvailable: 2selector:matchLabels:app: web1
[root@vms71 ~]#

这里创建一个的pdb名字为mypdb,应用在app=web1的那些pod上。
这里minAvailable的意思是,在驱逐pod时,最低要保证有2个pod在运行,这里除了可以写具体数值,也可以写一个百分比。
除了minAvailable参数之外,还有maxUnavailable可用。

创建这个pdb。

[root@vms71 ~]# kubectl apply -f mypdb.yaml
poddisruptionbudget.policy/mypdb created
[root@vms71 ~]#
[root@vms71 ~]# kubectl get pdb
NAME    MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
mypdb   0               N/A               2                     4s
[root@vms71 ~]#

4.测试

对vms72执行drain操作,驱逐运行在vms72上的pod。

[root@vms71 ~]# kubectl drain vms72.rhce.cc --ignore-daemonsets  --delete-emptydir-data
node/vms72.rhce.cc cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-np499, kube-system/kube-proxy-hb8tg
evicting pod kube-system/metrics-server-9d5bbf85c-jvs85
evicting pod chap3-pod/web1-55bcbb879f-lk8qd
evicting pod kube-system/calico-kube-controllers-56cdb7c587-6t7pl
error when evicting pods/"web1-55bcbb879f-lk8qd" -n "chap3-pod" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
pod/calico-kube-controllers-56cdb7c587-6t7pl evicted
pod/metrics-server-9d5bbf85c-jvs85 evicted
evicting pod chap3-pod/web1-55bcbb879f-lk8qd
error when evicting pods/"web1-55bcbb879f-lk8qd" -n "chap3-pod" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
evicting pod chap3-pod/web1-55bcbb879f-lk8qd
error when evicting pods/"web1-55bcbb879f-lk8qd" -n "chap3-pod" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
evicting pod chap3-pod/web1-55bcbb879f-lk8qd
error when evicting pods/"web1-55bcbb879f-lk8qd" -n "chap3-pod" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
evicting pod chap3-pod/web1-55bcbb879f-lk8qd
error when evicting pods/"web1-55bcbb879f-lk8qd" -n "chap3-pod" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
^C
[root@vms71 ~]#

这里会不停的显示报错,意思是没法驱逐pod web1-55bcbb879f-lk8qd(运行在vms72上)。为什么呢?因为所谓evicting,就是先删除pod web1-55bcbb879f-lk8qd,然后再其他节点上重新创建一个pod。但是一旦删除了此pod的话,那么就达不到pdb里规定的至少同时有2个pod状态为running。

现在查看pod的情况。

[root@vms71 ~]# kubectl get pods -owide
NAME            READY   STATUS    RESTARTS   AGE   IP       NODE
web1-55bcbb879f-lk8qd   1/1   Running   0   93s   10.244.5.222   vms72.rhce.cc
web1-55bcbb879f-sx8qz   1/1   Running   0   93s   10.244.88.31   vms73.rhce.cc
[root@vms71 ~]#

可以看到web1-55bcbb879f-lk8qd仍然是在vms72上运行的。

修改mypdb.yaml的内容。

[root@vms71 ~]# cat mypdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:name: mypdb
spec:minAvailable: 1selector:matchLabels:app: web1
[root@vms71 ~]#

这里把minAvailable的值改为了1,让修改生效。

[root@vms71 ~]# kubectl apply -f mypdb.yaml
poddisruptionbudget.policy/mypdb configured
[root@vms71 ~]#

再次对vms72执行drain操作。

[root@vms71 ~]# kubectl drain vms72.rhce.cc --ignore-daemonsets  --delete-emptydir-data
node/vms72.rhce.cc cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-np499, kube-system/kube-proxy-hb8tg
evicting pod chap3-pod/web1-55bcbb879f-lk8qd
pod/web1-55bcbb879f-lk8qd evicted
node/vms72.rhce.cc drained
[root@vms71 ~]#

可以看到现在没有任何报错信息了,因为删除web1-55bcbb879f-lk8qd之后,还有web1-55bcbb879f-sx8qz在运行,满足了pdb的要求,至少有一个pod为running。

查看pod状态。

[root@vms71 ~]# kubectl get pods -owide
NAME          READY   STATUS    RESTARTS   AGE     IP            NODE
web1-55bcbb879f-4qlgq   1/1     Running   0   5s      10.244.88.34   vms73.rhce.cc
web1-55bcbb879f-sx8qz   1/1     Running   0   2m49s   10.244.88.31   vms73.rhce.cc
[root@vms71 ~]#

此时pod已经去切换到了vms73上了。

对工作节点执行drain操作时,通过pdb保护pod副本数相关推荐

  1. SSM框架下对信息执行修改操作时的信息弹窗回显以及对信息修改后对数据库的更新问题

    SSM框架下对信息执行修改操作时的信息弹窗回显以及对信息修改后的同步问题 概括 主要说一下前端的实现 概括 今天在做实训作业时,有个对数据信息进行修改的操作,要求点击修改按钮后弹出修改框,栏目中需要显 ...

  2. 如何设置可以使计算机在10分钟没有任何操作时启动屏幕保护程序?,Win10设置屏幕保护程序,不用鼠标或键盘一定时长,禁止进入系统...

    1989年10月30日,中国青少年发展基金会作出决定:设立救助贫困地区失学少年基金会.这项命名为"希望工程"的救助活动,将长期资助我国贫困地区品学兼优而又因家庭困难失学的孩子重新获 ...

  3. 使用SQL数据库在Python中执行CRUD操作

    目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 安装Python包 "Pypyodbc" 创建连接文件 创 ...

  4. 无法对多重选择区域执行此操作

    当你在excel中进行简单的复制.粘贴,却跳出一个让你怀疑人生的错误"无法对多重选择区域执行此操作"时,千万不要放弃治疗,因为真的不是你的操作问题. 如果你是用"offi ...

  5. TensorFlow实践(15)——使用tf.device方法指定节点执行设备

    TensorFlow实践(15)--使用tf.device方法指定节点执行设备 (一)前 言 (二)tf.device方法指定节点执行设备 (三)总 结 (一)前 言 当我们调用sess.run()方 ...

  6. 使用DaemonSet定制AKS工作节点

    很多时候我们需要在AKS (Azure Kubernetes Service)工作节点上运行支持软件,例如,恶意软件扫描程序,Policy Enforcer等.目前AKS的工作节点只能使用云平台指定的 ...

  7. 要求jQuery在执行某些操作之前等待所有图像加载的官方方式

    在jQuery中,当您执行以下操作时: $(function() {alert("DOM is loaded, but images not necessarily all loaded&q ...

  8. 您可能不知道可以使用Chrome开发者控制台执行的操作

    by Swagat Kumar Swain 由Swagat Kumar Swain 您可能不知道可以使用Chrome开发者控制台执行的操作 (Things you probably didn't kn ...

  9. 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配

    在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态. 网上有文章指出,解决这个问题的方法是在设备管理器中启动"Microsoft托管网络虚拟 ...

  10. 如何在项目启动时就执行某些操作

    参考资料:如何在项目启动时就执行某些操作 在实际的项目开发中经常会遇到一些需要在项目启动的时候进行初始化操作的需求,比如初始化线程池,配置某些对象的序列化和反序列化方式,加载黑名单白名单,加载权限应用 ...

最新文章

  1. 今天新开通cnblogs,就说几句,留作纪念。
  2. python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...
  3. putty连虚拟机中Linux出现Access Denied
  4. 【Python基础入门系列】第04天:Python 流程控制
  5. Samba远程代码执行漏洞(CVE-2017-7494)复现
  6. dw二级联动下拉菜单插件 宋君墨_Excel下拉菜单不会做?15秒教会你制作一二三级联动下拉菜单,从此做表不求人!...
  7. 修ecshop品牌筛选以LOGO图片形式显示
  8. Caffe学习:Layers
  9. Centos解决ppp: compressor dropped pkt
  10. python 基础语法梳理(二)
  11. 一些J2EE WEB应用架构分析
  12. python大作业数据_python 爬虫初探和简单数据分析及可视化,帮学妹写个大作业...
  13. 32.filter表案例 nat表应用 (iptables)
  14. 别踩白块儿java代码_Javascript别踩白块儿(钢琴块儿)小游戏实现代码
  15. mac下安装破解版adobe photoshop cs6
  16. Kubernetes之Service
  17. 【其他】【RQNOJ】吉祥数
  18. 间隔层设备和过程层简介
  19. 替代3DJ6和3DG6的场效应管和三极管
  20. 视频教程-EXCEL VBA编程(excel办公高手必经之路)-Office/WPS

热门文章

  1. python PyEnchant(检查拼写)
  2. 神农班和我的2020年总结
  3. # 冰冻三尺非一日之寒。
  4. 计算机无法识别u盘,电脑无法识别U盘怎么办?简单搞定
  5. xctf攻防世界 CRYPTO高手进阶区 best_rsa
  6. 【Leetcode刷题篇】leetcode739 每日温度
  7. 60Echarts - 饼图(Texture on Pie Chart)
  8. 电脑可以连接手机热点,却无法连路由器无线wifi
  9. linux逻辑卷管理的创建过程,LVM-逻辑卷管理器创建过程for linux
  10. 关于iCloud的注册,到代码的实现