date: 2020-06-21title: k8s节点状态查询及分析 #标题
tags: k8s节点状态 #标签
categories: k8s # 分类
Kubernetes中节点(node)指的是一个工作机器,不同的集群中,节点可能是虚拟机也可能是物理机。每个节点都由 master 组件管理,并包含了运行Pod(容器组)所需的服务。
这些服务包括:
- 容器引擎
- kubelet
- kube-proxy
- fannel或calico(网络组件)
节点状态
节点的状态包含如下信息:
- Addresses
- Conditions
- Capacity and Allocatable
- Info
查询节点状态相关指令
$ kubectl get nodes -o wide # 查询节点列表信息
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
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
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
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
$ kubectl describe node master # 查询某个节点的详细信息
Name: master # 主机名
Roles: master # 集群角色
Labels: beta.kubernetes.io/arch=amd64 # 所拥有的标签
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=master
kubernetes.io/os=linux
node-role.kubernetes.io/master=
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
projectcalico.org/IPv4Address: 192.168.20.2/24
projectcalico.org/IPv4IPIPTunnelAddr: 10.100.219.64
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Sun, 14 Jun 2020 03:05:10 +0800 # 集群创建时间
Taints: node-role.kubernetes.io/master:NoSchedule # 节点污点度,此处保证了master节点不被调度,node节点上此处为none
Unschedulable: false
Lease:
HolderIdentity: master
AcquireTime: <unset>
RenewTime: Sun, 21 Jun 2020 16:36:18 +0800
Conditions: # 先决条件,接下来内容较多,这里不展开聊,在下面详聊
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
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
MemoryPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Sun, 21 Jun 2020 16:32:11 +0800 Sun, 21 Jun 2020 11:33:24 +0800 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 192.168.20.2
Hostname: master
Capacity:
cpu: 2
ephemeral-storage: 51175Mi
hugepages-2Mi: 0
memory: 3062668Ki
pods: 110
Allocatable:
cpu: 2
ephemeral-storage: 48294789041
hugepages-2Mi: 0
memory: 2960268Ki
pods: 110
System Info: # 系统相关版本信息
Machine ID: caa6eb0d160246d39e7c615ab7f61304
System UUID: 083E4D56-E7AC-8724-DCA6-6433F7C03980
Boot ID: d692e022-e3ab-46de-bdcf-2f43dfa76cc0
Kernel Version: 4.4.227-1.el7.elrepo.x86_64
OS Image: CentOS Linux 7 (Core)
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://19.3.8
Kubelet Version: v1.18.3
Kube-Proxy Version: v1.18.3
PodCIDR: 10.100.0.0/24
PodCIDRs: 10.100.0.0/24
Non-terminated Pods: (9 in total) # pod总量及各个pod详细资源状况
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system calico-kube-controllers-5b8b769fcd-ll67c 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13h
kube-system calico-node-899zv 250m (12%) 0 (0%) 0 (0%) 0 (0%) 4h35m
kube-system coredns-546565776c-9lsxk 100m (5%) 0 (0%) 70Mi (2%) 170Mi (5%) 7d13h
kube-system coredns-546565776c-9qxwh 100m (5%) 0 (0%) 70Mi (2%) 170Mi (5%) 7d13h
kube-system etcd-master 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13h
kube-system kube-apiserver-master 250m (12%) 0 (0%) 0 (0%) 0 (0%) 7d13h
kube-system kube-controller-manager-master 200m (10%) 0 (0%) 0 (0%) 0 (0%) 7d13h
kube-system kube-proxy-hkbtk 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13h
kube-system kube-scheduler-master 100m (5%) 0 (0%) 0 (0%) 0 (0%) 7d13h
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 1 (50%) 0 (0%)
memory 140Mi (4%) 340Mi (11%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
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 的资源总数。