Kubernetes—集群故障排查

news/2025/3/15 7:46:03/

列举集群节点

调试的第一步是查看所有的节点是否都已正确注册。

运行以下命令:

kubectl get nodes

验证你所希望看见的所有节点都能够显示出来,并且都处于 Ready 状态。

为了了解你的集群的总体健康状况详情,你可以运行:

kubectl cluster-info dump

示例:调试关闭/无法访问的节点

有时在调试时查看节点的状态很有用 —— 例如,因为你注意到在节点上运行的 Pod 的奇怪行为, 或者找出为什么 Pod 不会调度到节点上。与 Pod 一样,你可以使用 kubectl describe node 和 kubectl get node -o yaml 来检索有关节点的详细信息。 例如,如果节点关闭(与网络断开连接,或者 kubelet 进程挂起并且不会重新启动等), 你将看到以下内容。请注意显示节点为 NotReady 的事件,并注意 Pod 不再运行(它们在 NotReady 状态五分钟后被驱逐)。

kubectl get nodes
NAME                     STATUS       ROLES     AGE     VERSION
kube-worker-1            NotReady     <none>    1h      v1.23.3
kubernetes-node-bols     Ready        <none>    1h      v1.23.3
kubernetes-node-st6x     Ready        <none>    1h      v1.23.3
kubernetes-node-unaj     Ready        <none>    1h      v1.23.3
kubectl describe node kube-worker-1
Name:               kube-worker-1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64beta.kubernetes.io/os=linuxkubernetes.io/arch=amd64kubernetes.io/hostname=kube-worker-1kubernetes.io/os=linux
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.socknode.alpha.kubernetes.io/ttl: 0volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Thu, 17 Feb 2022 16:46:30 -0500
Taints:             node.kubernetes.io/unreachable:NoExecutenode.kubernetes.io/unreachable:NoSchedule
Unschedulable:      false
Lease:HolderIdentity:  kube-worker-1AcquireTime:     <unset>RenewTime:       Thu, 17 Feb 2022 17:13:09 -0500
Conditions:Type                 Status    LastHeartbeatTime                 LastTransitionTime                Reason              Message----                 ------    -----------------                 ------------------                ------              -------NetworkUnavailable   False     Thu, 17 Feb 2022 17:09:13 -0500   Thu, 17 Feb 2022 17:09:13 -0500   WeaveIsUp           Weave pod has set thisMemoryPressure       Unknown   Thu, 17 Feb 2022 17:12:40 -0500   Thu, 17 Feb 2022 17:13:52 -0500   NodeStatusUnknown   Kubelet stopped posting node status.DiskPressure         Unknown   Thu, 17 Feb 2022 17:12:40 -0500   Thu, 17 Feb 2022 17:13:52 -0500   NodeStatusUnknown   Kubelet stopped posting node status.PIDPressure          Unknown   Thu, 17 Feb 2022 17:12:40 -0500   Thu, 17 Feb 2022 17:13:52 -0500   NodeStatusUnknown   Kubelet stopped posting node status.Ready                Unknown   Thu, 17 Feb 2022 17:12:40 -0500   Thu, 17 Feb 2022 17:13:52 -0500   NodeStatusUnknown   Kubelet stopped posting node status.
Addresses:InternalIP:  192.168.0.113Hostname:    kube-worker-1
Capacity:cpu:                2ephemeral-storage:  15372232Kihugepages-2Mi:      0memory:             2025188Kipods:               110
Allocatable:cpu:                2ephemeral-storage:  14167048988hugepages-2Mi:      0memory:             1922788Kipods:               110
System Info:Machine ID:                 9384e2927f544209b5d7b67474bbf92bSystem UUID:                aa829ca9-73d7-064d-9019-df07404ad448Boot ID:                    5a295a03-aaca-4340-af20-1327fa5dab5cKernel Version:             5.13.0-28-genericOS Image:                   Ubuntu 21.10Operating System:           linuxArchitecture:               amd64Container Runtime Version:  containerd://1.5.9Kubelet Version:            v1.23.3Kube-Proxy Version:         v1.23.3
Non-terminated Pods:          (4 in total)Namespace                   Name                                 CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age---------                   ----                                 ------------  ----------  ---------------  -------------  ---default                     nginx-deployment-67d4bdd6f5-cx2nz    500m (25%)    500m (25%)  128Mi (6%)       128Mi (6%)     23mdefault                     nginx-deployment-67d4bdd6f5-w6kd7    500m (25%)    500m (25%)  128Mi (6%)       128Mi (6%)     23mkube-system                 kube-proxy-dnxbz                     0 (0%)        0 (0%)      0 (0%)           0 (0%)         28mkube-system                 weave-net-gjxxp                      100m (5%)     0 (0%)      200Mi (10%)      0 (0%)         28m
Allocated resources:(Total limits may be over 100 percent, i.e., overcommitted.)Resource           Requests     Limits--------           --------     ------cpu                1100m (55%)  1 (50%)memory             456Mi (24%)  256Mi (13%)ephemeral-storage  0 (0%)       0 (0%)hugepages-2Mi      0 (0%)       0 (0%)
Events:
...
kubectl get node kube-worker-1 -o yaml
apiVersion: v1
kind: Node
metadata:annotations:kubeadm.alpha.kubernetes.io/cri-socket: /run/containerd/containerd.socknode.alpha.kubernetes.io/ttl: "0"volumes.kubernetes.io/controller-managed-attach-detach: "true"creationTimestamp: "2022-02-17T21:46:30Z"labels:beta.kubernetes.io/arch: amd64beta.kubernetes.io/os: linuxkubernetes.io/arch: amd64kubernetes.io/hostname: kube-worker-1kubernetes.io/os: linuxname: kube-worker-1resourceVersion: "4026"uid: 98efe7cb-2978-4a0b-842a-1a7bf12c05f8
spec: {}
status:addresses:- address: 192.168.0.113type: InternalIP- address: kube-worker-1type: Hostnameallocatable:cpu: "2"ephemeral-storage: "14167048988"hugepages-2Mi: "0"memory: 1922788Kipods: "110"capacity:cpu: "2"ephemeral-storage: 15372232Kihugepages-2Mi: "0"memory: 2025188Kipods: "110"conditions:- lastHeartbeatTime: "2022-02-17T22:20:32Z"lastTransitionTime: "2022-02-17T22:20:32Z"message: Weave pod has set thisreason: WeaveIsUpstatus: "False"type: NetworkUnavailable- lastHeartbeatTime: "2022-02-17T22:20:15Z"lastTransitionTime: "2022-02-17T22:13:25Z"message: kubelet has sufficient memory availablereason: KubeletHasSufficientMemorystatus: "False"type: MemoryPressure- lastHeartbeatTime: "2022-02-17T22:20:15Z"lastTransitionTime: "2022-02-17T22:13:25Z"message: kubelet has no disk pressurereason: KubeletHasNoDiskPressurestatus: "False"type: DiskPressure- lastHeartbeatTime: "2022-02-17T22:20:15Z"lastTransitionTime: "2022-02-17T22:13:25Z"message: kubelet has sufficient PID availablereason: KubeletHasSufficientPIDstatus: "False"type: PIDPressure- lastHeartbeatTime: "2022-02-17T22:20:15Z"lastTransitionTime: "2022-02-17T22:15:15Z"message: kubelet is posting ready status. AppArmor enabledreason: KubeletReadystatus: "True"type: ReadydaemonEndpoints:kubeletEndpoint:Port: 10250nodeInfo:architecture: amd64bootID: 22333234-7a6b-44d4-9ce1-67e31dc7e369containerRuntimeVersion: containerd://1.5.9kernelVersion: 5.13.0-28-generickubeProxyVersion: v1.23.3kubeletVersion: v1.23.3machineID: 9384e2927f544209b5d7b67474bbf92boperatingSystem: linuxosImage: Ubuntu 21.10systemUUID: aa829ca9-73d7-064d-9019-df07404ad448

