Skip to main content

Command Palette

Search for a command to run...

Node 重伤之后

Updated
2 min read

很多人都知道 Kubernetes 能自动维护失效 Pod、防止服务中断、剔除故障节点 BLABLA 的一堆高大上功能。但节点故障之后,会对运行在故障节点上的容器、以及依赖容器的服务造成什么影响,是应该了解的,这样才能有针对性的进行监控设置、部署安排、故障处理等工作。

水平有限,这里不谈原理,只说说症状和一些相关的调整。

测试环境

  • Kubernetes 1.7.10,三节点,其中 Master 节点被 Taint.
    • 10.211.55.11(Master)
    • 10.211.55.12
    • 10.211.55.13
  • CentOS 7
  • Docker 1.12.3

实验设计

Docker、Kubelet 以及 Kube-Proxy 是 Node 的标准组件,我们准备一个 2 Replicas 的 Deployment 作为测试目标,使用 NodePort 方式暴露 HTTP 端口。具体代码见附录。

使用 systemctl 关停目标服务,使用 watch -n5 kubectl get pods,nodes,deploy 以及 watch -n5 kubectl "describe svc httpbin | grep -i endp" 命令持续检查相关工作负载的情况。同时可以使用 curl 命令检查服务是否存活。

Kube-Proxy

选择登录一个节点,例如 10.211.55.12,使用 kubectl stop kube-proxy 关闭之后可以看到,各个 kubectl get 命令返回结果都正常,似乎未受影响;然而使用 curl 进行逐个节点的 NodePort 进行验证的时候,会发现停掉 Proxy 的地址是无法提供服务的。

监控

除了监控进程/服务之外,Kube-Proxy 还提供了几个可以用于监控的参数

  • --healthz-bind-address:健康检测地址和端口,缺省为 0.0.0.0:10256
  • --healthz-port:健康检测端口,缺省 10256,设置为 0 则关闭。

curl http://127.0.0.1:10256/healthz | jq 会看到返回的健康数据:

{
  "lastUpdated": "2017-12-19 16:05:27.333531431 +0800 CST",
  "currentTime": "2017-12-19 16:05:33.73732624 +0800 CST"
}

--- --metrics-bind-address 用于提供监控指标的地址和端口,缺省为 127.0.0.1:10249,返回内容可用于 Prometheus。例如:curl -s http://127.0.0.1:10249/metrics | more会看到:

......

HELP http_request_size_bytes The HTTP request sizes in bytes.

TYPE http_request_size_bytes summary

http_request_size_bytes{handler="prometheus",quantile="0.5"} 64 http_request_size_bytes{handler="prometheus",quantile="0.9"} 64 http_request_size_bytes{handler="prometheus",quantile="0.99"} 64 http_request_size_bytes_sum{handler="prometheus"} 192 http_request_size_bytes_count{handler="prometheus"} 3 ......

Kubelet

Kubelet 情况比 kube-proxy 复杂一些。

  1. 首先使用kubectl get po -o wide,确认 Pod 所在节点。
  2. 使用systemctl stop kubelet停止 kubelet 服务。
  3. 观察

首先我们会看到,经过约半分钟以后,该节点变为NotReady状态。Deploy 对象的 Available 字段数字会减 1,服务的Endpoints列表减少一个。;但是 Pod 状态保持在Running

五分钟左右,Pod 进入Unknown状态,开始尝试启动新 Pod。

存活检测和就绪检测

测试中我们使用的 yaml 中并没有设置这两个内容,事实上,这两个检测是由 kubelet 执行的,对上述行为并无影响。

参数调整

真正影响上面的行为的是kube-controller-manager的两个参数:

  • --pod-eviction-timeout:缺省为 5m,五分钟,在 Pod 驱逐行为的超时时间。
  • --node-monitor-grace-period:缺省为 40s,也就是 40 秒,无响应 Node 在标记为 NotReady 之前的等候时间。

监控

  • --healthz-bind-address:健康监测地址,缺省为127.0.0.1
  • --healthz-port:健康检测端口,缺省为 10248。

curl 访问该地址,会得到响应:ok

另外如果使用kube-metrics exporter进行集群监控,可以关注 RC、Deploy 等对象的可用实例数量。

Docker

Docker 的情况其实跟 Kubelet 类似,但是结果会更严重:在 Endpoint 被排除之前,路由到故障节点的流量会发生故障。

测试之外

  1. 多 Pod 不仅对性能有好处,在极端情况下能降低故障节点对服务整体效果的影响。
  2. 建议采用节点互斥的方式进行部署。
  3. 对关键组件的监控,应该建立从进程到指标的多级监控,减小服务故障的时间窗口。
  4. Pod 的存活和健康监测,对于容器内的应用是有效的,应该推荐。

附录

workload.yaml


apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  ports:
  - name: http
    port: 80
    nodePort: 30080
  selector:
    app: httpbin
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpbin-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      containers:
      - image: httpd
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts