在这个 Kubernetes 中,节点(Node) 是执行工作的机器,曾经叫做 minion 。 根据集群的实际情况
,节点可以是一个 虚拟机 或者是 物理机器。每个节点都包含于运行 pods 的必要服务,并由主控组件
管理。节点上的服务包括 容器运行时 、 Kubelet 和 kube-proxy .
以下内容来自 Kubernetes 官网,部分内容来自个人 Kubernetes 集群。
Node 是啥
Node 就是集群里面的机器,不然还能是啥?所以这章也就没啥好说的,和大部分的集群环境一样,会有一些基础的概念,比如节点的状态,节点的容量,节点资源分配等问题。这里直接看官网介绍就好了。
节点状态
每个节点的状态,会有以下几点内容:
我们查询一个节点的状态信息一般是用:
script1
| kubectl describe node <node_name>
|
这里,你要是不知道有哪些 node ,可以使用:
script
去查看这个 node 的名称。这里我们查询的 node 为 k8s-master:
script1
| kubectl describe node k8s-master
|
查询到的内容如下:
script1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| Name: k8s-master Roles: master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=k8s-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: 172.19.0.1/16 projectcalico.org/IPv4IPIPTunnelAddr: 10.108.82.192 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Mon, 13 Apr 2020 05:58:13 -0400 Taints: node-role.kubernetes.io/master:NoSchedule Unschedulable: false Lease: HolderIdentity: k8s-master AcquireTime: <unset> RenewTime: Sun, 19 Apr 2020 22:36:04 -0400 Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- NetworkUnavailable False Sun, 19 Apr 2020 22:13:07 -0400 Sun, 19 Apr 2020 22:13:07 -0400 CalicoIsUp Calico is running on this node MemoryPressure False Sun, 19 Apr 2020 22:32:50 -0400 Mon, 13 Apr 2020 05:58:10 -0400 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Sun, 19 Apr 2020 22:32:50 -0400 Mon, 13 Apr 2020 05:58:10 -0400 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Sun, 19 Apr 2020 22:32:50 -0400 Mon, 13 Apr 2020 05:58:10 -0400 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Sun, 19 Apr 2020 22:32:50 -0400 Thu, 16 Apr 2020 22:33:18 -0400 KubeletReady kubelet is posting ready status Addresses: InternalIP: 192.168.1.101 Hostname: k8s-master Capacity: cpu: 4 ephemeral-storage: 17394Mi hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3861364Ki pods: 110 Allocatable: cpu: 4 ephemeral-storage: 16415037823 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3758964Ki pods: 110 System Info: Machine ID: 089897d9310342a7b471b85150848676 System UUID: 71784D56-8D6F-D0BF-3E93-5E4DFDA9383B Boot ID: f736c8cc-193c-4fef-b19b-9c108ed985c5 Kernel Version: 3.10.0-1062.el7.x86_64 OS Image: CentOS Linux 7 (Core) Operating System: linux Architecture: amd64 Container Runtime Version: docker://19.3.8 Kubelet Version: v1.18.1 Kube-Proxy Version: v1.18.1 Non-terminated Pods: (10 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE --------- ---- ------------ ---------- --------------- ------------- --- kube-system calico-node-wxrwm 250m (6%) 0 (0%) 0 (0%) 0 (0%) 5d18h kube-system coredns-546565776c-ckczn 100m (2%) 0 (0%) 70Mi (1%) 170Mi (4%) 6d16h kube-system coredns-546565776c-dlxbn 100m (2%) 0 (0%) 70Mi (1%) 170Mi (4%) 6d16h kube-system etcd-k8s-master 0 (0%) 0 (0%) 0 (0%) 0 (0%) 6d16h kube-system kube-apiserver-k8s-master 250m (6%) 0 (0%) 0 (0%) 0 (0%) 6d16h kube-system kube-controller-manager-k8s-master 200m (5%) 0 (0%) 0 (0%) 0 (0%) 6d16h kube-system kube-proxy-x57vh 0 (0%) 0 (0%) 0 (0%) 0 (0%) 6d16h kube-system kube-scheduler-k8s-master 100m (2%) 0 (0%) 0 (0%) 0 (0%) 6d16h kubernetes-dashboard dashboard-metrics-scraper-dc6947fbf-hkwc7 0 (0%) 0 (0%) 0 (0%) 0 (0%) 6d15h kubernetes-dashboard kubernetes-dashboard-5d4dc8b976-z57zv 0 (0%) 0 (0%) 0 (0%) 0 (0%) 6d15h Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 1 (25%) 0 (0%) memory 140Mi (3%) 340Mi (9%) ephemeral-storage 0 (0%) 0 (0%) hugepages-1Gi 0 (0%) 0 (0%) hugepages-2Mi 0 (0%) 0 (0%) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Starting 23m kubelet, k8s-master Starting kubelet. Normal NodeHasSufficientMemory 23m (x8 over 23m) kubelet, k8s-master Node k8s-master status is now: NodeHasSufficientMemory Normal NodeHasNoDiskPressure 23m (x8 over 23m) kubelet, k8s-master Node k8s-master status is now: NodeHasNoDiskPressure Normal NodeHasSufficientPID 23m (x7 over 23m) kubelet, k8s-master Node k8s-master status is now: NodeHasSufficientPID Normal NodeAllocatableEnforced 23m kubelet, k8s-master Updated Node Allocatable limit across pods Normal Starting 23m kube-proxy, k8s-master Starting kube-proxy.
|
我们可以看到,在这个 节点的描述信息中,记录了当前节点的角色,标签,依赖等信息,同时还有各个命名空间的的一些基本信息,比如CPU的使用,内存的使用等信息。
Events
里面就是一些日志类的描述了。
在这个 节点状态 里面有几个东西:
地址 Address
这个地址可以看下,其实就是我们的本机的IP以及本机的HostName,比如这里的:
script1 2 3
| Addresses: InternalIP: 192.168.1.101 Hostname: k8s-master
|
条件 Conditions
script1 2 3 4 5 6 7 8
| Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- NetworkUnavailable False Sun, 19 Apr 2020 22:13:07 -0400 Sun, 19 Apr 2020 22:13:07 -0400 CalicoIsUp Calico is running on this node MemoryPressure False Sun, 19 Apr 2020 22:32:50 -0400 Mon, 13 Apr 2020 05:58:10 -0400 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Sun, 19 Apr 2020 22:32:50 -0400 Mon, 13 Apr 2020 05:58:10 -0400 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Sun, 19 Apr 2020 22:32:50 -0400 Mon, 13 Apr 2020 05:58:10 -0400 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Sun, 19 Apr 2020 22:32:50 -0400 Thu, 16 Apr 2020 22:33:18 -0400 KubeletReady kubelet is posting ready status
|
这里的条件就是当前所有的 Running
节点的状态,说明如下:
OutOfDisk
: True
表示节点的空闲空间不足以用于添加新 pods, 否则为 False
;
Ready
: 表示节点是健康的并已经准备好接受 pods
;False
表示节点不健康而且不能接受 pods
;Unknown
表示节点控制器在最近 40 秒内没有收到节点的消息;
MemoryPressure
: True
表示节点存在内存压力 – 即节点内存用量低,否则为 False
;
PIDPressure
: True
表示节点存在进程压力 – 即进程过多;否则为 False
;
DiskPressure
: True
表示节点存在磁盘压力 – 即磁盘可用量低,否则为 False
;
NetworkUnavailable
: True
表示节点网络配置不正确;否则为 False
.
节点条件使用一个JSON 对象表示:
1 2 3 4 5 6 7 8 9 10 11 12
| { "conditions": [ { "type": "Ready", "status": "True", "reason": "KubeletReady", "message": "kubelet is posting ready status", "lastHeartbeatTime": "2019-06-05T18:38:35Z", "lastTransitionTime": "2019-06-05T11:41:27Z" } ] }
|
如果说,Ready
的条件状态处于 Unknown
或者 False
的时间超过了 pod-eviction-timeout
(这是一个传递给 kube-controller-manager
的参数),节点上所有的 Pods 都会被节点控制器计划删除。默认时间是 5 min
。
在某些情况下,当节点不可访问的时候, ApiServer
不能个 其他的 Kubelet
通信。删除的 Pods
的决定不能传达给 Kubelet
, 直到它重新建立和 ApiServer
的连接为止。
容量与可分配 Capacity & Allocatable
script1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Capacity: cpu: 4 ephemeral-storage: 17394Mi hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3861364Ki pods: 110 Allocatable: cpu: 4 ephemeral-storage: 16415037823 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 3758964Ki pods: 110
|
管理
与 Pods
和 Services
不同,节点并不是在 Kubernetes
内部创建的,这个会在后面的博文中提及到关于 Node
, Pod
的创建过程。
当 Kubernetes
创建一个 Node
时,仅仅是创建了一个 Node
的对象来表示 Node
节点,同时呢,在创建后,Kubernetes
将会检查这个节点是否可用。
注意
Kubernetes 保留无效节点的对象,并继续检查它是否有效。必须显式删除 Node 对象以停止此过程。
当前,有 3 个组件同 Kubernetes 节点接口交互:节点控制器、kubelet 和 kubectl。
节点控制器
这个是 一个 master
里面的组件,管理节点的方方面面,主要扮演下面几个角色:
- 节点注册时,为它分配一个
CIDR Block
(如果打开了 CIDR
分配)
- 节点列表的更新
- 监控节点的健康情况
心跳机制
Kubernetes
节点的心跳机制有助于确定节点的可用性。心跳的形式有两种:
每个节点在 kube-node-lease
命名空间 中都有一个关联的 Lease
对象。Lease
是一种轻量级的资源,可在集群扩展时提高心跳机制的性能。
kubelet
负责创建和更新 NodeStatus
和 Lease
对象:
- 当状态发生改变时,或者在配置的时间间隔内没有更新时,
kubelet
会更新 NodeStatus
. 每个 NodeStatus
更新的默认间隔为 5 min 。
kubelet
会每 10 s 创建并更新其 Lease
对象。 Lease
更新独立于 NodeStatus
更新而发生。
可靠性
这里的可靠性在 Kubernetes 1.4 版本升级后,节点的控制器在删除 Pod 之前会先检查下集群中的节点状态。官网介绍说:
节点控制器把驱逐频率限制在 每秒 --node-eviction-rate
个(默认为 0.1)。这表示它 每 10s 内至多从一个节点驱逐 Pods。
1.6 版本开始,节点控制器还负责驱逐运行在拥有 NoExecute 污点的节点上的 pods , 如果这些 pods 没有容忍这些污点。
1.8 版本开始,节点控制器负责创建代表节点条件的污点。这是 Alpha 的功能。
节点自注册
当 kubelet 标志 –register-node 为 true (默认)时,它会尝试向 API 服务注册自己。这是首选模式,被绝大多数发行版选用。
对于自注册模式,kubelet 使用下列参数启动:
--kubeconfig
- 用于向 apiserver
验证自己的凭据路径。
--cloud-provider
- 如何从云服务商读取关于自己的元数据。
--register-node
- 自动向 API 服务注册。
--register-with-taints
- 使用 taints
列表(逗号分隔的 <key>=<value>:<effect>
)注册节点。当 register-node
为 false
时无效。
--node-ip
- 节点 IP 地址。
--node-labels
- 在集群中注册节点时要添加的标签(请参阅 NodeRestriction
准入插件 在 1.13+ 中实施的标签限制)。
--node-status-update-frequency
- 指定 kubelet
向 master
发送状态的频率。
启用节点授权模式 和 NodeRestriction
准入插件时,仅授权小组件创建或修改其自己的节点资源。
手动节点管理
集群管理员可以创建及修改节点对象
如果管理员希望手动创建节点对象,请先设置 kubelet 标记: --register-node=false
管理员可是修改节点资源(忽略 –register-node 的设置 )。修改包括在节点上设置 labels 及标记它为不可调度.