k8s学习笔记3——Master&Node

k8s集群采用 Master-Node 架构

一个k8s集群通常包含一个master节点和多个node节点(生产环境通常用多实现高可用)

  • master:管理节点,不运行工作负载,专注于管理、调度和监控
  • node:工作节点,定期向master报告健康状况和资源使用情况

 

一. Master节点核心组件

1. kube-apiserver (API服务器)

  • 整个集群的唯一操作入口和通信枢纽
  • 提供API接口,所有内外部请求(kubectl命令,所有master/node节点上报的信息)都必须通过它
  • 负责认证、授权、验证请求,并作为所有资源对象增删改查操作的网关,这些操作的数据最终会被持久化到etcd中

2. etcd

  • 分布式键值数据库
  • 集群的所有数据(配置数据、状态信息和资源对象的期望状态等)都存储在etcd中
  • 通常,etcd会以集群模式部署(例如3个或5个节点)

3. kube-scheduler (调度器)

  • 集群的“调度中心”,负责监视新建的Pod,并未它们选择合适的Node节点运行
  • 调度决策是个复杂的过程,会综合考虑多种因素,包括pod的资源(CPU/内存),node的当前资源利用率、数据位置、软硬件策略约束、亲和性affinity和反亲和性anti-affinity、节点污点taint等

4. kube-controller-manager (控制器管理器)

  • 集群的“自动化控制中心”,内部运行着多种控制器controller,每个控制器都是一个独立的控制循环,负责监控集群状态并驱动实际状态向期望状态收敛
  • 常见的控制器如下:
  1. Node Controller  :管理Node节点状态,如节点不可用时做出响应
  2. Replication Controllrt   :确保Pod副本数始终符合期望值
  3. Endpoint Controller  :维护Service与Pod的关联关系(Endpoints)
  4. Service Account & Token Controllers  :为命名空间创建默认账户和API访问令牌

5. (可选)cloud-controller-manager

  • 当k8s集群部署在公有云环境中时,此组件负责与底层云基础设施交互

 

二. Node节点核心组件

1. kubelet

  • Node节点上最重要的代理程序,相当于该节点的“管家”
  • 其核心职责是与Master节点的API Server保持通信,管理Pod的生命周期
  • 接收Pod定义(PodSpecs),并确保其描述的容器能够健康稳定的运行
  • 会定期向Master节点报告所在节点的状态(如资源容量)和其上运行的Pod的状态

2. Container Runtime 容器运行时

  • 负责运行容器
  • kubelet通过容器运行时接口CRI 与它交互,指示它拉取镜像、启动和停止容器、管理容器资源等
  • 常见的容器运行时包括containerd(当前主流)、CRI-O等
  • docker在较新版本的k8s中已不再被支持(k8s 1.20开始,使用containerd作为默认的容器运行时,docker构建的容器镜像仍然可以使用)

3. kube-proxy

  • Node上的网络代理,负责维护节点上的网络规则
  • 它通过监听API Server中Service和Endpoint的变化,利用iptables或IPVS等机制,配置流量转发规则,从而实现对Pod的负载均衡和网络流量路由,使得服务发现和服务访问成为可能

 

三. Master与Node的协同工作机制

  1. API请求 :当用户在master节点上使用kubectl发送命令(如创建一个新Pod)时,这些请求首先被API Server接收
  2. 调度 :API Server将请求转发给调度器。调度器分析当前集群状态,然后选择一个最合适运行新Pod的Node
  3. 指令下达 : 调度器将选择结果返回给API Server,API Server再将该信息发送给被选中的Node上的kubelet
  4. 容器管理 :kubelet接收指令后,会与容器运行时交互,确保Pod中的容器被正确创建并运行
  5. 状态报告 :kubelet定期向Master中的API Server上报Node状态和Pod状态
  6. 控制器管理 :监控这些状态报告,并按需执行操作(如重启失败的Pod)
  7. 数据存储 :所有这些交互产生的数据存储在etcd中,供所有组件查询和更新

 

四. 常用命令

kubectl get nodes  #列出集群中所有节点的基本信息

kubectl describe node <node-name>   #获取指定节点的详细信息


kubectl cordon <node-name>     #封锁节点,标记为不可调用,常用语维护节点前

kubectl drain <node-name>     #封锁后驱逐该节点上的所有Pod(DaemonSet管理的pod除外),确保维护期间工作负载的安全迁移

kubectl delete node <node-name>     #从集群中移除该节点

 

posted on 2025-09-16 17:30  Karlkiller  阅读(45)  评论(0)    收藏  举报

导航