节点 节点管理
节点
节点状态
节点的状态包含如下信息:
- 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字段为 True。False表明了该节点不健康,不能够接受新的 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 组件。在节点的生命周期中,节点控制器起到了许多作用。
- 节点控制器在注册节点时为节点分配 CIDR 地址块
- 节点控制器通过云供应商(cloud-controller-manager)接口检查节点列表中每一个节点对象对应的虚拟机是否可用。在云环境中,只要节点状态异常,节点控制器检查其虚拟机在云供应商的状态,如果虚拟机不可用,自动将节点对象从 APIServer 中删除。
- 节点控制器监控节点的健康状况。当节点变得不可触达时(例如,由于节点已停机,节点控制器不再收到来自节点的心跳信号),节点控制器将节点API对象的
NodeStatusCondition 取值从NodeReady更新为Unknown;然后在等待pod-eviction-timeout时间后,将节点上的所有 Pod 从节点驱逐。
- 默认40秒未收到心跳,修改
NodeStatusCondition 为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 启动的容器,不包括直接由容器引擎启动的容器,更不包括不在容器里运行的进程