kubernetes 核心组件运行机制-原理解析

概述

Kubernetes 核心组件运行机制基于一种高度解耦合、声明式的架构设计,其主要组件包括 Kubernetes API Serveretcdkube-schedulerkube-controller-managerkubeletkube-proxy,各组件协同工作以实现容器集群的高效管理和资源调度。

API Server 其核心功能是提供各种资源的增、删、改、查及Watch,是各个功能模块之间通信的中心枢纽。

  • 集群管理的API入口
  • 资源配额控制入口
  • 集群安全机制

API Server

通过一个名称为kube-apiserver的进程提供服务,该进程运行在Master上。默认情况下,在本机的8080端口。

我们通常可以通过kubectl来与API Server进行交互,他们之间的接口是RESTfull API

由于API ServerKubenetes集群数据的唯一入口,因此安全性与高性能就成为API Server设计和实现的两大核心目标。通过HTTPS安全通道与CA签名数字证书强制双向认证的方式,使得API Server的安全性得以保证。为了更细粒度的控制用户或应用对k8s资源对象的访问权限,k8s启用了RBAC访问控制策略。

API Server性能是决定k8s集群整体性能的关键因素,因此k8s的设计者运用以下方式来最大程度的保证API Server的性能

  • 大量高性能的底层代码
  • 普通List接口结合异步Watch接口
  • 采用高性能数据库ETCD

API Server 架构

API Server架构从上到下分为一下几层:

  1. API层:主要以REST方式提供各种API接口,除了Kubernetes资源对象的CRUDWatch等主要API,还有健康检查、UI、日志、性能指标等运维监控相关的API。
  2. 访问控制层:当客户端访问API接口时,访问控制层负责对用户身份鉴权,验明用户身份,核对权限。
  3. 注册表层:k8s把所有资源对象都保存在注册表中,针对注册表中的各种资源对象都定义了:资源对象的类型、如何创建资源对象、如何转换资源的不同版本等。
  4. etcd数据库:持久化存储k8s资源对象的kv数据库。etcdwatch的API接口对于API Server来说至关重要,因为通过这个接口,API Server创新性的设计了List-Watch这种高性能的资源对象实时同步机制,使得k8s可以管理超大规模的集群,及时响应和快速处理集群中的各种事件。

如下是一个完整Pod调度过程,对API Server的List-Watch机制进行说明

  1. 借助etcdwatch api接口,API Server可以监听ETCD上发生的数据库操作事件,在这些事件发生后,ETCD会及时通知API Server
  2. 为了让k8s的其他组件在不访问ETCD数据库情况下,也能及时获取资源对象的变化。API Server模仿ETCD提供了自己的Watch接口。
  3. k8s的List-Watch用于实现数据同步的代码逻辑。客户端首先调用API ServerList接口获取相关资源对象的全量数据并将其缓存到内存中,然后启用对应资源对象的Watch协程,在接收到Watch事件后,在根据事件类型(新增,修改,删除)对内存中的全量资源对象列表做出响应的同步修改,从实现上来看,这是一种全量结合增量的高性能数据同步方式

Proxy API 接口

k8s的API Server最主要的REST接口是资源对象的增、删、改、查接口,除此之外还提供了代理接口,这类接口的作用是代理REST请求,即API Server将收到的请求转发到某个Node上的kubelet守护进程的Rest接口,该kubelet负责响应。

bash 复制代码
# 列出指定节点内所有Pod的信息
/api/v1/nodes/{name}/proxy/pods

# 列出指定节点内物理资源的统计信息
/api/v1/nodes/{name}/proxy/stats

# 列出指定节点的概要信息
/api/v1/nodes/{name}/proxy/spec

需要说明的是:这里获取的Pod信息数据来自Node而非ETCD数据库

K8s Proxy API里关于Pod的相关接口,通过这些接口,我看可以访问Pod里某个容器提供的服务

bash 复制代码
# 访问Pod
/api/v1/namespaces/{namespace}/pods/{name}/proxy

# 访问Pod服务的URL路径
/api/v1/namespaces/{namespace}/pods/{name}/proxy/{path:*}

集群功能模块之间通信

k8s的API Server作为集群的核心,负责集群各功能模块之间的通信。集群内的各个功能模块通过 API Server将信息存入ETCD,当需要获取和操作这些数据时,则通过API Server提供的REST接口来实现,从而实现各个模块之间的信息交互。