查看日志

目前,深入挖掘集群需要登录相关机器。以下是相关日志文件的位置。 在基于 systemd 的系统上,你可能需要使用 journalctl 而不是检查日志文件。

控制平面节点

  • /var/log/kube-apiserver.log —— API 服务器,负责提供 API 服务
  • /var/log/kube-scheduler.log —— 调度器,负责制定调度决策
  • /var/log/kube-controller-manager.log —— 运行大多数 Kubernetes 内置控制器的组件,除了调度(kube-scheduler 处理调度)。

工作节点

  • /var/log/kubelet.log —— 负责在节点运行容器的 kubelet 所产生的日志
  • /var/log/kube-proxy.log —— 负责将流量转发到服务端点的 kube-proxy 所产生的日志

集群故障模式

这是可能出错的事情的不完整列表,以及如何调整集群设置以缓解问题。

故障原因

  • 虚拟机关闭
  • 集群内或集群与用户之间的网络分区
  • Kubernetes 软件崩溃
  • 持久存储(例如 GCE PD 或 AWS EBS 卷)的数据丢失或不可用
  • 操作员错误,例如配置错误的 Kubernetes 软件或应用程序软件

具体情况

  • API 服务器所在的 VM 关机或者 API 服务器崩溃
    • 结果
      • 不能停止、更新或者启动新的 Pod、服务或副本控制器
      • 现有的 Pod 和服务在不依赖 Kubernetes API 的情况下应该能继续正常工作
  • API 服务器的后端存储丢失
    • 结果
      • kube-apiserver 组件未能成功启动并变健康
      • kubelet 将不能访问 API 服务器,但是能够继续运行之前的 Pod 和提供相同的服务代理
      • 在 API 服务器重启之前,需要手动恢复或者重建 API 服务器的状态
  • Kubernetes 服务组件(节点控制器、副本控制器管理器、调度器等)所在的 VM 关机或者崩溃
    • 当前,这些控制器是和 API 服务器在一起运行的,它们不可用的现象是与 API 服务器类似的
    • 将来,这些控制器也会复制为多份,并且可能不在运行于同一节点上
    • 它们没有自己的持久状态
  • 单个节点(VM 或者物理机)关机
    • 结果
      • 此节点上的所有 Pod 都停止运行
  • 网络分裂
    • 结果
      • 分区 A 认为分区 B 中所有的节点都已宕机;分区 B 认为 API 服务器宕机 (假定主控节点所在的 VM 位于分区 A 内)。
  • kubelet 软件故障
    • 结果
      • 崩溃的 kubelet 就不能在其所在的节点上启动新的 Pod
      • kubelet 可能删掉 Pod 或者不删
      • 节点被标识为非健康态
      • 副本控制器会在其它的节点上启动新的 Pod
  • 集群操作错误
    • 结果
      • 丢失 Pod 或服务等等
      • 丢失 API 服务器的后端存储
      • 用户无法读取 API
      • 等等

