Kubernetes 节点

Table of Contents

集群中节点(Node)可以是一个虚拟机或者物理机,节点是执行工作的机器。每个节点都包含用于运行 pods 的必要服务,并由 master 组件管理。 节点上运行的服务包括:容器运行时、kubelet 和 kube-proxy。

1 节点状态

一个节点包含:地址、条件、容量和可分配、信息。可通过 kubectl describe node <node-name> 查看详细信息。

1.1 地址(Addresses)

包含:

  • HostName:由节点的内核指定。可以通过 kubelet 的 --hostname-override 参数覆盖
  • ExternalIP:外部路由的节点 IP 地址(从集群外可访问)
  • InternalIP:集群内部路由的节点 IP 地址

1.2 条件(Conditions)

conditions 描述 Running 节点的状态。Conditions 的 Type 包括:

条件 描述
OutOfDisk True 表示节点空间不足以添加新的 pods,否则为 False
Ready 节点状态是否健康, True 健康状态可以接受新的 pods; False 不健康; Unknown 表示最近 40s 内没收到新的消息
MemoryPressure True 表示内存存在压力,即节点剩余内存较低
PIDPressure True 表示节点进程存在压力,即进程过多
DiskPressure True 表示存在磁盘压力,即磁盘空间剩余较低
NetworkUnavailable True 表示节点网络配置不正确

如果节点的 Ready 条件处于 Unknown 或者 False 超过了 pod-eviction-timeout 时间。 节点上所有的 Pods 都会被节点控制器删除(迁移)。默认的删除超时时间为 5 分钟

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

描述节点上的可用资源:CPU、内存和可以调度到该节点上的 Pods 最大数量。

  • Capacity 显示节点的资源总量
  • Allocatable 显示可提供给 Pod 消耗的资源总量

1.4 信息(info)

节点的通用信息(System Info),包含:内核版本、系统、容器运行时以及 Kubernetes 版本信息等。

2 管理

节点(Node)并不是由 Kubernetes 创建的(外部云厂商创建)。Kubernetes 中的创建节点只是创建一个对象(包含节点的信息:name,label 等)。 创建之后,开始检查节点是否可用。对象如:

{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

创建之后,Kubernetes 会基于 metadata 执行健康检查,验证节点。如果节点可用(符合 Pod 的运行条件),会把 Pod 调度到此节点上; 否则会一直检查直到管理员显示删除节点对象。

一共由三个组件会与 Kubernetes 接口交互:节点控制器、kubelet 和 kubectl。

2.1 节点控制器(Node Controller)

节点控制器是 master 的一个组件,专门用来管理节点。

  • 维护可用节点列表,如果节点不健康会从节点列表中删除。
  • 监控节点健康状态。不能访问情况时设置 NodeStatus 的 NodeReady 状态为 ConditionUnknown。如果节点持续不可访问, 优雅删除节点上所有的 Pods。

2.2 心跳机制

心跳由两种形式: NodeStatusLease 对象。

2.3 可靠性

节点控制器驱逐 Pod 策略根据不健康节点占比动态调整。

2.4 手动管理节点

  • 管理员可以手动修改节点资源:节点 labels 以及标记为不可调度。
  • 可以使用节点上的 labels 和 Pod 的 nodeSelector 一起来控制资源调度(匹配时才调度,设置 Pod 调度到指定节点上)。
  • 标记一个节点不可调度可防止新建 Pod 调度到该节点上,但不会影响任何已经在它之上的 pods; 重启节点等操作之前这是一个有用的步骤。

    标记一个节点不可调度: kubectl cordon $NODENAME

注意 由 DaemonSet 控制器创建的 Pod 会绕过 Kubernetes 调度程序,并且不会遵守节点不可调度的设置; 这个假定是守护程序应该属于宿主机,即便是机器资源耗尽的情况下。

警告 kubectl cordon 会将节点标记为不可调度,service controller 会把该节点上之前 LoadBalancer 中的目标移出, 以保证流量不会进入到标记的节点上。

2.5 节点容量

节点的容量(CPU 数量和内存容量)是节点对象的一部分。调度器会控制节点上的资源足够 Pods 使用;但是这只包含 kubelet 启动的所有容器, 其它容器运行时启动的容器或者容器外部的运行进程不包括在内。

First created: 2020-02-06 13:11:04
Last updated: 2020-04-09 Thu 10:09
Power by Emacs 26.3 (Org mode 9.3.6)