10.5 了解Statefulset如何处理节点失效

在10.2.4节中,我们阐述了Kubernetes必须完全保证:一个有状态pod在创建它的代替者之前已经不再运行,当一个节点突然失效,Kubernetes并不知道节点或者它上面的pod的状态。它并不知道这些pod是否还在运行,或者它们是否还存在,甚至是否还能被客户端访问到,或者仅仅是Kubelet停止向主节点上报本节点状态。

因为一个Statefulset要保证不会有两个拥有相同标记和存储的pod同时运行,当一个节点似乎失效时,Statefulset在明确知道一个pod不再运行之前,它不能或者不应该创建一个替换pod。

只有当集群的管理者告诉它这些信息的时候,它才能明确知道。为了做到这一点,管理者需要删除这个pod,或者删除整个节点(这么做会删除所有调度到该节点上的pod)。

作为这一章中的最后一个练习,你会看到当一个集群节点网络断开后,Statefulset和节点上的pod都会发生些什么。

10.5.1 模拟一个节点的网络断开

与第4章中一致,可以通过关闭节点的eth0网络接口来模拟节点的网络断开。因为这个例子需要多个节点,所以不能在Minikube上运行,可以使用谷歌的Kubernetes引擎来运行。

关闭节点的网络适配器

为了关闭一个节点的网络接口,需要通过ssh登录一个节点:

$ gcloud compute ssh gke-kubia-default-pool-32a2csc8-m0g1

然后在节点内部运行如下命令:

$ sudo ifconfig eth0 down

之后你的ssh链接就会中断,所以需要开启一个新的终端来继续执行。

通过Kubernetes管理节点检查节点的状态

当这个节点的网络接口关闭以后,运行在这个节点上的Kubelet服务就无法与Kubernetes API服务器通信,无法汇报本节点和上面的pod都在正常运行。

过了一段时间后,控制台就会标记该节点状态为NotReady。如下面的代码清单所示,当列出节点时可以看到这些。

代码清单10.12 观察到一个失效的节点状态变为NotReady

$ kubectl get node

因为控制台不会再收到该节点发送的状态更新,该节点上面的所有pod状态都会变为Unknown。如下面的代码清单所示,列举pod信息就可以看到。

代码清单10.13 观察到节点变为NotReady后,其上的pod状态就会改变

$ kubectl get po

正如你看到的这样,kubia-0 pod的状态不再已知,这是因为你关闭了这个pod之前运行(也许正在运行)的节点的网络接口。

当一个pod状态为Unknow时会发生什么

若该节点过段时间正常连通,并且重新汇报它上面的pod状态,那这个pod就会重新被标记为Runing。但如果这个pod的未知状态持续几分钟后(这个时间是可以配置的),这个pod就会自动从节点上驱逐。这是由主节点(Kubernetes的控制组件)处理的。它通过删除pod的资源来把它从节点上驱逐。

当Kubelet发现这个pod被标记为删除状态后,它开始终止运行该pod。在上面的示例中,Kubelet已不能与主节点通信(因为你断开了这个节点的网络),这也就意味着这个pod会一直运行着。

让我们解释一下当前的状况。通过kubectl describe命令查看kubia-0 pod的详细信息,如下面的代码清单所示。

代码清单10.14 显示未知状态的pod的详情

$ kubectl describe po kubia-0

可以看到这个pod的状态为Terminating,原因是NodeLost。在信息中说明的是节点不回应导致的不可达。

注意 这里展示的是控制组件看到的信息。实际上这个pod对应的容器并被没有被终止,还在正常运行。

10.5.2 手动删除pod

你已经明确这个节点不会再回来,但是所有处理客户端请求的三个pod都必须是正常运行的。所以需要把kubia-0 pod重新调度到一个健康的节点上。如之前提到的那样,需要手动删除整个节点或者这个pod。

正常删除pod

使用你一直使用的方式删除该pod:

$ kubectl delete po kubia-0

是不是所有的都做完了?删除pod后,Statefulset应该会立刻创建一个替换的pod,这个pod会被调度到剩下可用的节点上。再次列举pod信息来确认:

$ kubectl get po

非常奇怪,你刚刚删除了这个pod,kubectl也返回说它已经被删除。那为什么这个pod还在呢?

注意 列表中的kubia-0 pod不是一个有相同名字的新pod,在从它的AGE列中就可以看出。如果它是一个新pod,它的“年龄”只会是几秒钟。

为什么pod没有被删除

在删除pod之前,这个pod已经被标记为删除。这是因为控制组件已经删除了它(把它从节点驱逐)。

如果再次检查一下代码清单10.14,可以看出这个pod的状态是Terminating。这个pod之前已经被标记为删除,只要它所在节点上的Kubelet通知API服务器说这个pod的容器已经终止,那么它就会被清除掉。但是因为这个节点上的网络断开了,所以上述情况永远不会发生。

强制删除pod

现在你唯一可以做的是告诉API服务器不用等待kubelet来确认这个pod已经不再运行,而是直接删除它。可以按照下面所述执行:

$ kubectl delete po kubia-0 --force --grace-period 0

