16.1.3 工作节点(Node)核心组件

工作节点(Node)负责承载业务容器与提供运行时支撑,其核心组件共同完成容器生命周期管理、网络连通、存储挂载与状态上报等任务。理解这些组件的职责与协作关系,是排障与性能优化的基础。

文章图片

1. kubelet#

kubelet 是工作节点上的核心管理进程,负责与控制平面的 API Server 通信并执行 Pod 的实际创建与维护。

  • 职责:拉取镜像、创建/删除容器、挂载卷、执行健康检查、上报节点与 Pod 状态。
  • 核心能力
  • Pod 解析与生命周期管理(运行、重启、终止)
  • 资源隔离配置(CPU/内存/磁盘)
  • Node 状态上报与心跳

安装与配置示例(使用 kubeadm 安装节点基础组件)

# 1) 安装 kubelet/kubeadm/kubectl
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
  https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" \
  | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

# 2) 节点加入集群(示例)
sudo kubeadm join 10.0.0.10:6443 \
  --token abcdef.0123456789abcdef \
  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

关键配置查看与解释

# kubelet 服务参数(systemd)
systemctl status kubelet
sudo cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 重点参数解释:
# --container-runtime-endpoint : 指向容器运行时 socket
# --cgroup-driver             : cgroup 驱动(建议与 runtime 一致)
# --pod-infra-container-image : pause 镜像

排错示例

# 1) 节点 NotReady:查看 kubelet 日志
sudo journalctl -u kubelet -f

# 2) 检查 kubelet 能否访问 API Server
curl -k https://10.0.0.10:6443/healthz

# 3) Pod 无法启动:查看事件与容器状态
kubectl describe pod <pod-name> -n <ns>
kubectl get node -o wide

2. 容器运行时(Container Runtime)#

容器运行时负责真正执行容器的创建、运行与销毁,kubelet 通过 CRI 与其交互。

  • 常见实现:containerd、CRI-O
  • 职责:镜像管理、容器进程管理、容器日志输出
  • 运维关注点:运行时崩溃、镜像仓库连通性、日志增长过快、磁盘空间耗尽。

安装与配置示例(containerd)

sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

# 修改 cgroup driver 为 systemd(与 kubelet 一致)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

sudo systemctl enable --now containerd

命令与解释

# 查看 containerd 运行状态
sudo systemctl status containerd

# 使用 crictl(需安装)查看容器
sudo apt-get install -y cri-tools
crictl info
crictl ps -a

# 拉取镜像(验证镜像仓库连通性)
crictl pull registry.k8s.io/pause:3.9

排错示例

# 运行时崩溃:查看日志
sudo journalctl -u containerd -f

# 镜像拉取失败:检查 DNS 与镜像仓库
nslookup registry.k8s.io
crictl pull registry.k8s.io/pause:3.9

3. kube-proxy#

kube-proxy 负责实现 Service 的网络转发规则,保障 Pod 之间与外部访问的连通性。

  • 实现模式:iptables、IPVS
  • 职责
  • 维护 Service 虚拟 IP 与后端 Pod 的转发规则
  • 支持负载均衡与健康后端选择
  • 典型问题:Service 无法访问、连接超时、规则未生效、节点网络异常。

查看模式与规则

# 查看 kube-proxy 使用模式(iptables 或 IPVS)
kubectl -n kube-system get configmap kube-proxy -o yaml | grep -i mode

# iptables 规则检查
sudo iptables -t nat -L -n | grep KUBE-SVC

# IPVS 规则检查
sudo ipvsadm -Ln

排错示例

# Service 无法访问:检查 Endpoint 是否存在
kubectl get svc,ep -n <ns>

# kube-proxy 日志
kubectl -n kube-system logs -l k8s-app=kube-proxy --tail=100

4. 网络插件(CNI)#

CNI 插件负责为 Pod 分配 IP、构建 Pod 网络与跨节点通信。

  • 常见方案:Calico、Flannel、Cilium、Weave
  • 职责:IP 分配、路由维护、网络策略执行
  • 运维关注点:跨节点通信失败、网络策略阻断、Pod 无法分配 IP。

安装示例(Calico)

# 安装 Calico(示例)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

# 验证 CNI Pod 状态
kubectl -n kube-system get pods -l k8s-app=calico-node

排错示例

# Pod 无法分配 IP:查看 CNI 日志
kubectl -n kube-system logs -l k8s-app=calico-node --tail=100

# 跨节点通信失败:检查路由与防火墙
ip route
sudo iptables -L -n

5. 节点资源与系统组件#

工作节点不仅运行 Kubernetes 组件,还依赖操作系统级能力。

  • 关键依赖
  • Linux 内核(cgroups、namespace、iptables)
  • 容器镜像存储与日志目录(/var/lib)
  • 时钟同步(NTP)
  • 资源治理:保证节点磁盘、CPU、内存充足,避免驱逐(Eviction)导致 Pod 被频繁重调度。

系统检查与配置

# cgroup 与内核参数
mount | grep cgroup
sysctl net.bridge.bridge-nf-call-iptables

# 时间同步
timedatectl status
sudo apt-get install -y chrony
sudo systemctl enable --now chrony

磁盘与日志排查

# 查看磁盘占用
df -h
sudo du -sh /var/lib/containerd /var/log

# 清理未使用镜像(示例)
crictl rmi --prune

6. 组件协作流程概述#

  1. API Server 下发 Pod 规范
  2. kubelet 接收并调用容器运行时创建容器
  3. CNI 分配网络并完成 Pod 间连通
  4. kube-proxy 更新转发规则
  5. kubelet 持续上报状态并执行健康检查

流程验证示例

# 创建一个简单 Pod 并验证网络
kubectl run web --image=nginx:1.25 --port=80
kubectl get pod -o wide

# 查看该 Pod 的 IP 与节点
kubectl get pod web -o wide

7. 运维要点与最佳实践#

  • 保持 kubelet 与运行时版本兼容
  • 监控节点磁盘使用,避免镜像与日志爆满
  • 对 kube-proxy 与 CNI 状态做持续监测
  • 设置合理的资源预留与驱逐阈值
  • 定期检查节点内核参数与网络配置一致性

资源驱逐阈值示例(kubelet 配置片段)

# 文件路径:/var/lib/kubelet/config.yaml
evictionHard:
  memory.available: "200Mi"
  nodefs.available: "10%"
  imagefs.available: "15%"

演练与练习
1. 部署一个 nginx Pod,模拟镜像拉取失败(修改为不存在的镜像),记录 kubelet 日志并恢复。
2. 切换 kube-proxy 模式(iptables <-> IPVS),观察 Service 规则变化。
3. 人为填满 /var/lib/containerd(创建大文件),观察 Node 状态变化并清理恢复。
4. 安装 Calico 后,创建两个 Pod 跨节点互相 ping,验证网络连通。
5. 设置资源驱逐阈值并施加内存压力,观察 Pod 驱逐事件。