常见的一个交互场景是kubelet进程与API Server的交互。每个node上的kubelet每隔一个时间周期,就会调用一次API ServerREST接口报告自己的状态,API Server在接收到这些信息后,将这些信息保存到ETCD中。此外kubelet也通过API ServerWatch接口监听Pod信息,如果监听到新的Pod的副本被调用到本节点,则执行Pod对应的容器创建和启动逻辑,删除和修改同理。

另一个场景是kube-controller-manager进程与API Server的交互。kube-controller-manager中的Node Controller模块通过API Server提供的Watch接口实时监控node的信息并做相应处理。

调度(Scheduler)通过API ServerWatch接口监听到新的Pod副本信息后,会检索所有符合该Pod要求的Node列表,开始执行Pod调度逻辑,在调度成功后将Pod帮到到目标节点上。

结语

总结 Kubernetes 核心组件运行机制的原理解析,Kubernetes 作为一款先进的容器编排系统,其核心组件通过紧密协作实现了自动化部署、扩展和管理容器化应用的目标。以下是对主要组件运行机制的关键要点总结:

Kubernetes API Server

  • 作为集群的中央管控点,API Server 提供了 RESTful API 接口,处理对集群状态的增删改查操作。
  • 所有资源对象(如 Pod、Deployment、Service 等)的管理和控制指令均通过 API Server 实现。
  • API Server 连接 etcd 存储集群的状态数据,并通过 Watch 机制实时同步状态变更给其他组件。

etcd

  • 作为高可用键值存储系统,etcd 存储了 Kubernetes 集群的所有配置数据和状态信息。
  • watch 功能使得其他组件能够实时获取数据变更通知,确保集群状态一致性。

kubelet

  • 在每个 Node 上运行,kubeletMasterWorker 节点之间的桥梁。
  • kubelet 通过与 API Server 交互获取Pod的定义,并确保Pod中容器在本地节点按照要求正确创建、运行和维护。

kube-proxy

  • 每个 Node 上运行的网络代理服务,实现 Kubernetes Service 的负载均衡和服务发现功能。
  • 它通过监听 API ServerService 对象的变化,动态更新网络规则,确保跨多个Pod的网络流量按需分发。

Controller Manager

  • 包含多个控制器,如 Replication ControllerEndpoint Controller 等,它们负责监控集群实际状态并调整至期望状态。
  • 控制器通过循环检查与实际状态的差异,并采取相应动作使集群达到一致状态。

Scheduler

  • 负责决定新创建的 Pod 应该调度到哪个 Node 上运行,考虑的因素包括资源需求、亲和性/反亲和性策略等。 CoreDNS 或者之前的 kube-dns
  • 提供了集群内部的服务发现能力,使得Pod能够通过服务名访问集群内其他服务。

综上所述,Kubernetes 的核心组件协同运作,共同构建了一个强大且灵活的分布式系统,它不仅保证了容器化的应用程序具有高可用性、弹性伸缩性和自我修复能力,还极大地简化了大规模分布式系统的管理和运维工作。通过深入了解这些组件的运行机制和原理,用户可以更好地设计和优化在 Kubernetes 上运行的应用程序架构。

相关推荐
shelby_loo4 小时前
在Ubuntu下通过Docker部署NAS服务器
服务器·ubuntu·docker
敲代码不忘补水6 小时前
Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南
docker·postgresql·架构·数据库架构
长天一色8 小时前
【Docker从入门到进阶】06.常见问题与解决方案 & 07.总结与资源
运维·docker·容器
妍妍的宝贝11 小时前
k8s 中的金丝雀发布(灰度发布)
云原生·容器·kubernetes
iangyu13 小时前
docker常用命令
运维·docker·容器
飞酱不会电脑16 小时前
云计算第四阶段 CLOUD2周目 01-03
云原生·容器·kubernetes
老齐谈电商16 小时前
开源电商erp系统启航电商ERP系统centos Docker部署
docker·开源·centos
程序那点事儿17 小时前
k8s 之安装busybox
云原生·容器·kubernetes
-$_$-17 小时前
【黑马点评】 使用RabbitMQ实现消息队列——1.Docker与RabbitMQ环境安装
分布式·docker·rabbitmq
芯的一天17 小时前
windows下DockerDesktop命令行方式指定目录安装
windows·docker