Kubernetes架构原理
控制平面组件(Master节点)
控制平面组件构成了Kubernetes集群的"大脑",负责集群的全局决策和管理
API Server (kube-apiserver)
- 集群管理的唯一入口,提供RESTful API接口
- 处理认证、授权、访问控制和API注册发现机制
- 所有组件都通过API Server进行通信,不直接相互调用
etcd
etcd是分布式键值存储系统,作为Kubernetes的"记忆中心",保存整个k8s集群的核心数据:
- 分布式键值存储数据库,保存整个集群的状态和配置数据
- 是Kubernetes集群中唯一有状态的组件
- 存储所有资源对象(Pod、Service、Deployment等)的信息
Controller Manager (kube-controller-manager)
Controller Manager(kube-controller-manager)是集群的"自动修复系统",管理中心,负则k8s集群的指令管理发出。
- 运行各种控制器,确保集群实际状态与期望状态一致
- 实现故障检测、自动扩展、滚动更新等功能
控制器包括:
- Deployment Controller:确保Deployment定义的Pod副本数符合预期
- ReplicaSet Controller:管理Pod副本数量
- Node Controller:监控节点状态,处理节点故障
- Service Controller:创建和更新Service资源
- Namespace Controller:管理命名空间生命周期
kubectl
kubectl 是 Kubernetes 的标准命令行工具,用于与集群交互,管理资源(如 Pod、Deployment、Service 等)。开发者或运维人员通过它执行日常操作,例如部署应用、查看日志、调试问题等。
kubeadm
kubeadm 是官方提供的集群生命周期管理工具,专注于快速初始化和升级 Kubernetes 集群。它简化了主节点(Master)和工作节点(Worker)的部署流程。
Scheduler (kube-scheduler)
Scheduler(kube-scheduler)是集群的"调度中心",负责:
- Pod的调度,根据资源需求、亲和性等策略选择合适节点
- 通过Watch机制监听未绑定的Pod,进行调度决策
Cloud Controller Manager (可选)
在公有云环境中管理与云提供商相关的资源
处理负载均衡器、云盘等云服务的创建和配置
工作节点组件(Node节点)
工作节点是实际运行容器化应用的"四肢",执行控制平面的指令
Kubelet
Kubelet是节点上的"Pod管家",负责接收来自controller-manager的指令具体执行资源的启停任务,功能包括:
- 节点代理,管理Pod的生命周期
- 与容器运行时(如Docker)交互,执行容器的创建、启动和停止
- 监控节点资源使用情况并上报给API Server
Kube Proxy
Kube Proxy是集群的"网络代理",负责k8s 中整个集群中各种资源之间的通信代理,实现:
- 实现Service的负载均衡和网络代理功能
- 通过维护iptables或IPVS规则实现流量转发
- 为Pod提供集群内部的服务发现
扩展组件(Add-ons)
CoreDNS
CoreDNS是Kubernetes集群中负责DNS解析的核心组件,自Kubernetes 1.13版本起成为默认的DNS服务器,取代了早期的kube-dns。作为CNCF毕业项目,CoreDNS以其插件化架构、高性能和灵活性成为云原生环境下DNS解析的成熟解决方案。
- 服务发现:将Kubernetes服务(如my-svc.default.svc.cluster.local)解析为ClusterIP或Pod IP,实现应用间通信
- Pod域名解析:为每个Pod提供基于其IP地址的域名解析
- 外部域名解析:将集群内的DNS请求转发到外部DNS服务器,解析外部域名(如www.example.com)
- 自定义域名解析:通过Corefile配置文件支持自定义域名解析规则
- 负载均衡:内置loadbalance插件,默认采用轮询策略分发流量至后端Pod
- 反向DNS解析:支持IP地址到域名的反向解析(in-addr.arpa和ip6.arpa)
Calico
Calico采用纯三层网络模型,避免了传统Overlay网络的额外开销。每个Pod获得全局唯一、可路由的IP地址,通信就像在同一个局域网中的物理机一样直接高效。 无封装开销,性能更好;原生支持完整的 NetworkPolicy,适合生产环境、大规模集群及需要严格网络隔离的场景(如多租户、混合云)。
- Pod创建:kubelet调用Calico CNI插件,为Pod分配IP并创建veth pair设备(一端在Pod内为eth0,一端在主机上为caliXXXXX)。
- 路由传播:BIRD通过BGP协议将Pod IP路由信息广播给其他节点。
- 跨节点通信:根据配置的网络模式(BGP/IPIP/VXLAN)实现Pod间通信。
- 策略实施:Felix将NetworkPolicy转换为iptables/eBPF规则,实施访问控制
Flannel
纯 overlay 方案(默认 VXLAN/UDP 封装),配置简单,适合小规模测试或对性能要求不高的场景;但因封装解封装会有额外开销,且原生不支持 NetworkPolicy(需配合其他插件如 Calico 使用策略)。 简单说:Flannel 易上手但性能一般且需额外插件做策略;Calico 稍复杂但一站式解决网络+策略,性能更强。
Ingress Controller
- 提供HTTP/HTTPS路由、负载均衡和SSL终止
- 将外部请求路由到集群内部服务
K8S资源分类
工作负载:是指k8s集群中具体负责接受用户请求任务的应用
pod:k8s中的基本资源调度单位,k8s中一切活动都是pod为基本单位,它是一个容器的集合。
deployment:是pod集合,主要是运行无状态pod(web),可以通过副本集控制pod的数量
statefulset: 是pod集群是有状态的pod集合(mysql),可以通过副本集控制pod的数量
daemonset: 是pod集合。确保每个Node运行一个指定的Pod(如日志收集Agent)
job: Linux中的一次性定时任务
cronjob: Linux中的周期性定时任务
conifimap:记录工作负载配置信息,明文记录
secret:记录工作负载配置信息,记录敏感性,通过base64码转化记录
pv:存储卷
pvc:存储卷申请
service:Linux中四层代理,可实现各个资源负载均衡(代理proxy)
ingress:Linux中七层代理 (底层用的就是nginx)
rbac:权限的设置
组件协作流程
以下是Kubernetes组件协作流程的Mermaid图表示,展示从创建Deployment到Pod运行的完整流程
- 用户请求阶段:
- 用户通过kubectl提交Deployment创建请求
- API Server接收请求并持久化到etcd
- 控制循环阶段:
- Controller Manager检测并创建ReplicaSet
- 确保实际Pod数量与期望状态一致
- 调度阶段:
- Scheduler为Pod选择合适节点
- 更新Pod的节点绑定信息
- 运行阶段:
- 目标节点的kubelet创建容器
- 容器运行时实际启动容器
- 状态回馈到控制平面
- 网络配置阶段:
- kube-proxy监听变化并更新网络规则
- 建立Service到Pod的流量转发路径
Kubernetes通过这种松耦合的组件架构,实现了高度可扩展和灵活的容器编排能力,能够适应从开发测试到大规模生产环境的各种需求。