你需要同时使用--force和--grace-period 0两个选项。然后kubectl会对你做的事情发出警告信息。如果你再次列举pod,就可以看到一个新的kubia-0 pod被创建出来:

$ kubectl get po

警告 除非你确认节点不再运行或者不会再可以访问(永远不会再可以访问),否则不要强制删除有状态的pod。

在继续操作之前,你可能希望把之前断掉连接的节点恢复正常。可以通过GCE web控制台或在一个终端上执行下面的命令来重启该节点:

$ gcloud compute instances reset <node name>

Statefulset处理节点失效原理相关推荐

  1. ocos2d-x Win32下的节点缩放原理研究心得

    [2.1.0]Cocos2d-x Win32下的节点缩放原理研究心得 [复制链接]     火星熊猫 19 主题 2 听众 489 积分 版主 收听TA 发消息 电梯直达 楼主   发表于 2013- ...

  2. 《电子基础与维修工具核心教程》——2.6 节点分压原理

    本节书摘来自异步社区<电子基础与维修工具核心教程>一书中的第2章,第2.6节,作者: 田佰涛 更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.6 节点分压原理 ...

  3. kubernetes node节点失效 调度

    kubernetes 配置: 测试node挂 机,发布需要等几分才会 在其它 的node机器 启动,这个明显不合理,对于大多数业务 kube-controller-manager配置: /etc/sy ...

  4. ignite 2.11.0 节点发现原理及源码分析

    ignite 2.11.0 节点发现原理 节点发现介绍 环形拓扑 节点加入过程 概述 创建连接 TcpDiscoveryJoinRequestMessage TcpDiscoveryNodeAdded ...

  5. 深入理解Redis主键失效原理及实现机制

    2019独角兽企业重金招聘Python工程师标准>>> 作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids也不例外.在Redis提供的诸多命令中, EXP ...

  6. redis 缓存失效原理

    原文出处:点击打开链接 对于缓存失效,不同的缓存有不同的处理机制,可以说是大同中有小异,作者通过对Redis 文档与相关源码的仔细研读,为大家详细剖析了 Redis 的缓存过期/失效机制相关的技术原理 ...

  7. cocos子节点转父节点坐标 原理浅析(局部坐标转世界坐标同理)

    在CCNode的类中,有一个得到 一个节点坐标系转换父亲坐标系的一个矩阵,节点内坐标乘以这个矩阵,就可以转换为在节点父节点中的坐标,方法名为: Mat4& Node::getNodeToPar ...

  8. 实例验证WEB浏览器智能应对节点失效

    转载于:https://blog.51cto.com/zoukejian/57226

  9. Mysql索引失效原理与最左匹配原则

    索引的底层是一颗B+树,那么联合索引当然还是一颗B+树,只不过联合索引的健值数量不是一个,而是多个.构建一颗B+树只能根据一个值来构建,因此数据库依据联合索引最左的字段来构建B+树. 例子:假如创建一 ...

最新文章

  1. Linux学习命令汇总三——Linux用户组管理,文件权限管理,文本搜索命令grep及正则表达式...
  2. 用createinstallmedia创建可恢复的OSX安装DMG
  3. oracle if函数变量,Oracle数据库——PL/SQL编程
  4. python变量作用域 for_python变量作用域
  5. 3638MySQL数据库应用答案_Mysql数据库多实例配置
  6. SAP ui5 jQuery.sap.getModulePath(FioriTest)
  7. java面试常见面试问题_Java面试准备:15个Java面试问题
  8. 一文教你掌握 ZooKeeper 核心知识
  9. 详解Object.defineProperty
  10. WebSocket剖析
  11. python路径规划算法可视化_路径规划问题:DIJKSTRA算法 以及Python实现
  12. php聊天室禁止提交,phpcms v9禁止提交信息到官网方法详解
  13. html鼠标滑动代码,jQuery鼠标滚动设置input的值代码
  14. 小霸王被申请破产重整;虎牙员工自曝被HR抬出公司;Office 2010被微软终止服务|极客头条
  15. 初探Windows用户态调试机制
  16. 微信小程序项目开发--打卡签到
  17. 尚硅谷Javase项目一(家庭收支记账软件)
  18. windows 远程桌面连接 bat
  19. php图形验证码验证,php图片验证码代码
  20. 嵌入式设备NFS挂载目录(基于iTop 4412)

热门文章

  1. java 报警系统_GitHub - Shadow-Java/alert-system: 嵌入式-图像检测自动报警系统
  2. 【零成本 超详细】Win10环境安装宝塔面板教程
  3. MHDD官方使用教程
  4. 马云的996言论存在三大谬论 是一种洗脑文化
  5. ubuntu卸载g2o库
  6. SQL中CharIndex函数、InStr 函数、PatIndex函数、Stuff函数区别与作用
  7. avast! for linux/unix servers,最常见的Linux/Unix监控工具vmstat命令详解
  8. 分享你的Crypto资源:基于DPDK的Virtio-Crypto运算资源虚拟化方案
  9. 英语学习-29190410雅思图表作文写作--line grapgh
  10. 回收站数据恢复:回收站不见了?无法打开回收站?