缓解措施

  • 措施:对于 IaaS 上的 VM,使用 IaaS 的自动 VM 重启功能

    • 缓解:API 服务器 VM 关机或 API 服务器崩溃
    • 缓解:Kubernetes 服务组件所在的 VM 关机或崩溃
  • 措施: 对于运行 API 服务器和 etcd 的 VM,使用 IaaS 提供的可靠的存储(例如 GCE PD 或者 AWS EBS 卷)

    • 缓解:API 服务器后端存储的丢失
  • 措施:使用高可用性的配置

    • 缓解:主控节点 VM 关机或者主控节点组件(调度器、API 服务器、控制器管理器)崩溃
      • 将容许一个或多个节点或组件同时出现故障
    • 缓解:API 服务器后端存储(例如 etcd 的数据目录)丢失
      • 假定你使用了高可用的 etcd 配置
  • 措施:定期对 API 服务器的 PD 或 EBS 卷执行快照操作

    • 缓解:API 服务器后端存储丢失
    • 缓解:一些操作错误的场景
    • 缓解:一些 Kubernetes 软件本身故障的场景
  • 措施:在 Pod 的前面使用副本控制器或服务

    • 缓解:节点关机
    • 缓解:kubelet 软件故障
  • 措施:应用(容器)设计成容许异常重启

    • 缓解:节点关机
    • 缓解:kubelet 软件故障

http://www.ppmy.cn/news/710065.html

相关文章

荣耀v8 android8,荣耀8/V8在列! 荣耀两年前老机型开始推送Android 8.0

原标题&#xff1a;荣耀8/V8在列&#xff01; 荣耀两年前老机型开始推送Android 8.0 在年初公布了EMUI 8.0升级计划之后&#xff0c;荣耀今天向最后四款产品推送了EMUI 8.0系统升级。 从今天开始&#xff0c;荣耀8、荣耀V8、荣耀Note 8以及荣耀畅玩6X用户将可以在会员服务App里…

荣耀7刷机android8,荣耀V8升级EMUI5.0+Android7.0

想要让你的华为荣耀V8升级到最新的EMUI5.0Android7.0系统&#xff0c;你有两种方式。一是乖乖的加入内测&#xff0c;申请资格等待推送即可&#xff1b;二是使用泄漏包&#xff0c;将其刷入到你的荣耀V8手机中。 EMUI5.0 荣耀V8内测适配机型&#xff1a; 荣耀V8移动定制版(KNT-…

V8 是什么?

V8 是什么&#xff1f; V8 是一个由 Google 开源的高性能 JavaScript 和 WebAssembly 引擎&#xff0c;其源代码使用 C 编写。V8 被用于 Google 的开源浏览器 Chrome 中&#xff0c;同时也被用于 Node.js&#xff0c;以及其他一些软件中。V8 实现了 ECMAScript 和 WebAssembly…

荣耀v8手机空间清理

保存照片在两个目录下面都会存在&#xff08;在甚至默认存储情况下面&#xff09; 内部存储-》tencent->MicroMsg->WeiXin 里面保存图片和视频 MicroMsg 下面一长串数字目录&#xff0c;保存视频和图片 相机图片整理&#xff1a; DICM里的camera 或者内存卡里面的came…

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

机器学习技术(二)——Python科学运算模块(Numpy、Pandas)

机器学习技术&#xff08;二&#xff09;——Python科学运算模块&#xff08;Numpy、Pandas&#xff09; 文章目录 机器学习技术&#xff08;二&#xff09;——Python科学运算模块&#xff08;Numpy、Pandas&#xff09;一、Numpy1、介绍、安装与导入2、Numpy常用操作 二、Pan…

华为mate40和mate40pro的区别?哪个好?

华为Mate40和Mate40Pro配备一块1080P OLED全面屏&#xff0c;刷新率自然是不低。不同的是Pro版本为了实现真全面屏&#xff0c;因为真全面屏无法与曲面边框同时实现&#xff0c;所有这次将瀑布屏给砍掉了。 华为手机爆降800太给力了&#xff1a;https://www.huawei.com/ 华为…

【LInux】简单进度条程序的编写

在进行进度条的程序的编写之前&#xff0c;还有几个问题需要解决。 第一个问题&#xff0c;先来看两段代码&#xff1a; 对比上面两段代码只有一个\n的区别。 左边的代码很简单&#xff0c;就是先打印&#xff0c;然后停顿 3 秒&#xff0c;程序退出。 主要问题是&#xff0c;…