date: 2020-06-21title: k8s节点状态查询及分析 #标题
tags: k8s节点状态 #标签
categories: k8s # 分类

Kubernetes中节点(node)指的是一个工作机器,不同的集群中,节点可能是虚拟机也可能是物理机。每个节点都由 master 组件管理,并包含了运行Pod(容器组)所需的服务。

这些服务包括:

  • 容器引擎
  • kubelet
  • kube-proxy
  • fannel或calico(网络组件)

节点状态

节点的状态包含如下信息:

  • Addresses
  • Conditions
  • Capacity and Allocatable
  • Info

查询节点状态相关指令

  1. $ kubectl get nodes -o wide # 查询节点列表信息
  2. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
  3. master Ready master 7d13h v1.18.3 192.168.20.2 <none> CentOS Linux 7 (Core) 4.4.227-1.el7.elrepo.x86_64 docker://19.3.8
  4. node01 Ready <none> 7d13h v1.18.3 192.168.20.3 <none> CentOS Linux 7 (Core) 4.4.227-1.el7.elrepo.x86_64 docker://19.3.8
  5. node02 Ready <none> 7d13h v1.18.3 192.168.20.4 <none> CentOS Linux 7 (Core) 4.4.227-1.el7.elrepo.x86_64 docker://19.3.8
  6. $ kubectl describe node master # 查询某个节点的详细信息
  7. Name: master # 主机名
  8. Roles: master # 集群角色
  9. Labels: beta.kubernetes.io/arch=amd64 # 所拥有的标签
  10. beta.kubernetes.io/os=linux
  11. kubernetes.io/arch=amd64
  12. kubernetes.io/hostname=master
  13. kubernetes.io/os=linux
  14. node-role.kubernetes.io/master=
  15. Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
  16. node.alpha.kubernetes.io/ttl: 0
  17. projectcalico.org/IPv4Address: 192.168.20.2/24
  18. projectcalico.org/IPv4IPIPTunnelAddr: 10.100.219.64
  19. volumes.kubernetes.io/controller-managed-attach-detach: true
  20. CreationTimestamp: Sun, 14 Jun 2020 03:05:10 +0800 # 集群创建时间
  21. Taints: node-role.kubernetes.io/master:NoSchedule # 节点污点度,此处保证了master节点不被调度,node节点上此处为none
  22. Unschedulable: false
  23. Lease:
  24. HolderIdentity: master
  25. AcquireTime: <unset>
  26. RenewTime: Sun, 21 Jun 2020 16:36:18 +0800
  27. Conditions: # 先决条件,接下来内容较多,这里不展开聊,在下面详聊
  28. Type Status LastHeartbeatTime LastTransitionTime Reason Message
  29. ---- ------ ----------------- ------------------ ------ -------
  30. NetworkUnavailable False Sun, 21 Jun 2020 12:01:18 +0800 Sun, 21 Jun 2020 12:01:18 +0800 CalicoIsUp Calico is running on this node
  31. MemoryPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
  32. DiskPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
  33. PIDPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
  34. Ready True Sun, 21 Jun 2020 16:32:11 +0800 Sun, 21 Jun 2020 11:33:24 +0800 KubeletReady kubelet is posting ready status
  35. Addresses:
  36. InternalIP: 192.168.20.2
  37. Hostname: master
  38. Capacity:
  39. cpu: 2
  40. ephemeral-storage: 51175Mi
  41. hugepages-2Mi: 0
  42. memory: 3062668Ki
  43. pods: 110
  44. Allocatable:
  45. cpu: 2
  46. ephemeral-storage: 48294789041
  47. hugepages-2Mi: 0
  48. memory: 2960268Ki
  49. pods: 110
  50. System Info: # 系统相关版本信息
  51. Machine ID: caa6eb0d160246d39e7c615ab7f61304
  52. System UUID: 083E4D56-E7AC-8724-DCA6-6433F7C03980
  53. Boot ID: d692e022-e3ab-46de-bdcf-2f43dfa76cc0
  54. Kernel Version: 4.4.227-1.el7.elrepo.x86_64
  55. OS Image: CentOS Linux 7 (Core)
  56. Operating System: linux
  57. Architecture: amd64
  58. Container Runtime Version: docker://19.3.8
  59. Kubelet Version: v1.18.3
  60. Kube-Proxy Version: v1.18.3
  61. PodCIDR: 10.100.0.0/24
  62. PodCIDRs: 10.100.0.0/24
  63. Non-terminated Pods: (9 in total) # pod总量及各个pod详细资源状况
  64. Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
  65. --------- ---- ------------ ---------- --------------- ------------- ---
  66. kube-system calico-kube-controllers-5b8b769fcd-ll67c 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13h
  67. kube-system calico-node-899zv 250m (12%) 0 (0%) 0 (0%) 0 (0%) 4h35m
  68. kube-system coredns-546565776c-9lsxk 100m (5%) 0 (0%) 70Mi (2%) 170Mi (5%) 7d13h
  69. kube-system coredns-546565776c-9qxwh 100m (5%) 0 (0%) 70Mi (2%) 170Mi (5%) 7d13h
  70. kube-system etcd-master 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13h
  71. kube-system kube-apiserver-master 250m (12%) 0 (0%) 0 (0%) 0 (0%) 7d13h
  72. kube-system kube-controller-manager-master 200m (10%) 0 (0%) 0 (0%) 0 (0%) 7d13h
  73. kube-system kube-proxy-hkbtk 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13h
  74. kube-system kube-scheduler-master 100m (5%) 0 (0%) 0 (0%) 0 (0%) 7d13h
  75. Allocated resources:
  76. (Total limits may be over 100 percent, i.e., overcommitted.)
  77. Resource Requests Limits
  78. -------- -------- ------
  79. cpu 1 (50%) 0 (0%)
  80. memory 140Mi (4%) 340Mi (11%)
  81. ephemeral-storage 0 (0%) 0 (0%)
  82. hugepages-2Mi 0 (0%) 0 (0%)
  83. Events: <none>

