0%

Kubernetes 基础架构组件:Node

在这个 Kubernetes 中,节点(Node) 是执行工作的机器,曾经叫做 minion 。 根据集群的实际情况
,节点可以是一个 虚拟机 或者是 物理机器。每个节点都包含于运行 pods 的必要服务,并由主控组件
管理。节点上的服务包括 容器运行时 、 Kubelet 和 kube-proxy .

以下内容来自 Kubernetes 官网,部分内容来自个人 Kubernetes 集群。

Node 是啥

Node 就是集群里面的机器,不然还能是啥?所以这章也就没啥好说的,和大部分的集群环境一样,会有一些基础的概念,比如节点的状态,节点的容量,节点资源分配等问题。这里直接看官网介绍就好了。

节点状态

每个节点的状态,会有以下几点内容:

  • 地址
  • 条件
  • 容量与可分配
  • 信息

我们查询一个节点的状态信息一般是用:

script
1
kubectl describe node <node_name>

这里,你要是不知道有哪些 node ,可以使用:

script
1
kubectl get nodes

去查看这个 node 的名称。这里我们查询的 node 为 k8s-master:

script
1
kubectl describe node k8s-master

查询到的内容如下:

script
1
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,比如这里的:

script
1
2
3
Addresses:
InternalIP: 192.168.1.101
Hostname: k8s-master

条件 Conditions

script
1
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: 表示节点是健康的并已经准备好接受 podsFalse 表示节点不健康而且不能接受 podsUnknown 表示节点控制器在最近 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

script
1
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

管理

PodsServices 不同,节点并不是在 Kubernetes 内部创建的,这个会在后面的博文中提及到关于 Node , Pod 的创建过程。

Kubernetes 创建一个 Node 时,仅仅是创建了一个 Node 的对象来表示 Node 节点,同时呢,在创建后,Kubernetes 将会检查这个节点是否可用。

注意

Kubernetes 保留无效节点的对象,并继续检查它是否有效。必须显式删除 Node 对象以停止此过程。
当前,有 3 个组件同 Kubernetes 节点接口交互:节点控制器、kubelet 和 kubectl。

节点控制器

这个是 一个 master 里面的组件,管理节点的方方面面,主要扮演下面几个角色:

  • 节点注册时,为它分配一个CIDR Block(如果打开了 CIDR 分配)
  • 节点列表的更新
  • 监控节点的健康情况

心跳机制

Kubernetes 节点的心跳机制有助于确定节点的可用性。心跳的形式有两种:

  • NodeStatus
  • Lease 对象

每个节点在 kube-node-lease 命名空间 中都有一个关联的 Lease 对象。Lease 是一种轻量级的资源,可在集群扩展时提高心跳机制的性能。

kubelet 负责创建和更新 NodeStatusLease 对象:

  • 当状态发生改变时,或者在配置的时间间隔内没有更新时,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-nodefalse 时无效。
  • --node-ip - 节点 IP 地址。
  • --node-labels - 在集群中注册节点时要添加的标签(请参阅 NodeRestriction 准入插件 在 1.13+ 中实施的标签限制)。
  • --node-status-update-frequency - 指定 kubeletmaster 发送状态的频率。
    启用节点授权模式 和 NodeRestriction 准入插件时,仅授权小组件创建或修改其自己的节点资源。

手动节点管理

集群管理员可以创建及修改节点对象

如果管理员希望手动创建节点对象,请先设置 kubelet 标记: --register-node=false

管理员可是修改节点资源(忽略 –register-node 的设置 )。修改包括在节点上设置 labels 及标记它为不可调度.

这是打赏的地方...

本文标题:Kubernetes 基础架构组件:Node

文章作者:Mr.Sun

发布时间:2020年04月20日 - 10:26:33

最后更新:2020年04月22日 - 09:28:55

原始链接:http://www.blog.sun-iot.xyz/posts/35d99c28

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

---------Thanks for your attention---------