0%

k8s进阶-架构-节点

节点 节点管理

节点

节点状态

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

  • Addresses
  • Conditions
  • Capacity and Allocatable
  • Info

执行以下命令可查看所有节点的列表

1
kubectl get nodes -o wide

执行以下命令可查看节点状态以及节点的其他详细信息:

1
kubectl describe node <your-node-name>

Addresses

  • HostName: 在节点命令行界面上执行 hostname 命令所获得的值。启动 kubelet 时,可以通过参数 --hostname-override 覆盖
  • ExternalIP:通常是节点的外部IP(可以从集群外访问的内网IP地址;上面的例子中,此字段为空)
  • InternalIP:通常是从节点内部可以访问的 IP 地址

Conditions

Conditions 描述了节点的状态。Condition的例子有:

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

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

容量和可分配量(Capacity and Allocatable)描述了节点上的可用资源的情况:

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

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

Info

描述了节点的基本信息,例如:

  • Linux 内核版本
  • Kubernetes 版本(kubelet 和 kube-proxy 的版本)
  • Docker 版本
  • 操作系统名称

这些信息由节点上的 kubelet 收集。

节点管理

与 Pod 和 Service 不一样,节点并不是由 Kubernetes 创建的,节点由云供应商(例如,Google Compute Engine、阿里云等)创建,或者节点已经存在于您的物理机/虚拟机的资源池。向 Kubernetes 中创建节点时,仅仅是创建了一个描述该节点的 API 对象。节点 API 对象创建成功后,Kubernetes将检查该节点是否有效。

节点控制器(Node Controller)

节点控制器是一个负责管理节点的 Kubernetes master 组件。在节点的生命周期中,节点控制器起到了许多作用。

  1. 节点控制器在注册节点时为节点分配 CIDR 地址块
  2. 节点控制器通过云供应商(cloud-controller-manager)接口检查节点列表中每一个节点对象对应的虚拟机是否可用。在云环境中,只要节点状态异常,节点控制器检查其虚拟机在云供应商的状态,如果虚拟机不可用,自动将节点对象从 APIServer 中删除。
  3. 节点控制器监控节点的健康状况。当节点变得不可触达时(例如,由于节点已停机,节点控制器不再收到来自节点的心跳信号),节点控制器将节点API对象的 NodeStatus Condition 取值从 NodeReady 更新为 Unknown;然后在等待 pod-eviction-timeout 时间后,将节点上的所有 Pod 从节点驱逐。
  • 默认40秒未收到心跳,修改 NodeStatus Condition 为 Unknown
  • 默认 pod-eviction-timeout 为 5分钟
  • 节点控制器每隔 --node-monitor-period 秒检查一次节点的状态

节点自注册(Self-Registration)

如果 kubelet 的启动参数 --register-node为 true(默认为 true),kubelet 会尝试将自己注册到 API Server。kubelet自行注册时,将使用如下选项:

  • --kubeconfig:向 apiserver 进行认证时所用身份信息的路径
  • --cloud-provider:向云供应商读取节点自身元数据
  • --register-node:自动向 API Server 注册节点
  • --register-with-taints:注册节点时,为节点添加污点(逗号分隔,格式为 =:
  • --node-ip:节点的 IP 地址
  • --node-labels:注册节点时,为节点添加标签
  • --node-status-update-frequency:向 master 节点发送心跳信息的时间间隔

如果 Node authorization mode 和 NodeRestriction admission plugin 被启用,kubelet 只拥有创建/修改其自身所对应的节点 API 对象的权限。

手动管理节点

如果想要手工创建节点API对象,可以将 kubelet 的启动参数 --register-node 设置为 false。

管理员可以修改节点API对象(不管是否设置了 --register-node 参数)。可以修改的内容有:

  • 增加/减少标签
  • 标记节点为不可调度(unschedulable)

节点的标签与 Pod 上的节点选择器(node selector)配合,可以控制调度方式,例如,限定 Pod 只能在某一组节点上运行。

执行如下命令可将节点标记为不可调度(unschedulable),此时将阻止新的 Pod 被调度到该节点上,但是不影响任何已经在该节点上运行的 Pod。这在准备重启节点之前非常有用。

1
kubectl cordon $NODENAME

节点容量(Node Capacity)

Kubernetes 调度器在调度 Pod 到节点上时,将确保节点上有足够的资源。具体来说,调度器检查节点上所有容器的资源请求之和不大于节点的容量。此时,只能检查由 kubelet 启动的容器,不包括直接由容器引擎启动的容器,更不包括不在容器里运行的进程