在 Kubernetes 中,Node 是一个工作机器的抽象,通常可以是一个物理服务器或虚拟机。Node 是 Kubernetes 集群的基础计算单元,负责运行应用程序的容器。每个 Node 提供计算、存储和网络资源,使 Kubernetes 能够在其上调度 Pods。
Node 的主要功能
- 容器运行环境:
- Node 是容器的运行环境。它安装了必要的软件,如容器运行时(例如 Docker 或 containerd)和 Kubernetes 组件(如 Kubelet 和 Kube-proxy),以便运行和管理容器。
- 资源提供:
- Node 提供计算资源(如 CPU、内存)、存储和网络能力,供 Pods 使用。Kubernetes 能够监控 Node 上的资源利用率,以便在必要时调度或迁移 Pods。
- 管理与调度:
- Kubernetes 的调度器负责将 Pods 分配到不同的 Node 上。调度的决策基于 Node 的可用资源、负载均衡策略和用户定义的亲和性规则。
- 健康监控:
- Kubernetes 会定期检查 Node 的健康状态。当 Node 发生故障或不可用时,Kubernetes 会自动将其标记为 NotReady,并将其上的 Pods 调度到其他健康的 Node。
Node 的组成部分
每个 Node 包含以下关键组件:
- Kubelet:
- Kubelet 是 Node 上的主要代理,负责管理 Pods 的生命周期。它根据 API 服务器的指令执行操作,确保 Pods 处于所需状态。Kubelet 还负责监控容器的健康状态,并报告给 Kubernetes 控制平面。
- Kube-proxy:
- Kube-proxy 负责实现 Kubernetes Service 的网络功能,包括负载均衡和流量转发。它根据 Service 的定义设置网络规则,以便将请求路由到相应的 Pods。
- 容器运行时:
- 容器运行时(如 Docker、containerd 或 CRI-O)负责管理容器的生命周期,包括创建、启动、停止和删除容器。Kubernetes 利用容器运行时 API 与底层宿主机进行交互。
- 网络组件:
- Node 必须配置网络以支持 Pods 之间的通信。Kubernetes 支持多种网络插件(如 Flannel、Calico 和 Weave Net),为 Pods 提供容器网络接口(CNI)。
Node 的类型
Kubernetes 中的 Node 可以分为两种类型:
- 工作节点(Worker Node):
- 主要用于运行应用的 Pods。大多数 Kubernetes 集群中的 Node 都是工作节点,负责执行实际的应用逻辑。
- 控制平面节点(Control Plane Node):
- 控制平面节点管理整个 Kubernetes 集群的状态,包括 API 服务器、调度器和控制器管理器。为了提高集群的可用性和稳定性,通常将控制平面节点与工作节点分开部署。
Node 的状态
Kubernetes 监控每个 Node 的状态,Node 的状态包括:
- Ready:Node 正在正常运行,可以接收 Pods。
- NotReady:Node 无法接收 Pods,可能是由于硬件故障、网络问题或 Kubelet 问题。
- Unknown:Kubernetes 无法确定 Node 的状态,通常是由于网络问题导致无法与 Node 通信。
Node 的管理
查看 Node 状态
使用以下命令查看集群中的所有 Node 及其状态:
kubectl get nodes
该命令将显示每个 Node 的名称、状态、角色和其他信息。
添加 Node
要在 Kubernetes 集群中添加新 Node,通常需要以下步骤:
- 安装 Kubernetes 组件:在新 Node 上安装 Kubelet 和 Kube-proxy。
- 加入集群:使用
kubeadm
或其他工具将 Node 加入到集群中。示例命令如下:
kubeadm join <master-ip>:<port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
删除 Node
要从集群中删除 Node,可以使用以下命令:
kubectl delete node <node-name>
请注意,删除 Node 会导致该 Node 上运行的所有 Pods 被重新调度。
Node 的资源管理
Kubernetes 允许为 Node 设置资源请求和限制,以帮助调度器决定将 Pods 调度到哪个 Node。每个 Pod 可以指定所需的 CPU 和内存资源。
资源请求和限制示例
在 Pod 定义中,可以为容器指定资源请求和限制:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- requests:容器启动时需要的最低资源。
- limits:容器能够使用的最大资源。
Node 的调度
Kubernetes 调度器负责决定 Pods 应该调度到哪个 Node。调度过程基于多种因素,包括:
- Node 的资源可用性:调度器将 Pods 调度到具有足够可用资源的 Node。
- Pod 的亲和性和反亲和性规则:可以定义 Pods 在同一 Node 上或不同 Node 上运行的偏好。
- Taints 和 Tolerations:Node 可以设置污点,只有具有相应容忍的 Pods 才能调度到该 Node。
Taints 和 Tolerations 示例
如果某个 Node 设置了污点,只有在 Pod 中定义了相应的容忍,才能在该 Node 上运行:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
tolerations:
- key: "example.com/special"
operator: "Exists"
effect: "NoSchedule"
Node 的扩展与缩减
在 Kubernetes 中,可以通过以下方式扩展 Node:
- 水平扩展:添加更多的 Node 到集群中,以增加计算资源。这可以通过云提供商的控制台或命令行工具实现。
- 垂直扩展:增加现有 Node 的资源(如 CPU、内存)配置,通常需要重新启动 Node。
Node 的监控与故障恢复
Kubernetes 监控 Node 的状态,并能够自动处理故障 Node。例如,当 Node 健康检查失败时,Kubernetes 会将其标记为 NotReady。此时,调度器会将 Pods 重新调度到其他健康的 Node。
使用监控工具
可以使用监控工具(如 Prometheus 和 Grafana)监控 Node 的资源使用情况和健康状态,帮助发现和解决潜在问题。
总结
Kubernetes Node 是集群中运行应用的基本单位。理解 Node 的组成、功能和管理,能够帮助用户更有效地管理和优化 Kubernetes 集群。通过合理的资源管理和调度策略,Node 能够提供高效、可靠的计算环境,支持现代微服务架构的运行和扩展。在实际应用中,合理利用 Node 的能力,可以提高 Kubernetes 集群的可用性、性能和资源利用率。