Skip to content

Kubernetes组件

集群架构概述

Kubernetes采用分布式架构,整个系统由控制平面(Control Plane)和工作节点(Worker Nodes)两大部分组成。控制平面负责整个集群的管理和控制决策,工作节点负责实际运行容器化应用。

可以这样理解:如果把Kubernetes集群比作一个公司,控制平面就是公司的管理层,负责制定策略和决策;工作节点就是一线员工,负责执行具体的任务。管理层下达命令,员工执行任务并汇报结果。

控制平面组件

控制平面是Kubernetes的大脑,负责整个集群的管理和控制。它通常由多个组件组成,这些组件可以运行在同一个节点上(学习和小规模部署时),也可以分布在多个节点上(生产环境)。

API Server

API Server是Kubernetes控制平面的核心组件,提供RESTful API接口,是整个Kubernetes集群的统一入口。所有与Kubernetes集群的交互都通过API Server进行,无论是使用kubectl命令行工具,还是通过编程方式(client-go、fabric8等客户端库),或者是其他组件(如Scheduler、Controller Manager),都需要通过API Server的API来操作集群资源。

API Server的主要功能包括:

认证和授权:验证请求的身份(Authentication),并检查该身份是否有权限执行请求的操作(Authorization)。Kubernetes支持多种认证方式,包括X509证书、Bearer Token、Basic Auth等。

API注册和发现:Kubernetes的所有资源类型都通过API暴露,API Server负责维护这些API的注册和版本管理。

数据持久化:将集群的状态数据存储到etcd中,保证数据的持久化。

准入控制:在数据写入之前执行一些额外的检查或修改(通过Admission Webhook)。

API Server的设计是水平可扩展的,可以通过部署多个API Server实例来提高吞吐量。多个API Server之间通过负载均衡器来分发请求,但在数据层面需要保证一致性,这就是etcd的作用。

etcd

etcd是一个分布式键值存储系统,Kubernetes使用它来存储集群的所有状态数据。从某种意义上看,etcd就是Kubernetes的"数据库",所有资源对象的状态都保存在这里。

etcd的特点:

强一致性:etcd使用Raft共识算法,保证在分布式环境下的强一致性。即使在集群出现网络分区的情况下,也能保证数据的一致性。

高可用:etcd通常以集群方式运行(生产环境建议3或5个节点),即使部分节点故障,只要集群可用的节点数超过半数,仍能正常提供服务。

高效:etcd被设计为非常高效的键值存储,能够处理大量的读写请求。

在Kubernetes集群中,etcd通常运行在控制平面节点上。对于大型生产环境,建议将etcd部署在专用的节点上,以保证性能和稳定性。

Scheduler

Scheduler负责容器的调度,即决定将新创建的Pod放到哪个节点上运行。这个"调度"过程看起来简单,实际上需要考虑很多因素:

资源需求:Pod请求的CPU、内存、存储等资源是否能在目标节点上满足。不能将一个需要4核CPU的Pod调度到只有2核可用CPU的节点上。

资源约束:Pod上定义的nodeSelector、nodeAffinity、podAffinity、podAntiAffinity、tolerations等调度约束条件。

资源平衡:尽量保持所有节点的资源使用率平衡,避免某些节点过载而其他节点空闲。

服务质量:尽量将同一应用的多个副本调度到不同节点,提高可用性。

Scheduler的调度过程分为两个阶段:

过滤阶段(Predicates):筛选出所有满足Pod调度约束的节点。如果没有任何节点满足条件,Pod会一直处于Pending状态。

排序阶段(Priorities):对满足条件的节点进行排序,选择"最优"的节点。排序时会考虑诸如节点资源使用率、亲和性等因素。

Controller Manager

Controller Manager是Kubernetes中各种控制器的集合。这些控制器是Kubernetes实现自动化管理的核心,它们不断监控集群的状态,并确保当前状态与期望状态一致。

主要的控制器包括:

ReplicaSet Controller:确保指定数量的Pod副本正在运行。如果某个Pod被意外删除或终止,会创建新的Pod来补充。

Deployment Controller:管理Deployment,handleDeployment的滚动更新和回滚。

Node Controller:监控节点状态,当节点出现故障时进行处理。

Service Controller:管理Service,创建和更新服务的端点(Endpoints)。

Endpoint Controller:管理Service和Pod之间的关联关系。

Namespace Controller:管理Namespace的生命周期。

PV Controller:管理PersistentVolume。

PVC Controller:管理PersistentVolumeClaim。

每个控制器都是独立运行的 goroutine,它们通过API Server监控资源的变化,并做出相应的调整。这种设计使得系统非常灵活,可以方便地添加新的控制器类型。

工作节点组件

工作节点是实际运行容器的地方。Kubernetes的每个工作节点上都会运行以下组件:

Kubelet

Kubelet是运行在每个节点上的agent,是节点与控制平面通信的桥梁。它需要确保容器按照Pod的规范运行。

Kubelet的主要职责包括:

与API Server通信:定期从API Server获取分配到本节点的Pod,并通过API Server汇报本节点和Pod的状态。

容器管理:根据Pod的规范,使用容器运行时(Docker、containerd等)创建和管理容器。

健康检查:执行Pod中定义的健康检查探针(livenessProbe、readinessProbe、startupProbe),根据检查结果采取相应行动。

资源监控:收集容器的资源使用情况,并报告给API Server。

日志收集:收集容器的标准输出和标准错误日志。

值得注意的是,Kubelet只管理通过Kubernetes API创建的容器。如果直接在节点上通过docker run等命令创建的容器,Kubelet不会管理它们。

Kube Proxy

Kube Proxy运行在每个节点上,负责为Service提供网络代理和负载均衡。它是实现Kubernetes Service功能的关键组件。

Kube Proxy有三种工作模式:

userspace模式:最早的模式,代理进程运行在用户空间。现在已经很少使用。

iptables模式(默认):通过iptables规则实现代理和负载均衡。性能较好,配置简单。

ipvs模式:使用Linux内核的IPVS(IP Virtual Server)实现代理和负载均衡。支持更多的负载均衡算法,性能更高。

无论哪种模式,Kube Proxy的目标都是实现Service的负载均衡:将请求分发到后端的多个Pod上。同时,它还负责Service的域名解析(通过修改节点的DNS配置)。

Container Runtime

容器运行时是实际运行容器的组件。Kubernetes通过 CRI(Container Runtime Interface)接口与容器运行时交互,支持多种容器运行时:

Docker:最常用的容器运行时,Kubernetes早期版本默认使用。

containerd:从Docker中分离出来的容器运行时,Kubernetes 1.11+ 版本支持。

cri-o:轻量级的容器运行时,专为Kubernetes设计。

其他:通过CRI接口,还可以支持其他容器运行时,如Frakti(支持runV虚拟机)等。

Addons(插件)

Addons是扩展Kubernetes功能的组件,它们通常运行在kube-system命名空间中:

插件功能
CoreDNS集群群内部的DNS服务器,为Service提供域名解析
Kubernetes DashboardWeb UI管理界面
Ingress ControllerHTTP/HTTPS路由,实现基于域名和路径的访问分发
Prometheus监控系统,收集和存储指标数据
Metrics Server资源指标收集,为HPA和kubectl top提供数据
Network Policy网络策略,控制Pod之间的网络访问

这些插件使得Kubernetes的功能更加丰富,可以根据需要选择性安装。

值得注意的是,虽然控制平面组件主要运行在Master节点上,但在学习环境中,为了简化部署,通常会在所有节点(包括Master)上运行Kubelet和Kube Proxy,使得Master节点也可以运行Pod。