接下来,对上面输出的不易懂部分进行展开解释。

Conditions

Conditions 描述了节点的状态。具体如下:

Node Condition 描述
NetworkUnvailable 如果节点的网络配置有问题,则该字段为 True,否则为 False
DiskPressure 如果节点磁盘空间紧张,则该字段为 True,否则为 False
PIDPressure 如果节点上进程过多,则该字段为 True,否则为 False
MemoryPressure 如果节点内存紧张,则该字段为 True,否则为False
Ready 如果节点是健康的且已经就绪可以接受新的 Pod。则节点Ready字段为 True。False表明了该节点不健康,不能够接受新的 Pod。

如果 Ready 类型Condition 的 status 持续为 Unkown 或者 False 超过 pod-eviction-timeout(kube-controller-manager的参数)所指定的时间,节点控制器(node controller)将对该节点上的所有 Pod 执行删除的调度动作。默认的 pod-eviction-timeout 时间是 5 分钟。某些情况下(例如,节点网络故障),apiserver 不能够与节点上的 kubelet 通信,删除 Pod 的指令不能下达到该节点的 kubelet 上,直到 apiserver 与节点的通信重新建立,指令才下达到节点。这意味着,虽然对 Pod 执行了删除的调度指令,但是这些 Pod 可能仍然在失联的节点上运行。

在 kubernetes v1.5 以前,节点控制器将从 apiserver 强制删除这些失联节点上的 Pod。在 v1.5 及以后的版本中,节点控制器将不会强制删除这些 Pod,直到已经确认他们已经停止运行为止。你可能会发现失联节点上的 Pod 仍然在运行(在该节点上执行 docker ps 命令可查看容器的运行状态),然而 apiserver 中,他们的状态已经变为 Terminating 或者 Unknown。

在 Kubernetes v1.12 中,TaintNodesByCondition 特性进入 beta 阶段,此时 node lifecycle controller 将自动创建该 Condition 对应的 污点。相应地,调度器在选择合适的节点时,不再关注节点的 Condition,而是检查节点的污点和 Pod 的容忍。

Capacity and Allocatable(容量和可分配量)

容量和可分配量描述了节点上的可用资源的情况:

  • CPU
  • 内存
  • 该节点可调度的最大 pod 数量

Capacity 中的字段表示节点上的资源总数,Allocatable 中的字段表示该节点上可分配给普通 Pod 的资源总数。