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-RUNTIMEmaster 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.8node01 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.8node02 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=linuxkubernetes.io/arch=amd64kubernetes.io/hostname=masterkubernetes.io/os=linuxnode-role.kubernetes.io/master=Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.socknode.alpha.kubernetes.io/ttl: 0projectcalico.org/IPv4Address: 192.168.20.2/24projectcalico.org/IPv4IPIPTunnelAddr: 10.100.219.64volumes.kubernetes.io/controller-managed-attach-detach: trueCreationTimestamp: Sun, 14 Jun 2020 03:05:10 +0800 # 集群创建时间Taints: node-role.kubernetes.io/master:NoSchedule # 节点污点度,此处保证了master节点不被调度,node节点上此处为noneUnschedulable: falseLease:HolderIdentity: masterAcquireTime: <unset>RenewTime: Sun, 21 Jun 2020 16:36:18 +0800Conditions: # 先决条件,接下来内容较多,这里不展开聊,在下面详聊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 nodeMemoryPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasSufficientMemory kubelet has sufficient memory availableDiskPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasNoDiskPressure kubelet has no disk pressurePIDPressure False Sun, 21 Jun 2020 16:32:11 +0800 Sun, 14 Jun 2020 03:05:07 +0800 KubeletHasSufficientPID kubelet has sufficient PID availableReady True Sun, 21 Jun 2020 16:32:11 +0800 Sun, 21 Jun 2020 11:33:24 +0800 KubeletReady kubelet is posting ready statusAddresses:InternalIP: 192.168.20.2Hostname: masterCapacity:cpu: 2ephemeral-storage: 51175Mihugepages-2Mi: 0memory: 3062668Kipods: 110Allocatable:cpu: 2ephemeral-storage: 48294789041hugepages-2Mi: 0memory: 2960268Kipods: 110System Info: # 系统相关版本信息Machine ID: caa6eb0d160246d39e7c615ab7f61304System UUID: 083E4D56-E7AC-8724-DCA6-6433F7C03980Boot ID: d692e022-e3ab-46de-bdcf-2f43dfa76cc0Kernel Version: 4.4.227-1.el7.elrepo.x86_64OS Image: CentOS Linux 7 (Core)Operating System: linuxArchitecture: amd64Container Runtime Version: docker://19.3.8Kubelet Version: v1.18.3Kube-Proxy Version: v1.18.3PodCIDR: 10.100.0.0/24PodCIDRs: 10.100.0.0/24Non-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%) 7d13hkube-system calico-node-899zv 250m (12%) 0 (0%) 0 (0%) 0 (0%) 4h35mkube-system coredns-546565776c-9lsxk 100m (5%) 0 (0%) 70Mi (2%) 170Mi (5%) 7d13hkube-system coredns-546565776c-9qxwh 100m (5%) 0 (0%) 70Mi (2%) 170Mi (5%) 7d13hkube-system etcd-master 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13hkube-system kube-apiserver-master 250m (12%) 0 (0%) 0 (0%) 0 (0%) 7d13hkube-system kube-controller-manager-master 200m (10%) 0 (0%) 0 (0%) 0 (0%) 7d13hkube-system kube-proxy-hkbtk 0 (0%) 0 (0%) 0 (0%) 0 (0%) 7d13hkube-system kube-scheduler-master 100m (5%) 0 (0%) 0 (0%) 0 (0%) 7d13hAllocated 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 的资源总数。
