Kubernetes 架构介绍 – wiki基地


深入解析 Kubernetes 架构

引言:驾驭容器大潮的核心——Kubernetes

随着云计算、微服务以及容器化技术的飞速发展,如何高效地管理、部署、扩展和运维大规模的容器化应用成为了业界面临的共同挑战。Docker 等容器技术解决了应用的打包和隔离问题,但当容器数量庞大、分布在众多主机上时,手动管理这些容器将变得异常复杂且容易出错。

正是为了解决这一痛点,容器编排系统应运而生。在众多容器编排工具中,Kubernetes(通常简写为 K8s)凭借其强大的功能、灵活的设计、活跃的社区支持以及云原生计算基金会(CNCF)的背书,迅速成为事实上的行业标准。

理解 Kubernetes 的架构是掌握其工作原理、有效进行部署和故障排除的关键。Kubernetes 的设计理念是构建一个健壮、可扩展且高可用的分布式系统。它采用了一种声明式的API,用户只需要描述期望的应用状态,Kubernetes 系统就会自动努力将当前状态调整到期望状态。

本文将深入剖析 Kubernetes 的核心架构,详细介绍其各个组件的功能、职责以及它们之间的协同工作方式,帮助读者构建起对 Kubernetes 内部机制的清晰认知。

Kubernetes 高层架构概览:控制平面与工作节点

从高层视角看,一个典型的 Kubernetes 集群由两类主要角色组成:

  1. 控制平面 (Control Plane):也被称为 Master 节点(虽然官方更推荐使用控制平面这个更抽象的概念,避免单点故障的暗示),它是集群的大脑和指挥中心。控制平面负责维护集群的整体状态,接收用户指令,并作出调度决策,确保应用的期望状态得以实现。控制平面通常包含多个核心组件,为了实现高可用,生产环境的控制平面通常由多个副本构成。

  2. 工作节点 (Worker Node):也被称为 Node 节点,是集群中真正运行用户应用(容器)的机器。每个工作节点上都运行着必要的组件,负责与控制平面通信,接收并执行控制平面下达的任务,管理其上运行的容器。

这种架构将集群的决策和状态管理与实际的应用执行分离开来,使得系统更加模块化、易于扩展和维护。控制平面就像交响乐团的指挥,负责整体协调和决策;工作节点就像乐手,根据指挥的指令演奏具体的乐章。

接下来,我们将深入探讨控制平面和工作节点各自包含的核心组件。

深入解析控制平面 (Control Plane) 组件

控制平面是 Kubernetes 集群的神经中枢,它维护着整个集群的状态,响应用户和集群事件,并驱动集群从当前状态向期望状态演进。控制平面包含以下核心组件:

1. kube-apiserver:集群的入口与心脏

kube-apiserver 是 Kubernetes 控制平面的核心组件,是集群的唯一入口点。所有外部请求(如来自 kubectl 命令行工具)以及内部组件之间的通信都必须通过 kube-apiserver 进行。它提供了 Kubernetes API,允许用户和各种内部组件进行交互、查询和修改集群状态。

核心功能:

  • API 服务: 提供 RESTful API,是所有控制面和工作节点组件以及外部用户交互的唯一接口。
  • 认证 (Authentication): 验证请求发送者的身份(用户、服务账号或其他组件)。
  • 授权 (Authorization): 检查请求发送者是否有权限执行请求的操作(如创建 Pod、读取 Secret 等)。Kubernetes 支持多种授权模式,如 ABAC、RBAC (Role-Based Access Control) 等,其中 RBAC 是当前主流且推荐的方式。
  • 准入控制 (Admission Control): 在请求通过认证和授权后,但在数据写入持久化存储之前,进行的一系列预处理或验证。例如,可以强制执行某些安全策略、修改资源对象等。
  • 数据验证: 对接收到的资源对象进行结构和语义上的验证,确保数据的正确性。
  • 状态持久化: 将集群状态的变化写入后端的 etcd 存储。它不直接操作 etcd,而是作为 etcd 的客户端,负责读写数据。
  • 事件和状态的通知: 提供了“watch”机制,允许其他组件订阅特定资源的状态变化,从而实现组件之间的异步协同。

kube-apiserver 的设计强调高可用和可扩展性,通常运行多个实例并通过负载均衡器对外提供服务。它是整个集群中最繁忙的组件,其性能直接影响集群的响应速度。

2. etcd:集群状态的单一事实来源

etcd 是一个高可用、强一致性的分布式键值存储系统,它是 Kubernetes 集群状态的唯一“事实来源”。集群中所有对象(如 Pod、Service、Deployment、ConfigMap 等)的配置数据、状态信息以及元数据都被存储在 etcd 中。

核心功能:

  • 持久化存储: 存储整个 Kubernetes 集群的状态信息。
  • 强一致性: 采用 Raft 一致性算法,确保在分布式环境中数据的一致性,避免脑裂问题。
  • 分布式可靠性: 通过运行多个 etcd 实例组成集群,提供高可用性。即使部分节点故障,集群仍能正常工作。
  • 监听机制: 提供了 watch 机制,允许客户端(主要是 kube-apiserver)监听特定键的变化,从而在集群状态发生变化时触发相应的操作。

etcd 的稳定性和性能对整个 Kubernetes 集群至关重要。如果 etcd 集群不可用或数据损坏,整个 Kubernetes 集群将无法正常工作。因此,在生产环境中,etcd 通常独立部署或与控制平面其他组件分开,并采取严格的数据备份和恢复策略。

3. kube-scheduler:应用的智能分配者

kube-scheduler 是控制平面中的一个核心组件,负责监听 kube-apiserver 中新创建的、尚未分配到具体节点(Node)的 Pod。一旦发现这样的 Pod,调度器就会根据预设的调度算法和策略,为其选择一个最适合运行的节点。

调度过程:

调度过程通常分为两个阶段:

  • 过滤 (Filtering): 从所有可用的节点中,筛选出能够满足 Pod 运行条件的节点。这些条件可能包括节点是否有足够的资源(CPU、内存)、是否满足 Pod 的亲和性/反亲和性要求、是否有指定的标签、是否存在污点 (Taints) 等。
  • 打分 (Scoring): 对过滤阶段筛选出的所有可行节点进行打分。打分会考虑各种因素,如节点的资源利用率、Pod 的亲和性/反亲和性策略、节点的健康状况等。最终选择得分最高的节点来运行 Pod。

调度器将 Pod 与选定的节点进行绑定,并将这一信息更新到 kube-apiserver(最终写入 etcd)。这个调度决策对 Pod 的性能、可用性以及集群资源的合理利用至关重要。

4. kube-controller-manager:集群的永动机

kube-controller-manager 是控制平面中的另一个关键组件,它集成并运行着 Kubernetes 内置的大多数控制器(Controller)。控制器是 Kubernetes 实现声明式 API 的核心机制,它们通过 kube-apiserver 监听特定资源对象的状态变化,并采取行动将当前状态驱动到期望状态。

控制器的工作原理:

每个控制器都遵循一个“控制回路”(Control Loop):

  1. 观察 (Observe): 通过 kube-apiserver 监听并获取其所负责的资源对象(如 Deployment、ReplicaSet、Service 等)以及相关的其他资源对象(如 Pods、Endpoints 等)的当前状态。
  2. 分析 (Analyze): 将当前状态与存储在 etcd 中的期望状态进行比较。
  3. 行动 (Act): 如果当前状态与期望状态不符,控制器会调用 kube-apiserver 的 API 来执行相应的操作(如创建、删除、更新 Pods,创建 Service,配置网络规则等),从而将当前状态推向期望状态。

kube-controller-manager 运行着多种类型的控制器,包括但不限于:

  • ReplicaSet Controller: 确保在任何时候都有指定数量的 Pod 副本在运行。
  • Deployment Controller: 管理 Deployment 对象,通常通过创建和管理 ReplicaSet 来实现滚动更新、回滚等功能。
  • StatefulSet Controller: 管理 StatefulSet 对象,为有状态应用提供稳定的网络标识和持久化存储。
  • DaemonSet Controller: 确保在集群的特定节点上运行一个 Pod 的副本(例如,日志采集代理、监控代理等)。
  • Node Controller: 负责检测节点的健康状况,如果节点无响应,会更新节点的 Status,并在一段时间后将该节点上的 Pods 驱逐到其他健康节点上(如果 Pods 由控制器管理)。
  • Service Controller: 负责创建 LoadBalancer 等云提供商特定的服务资源(如果运行在云环境中)。
  • Endpoint Controller: 负责填充 Service 对应的 Endpoints 对象,Endpoints 列表包含 Service 对应的 Pod IP 地址和端口列表。
  • ServiceAccount Controller: 为 Namespace 创建默认的 ServiceAccount 并确保其 Secret 同步。

通过这些控制器的不断循环,Kubernetes 能够自动应对各种变化(如 Pod 故障、节点失联等),始终努力维持集群处于用户期望的状态。

5. cloud-controller-manager (云控制器管理器):与云平台集成

cloud-controller-manager 是 Kubernetes 1.6 版本后引入的组件,它将一部分原本在 kube-controller-manager 中的控制器功能剥离出来,以便与底层云平台(如 AWS, GCE, Azure, OpenStack 等)进行更紧密的集成。这个组件是可选的,只在 Kubernetes 部署在云环境中时才会使用。

核心功能:

  • Node Controller: 检查云平台提供的节点 API,以确定节点在云平台上的状态(是否被删除)。
  • Route Controller: 在云平台中配置路由,用于跨节点通信。
  • Service Controller: 与云平台的负载均衡服务集成,负责创建、更新和删除 LoadBalancer 类型的 Service。
  • Volume Controller: 与云平台的块存储服务集成,负责创建、附着和解附卷 (Volume)。

将这些与云平台相关的逻辑从主 kube-controller-manager 中分离出来,使得 Kubernetes 核心更加中立,同时也方便不同的云提供商实现各自的集成逻辑。

深入解析工作节点 (Worker Node) 组件

工作节点是 Kubernetes 集群中执行实际工作的地方,它们运行用户部署的应用程序。每个工作节点都包含以下核心组件:

1. kubelet:节点上的代理

kubelet 是运行在每个工作节点上的主要代理程序。它是节点与控制平面之间进行通信的关键组件。kubelet 负责管理节点上的 Pods 的生命周期。

核心功能:

  • 与 API Server 通信: 通过 kube-apiserver 获取分配给自己的 Pods 列表(通过 watch 机制)。
  • 管理 Pods: 根据从 API Server 获取的 Pod 规格,与容器运行时 (Container Runtime) 交互,创建、启动、停止和删除 Pod 中的容器。
  • 报告节点和 Pod 状态: 定期向 kube-apiserver 报告节点的状态信息(如资源使用情况、健康状况)以及该节点上 Pods 的状态(运行中、停止、崩溃等)。这些信息会被 kube-apiserver 存储到 etcd 中,供调度器和其他控制器使用。
  • 执行容器命令: 响应 kube-apiserver 的请求,如执行 kubectl execkubectl logs 等命令。
  • Pod 探针 (Probes): 执行容器的存活探针 (liveness probe) 和就绪探针 (readiness probe),并根据结果向 kube-apiserver 报告,影响 Pod 的健康状态和服务是否将流量转发给它。
  • 卷管理: 负责挂载和卸载 Pod 所需的卷 (Volume)。

kubelet 是确保 Pod 在节点上按照期望状态运行的关键。如果 kubelet 发生故障,该节点上的 Pod 将无法正常管理,且节点状态无法及时报告给控制平面。

2. Container Runtime:运行容器的引擎

容器运行时是负责在节点上实际执行和管理容器的软件。它是 Pod 中所有容器的执行环境。Kubernetes 通过容器运行时接口 (Container Runtime Interface, CRI) 与各种容器运行时进行交互,实现了对不同容器运行时的支持。

常见的容器运行时:

  • Docker Engine: 曾经是最常用的运行时,但在 Kubernetes 1.20 版本后被弃用,推荐使用支持 CRI 的运行时。
  • containerd: Docker 公司捐赠的容器运行时,符合 OCI (Open Container Initiative) 标准,是当前主流的容器运行时之一。
  • CRI-O: 专门为 Kubernetes 设计的容器运行时,轻量级且符合 CRI 标准。

kubelet 通过 CRI 调用容器运行时的 API 来执行创建、启动、停止、删除容器等操作。

3. kube-proxy:集群内部的网络代理

kube-proxy 是运行在每个工作节点上的网络代理,它负责为 Kubernetes Service 实现网络功能。当用户通过 Service 访问应用时,kube-proxy 会确保请求能够被正确地转发到 Service 后端的 Pods 上。

核心功能:

  • 服务发现和负载均衡: 监听 kube-apiserver 中 Service 和 Endpoints 对象的变化。Endpoints 对象包含了 Service 后端 Pods 的 IP 地址和端口列表。
  • 维护网络规则: 根据 Service 和 Endpoints 的信息,在节点的操作系统层面维护网络规则(如 iptables 规则、IPVS 规则),将发往 Service IP 和端口的请求转发到后端 Pods 的 IP 和端口上。
  • 实现负载均衡策略: 如果一个 Service 对应多个 Pod,kube-proxy 可以根据配置的策略(如轮询、随机等)在后端 Pods 之间进行负载均衡。

kube-proxy 支持多种工作模式:

  • Userspace 模式: 最早的模式,效率较低,不常用。
  • iptables 模式 (默认模式): 利用 Linux 内核的 iptables 规则实现流量转发。效率较高,但对于大量 Service 和 Endpoints 时,iptables 规则会非常庞大,维护和同步成本高。
  • IPVS 模式: 利用 Linux 内核的 IPVS (IP Virtual Server) 功能实现流量转发。相比 iptables,IPVS 更适合处理大规模的服务和 Endpoints,性能更高。
  • Winows 模式: 在 Windows 节点上实现网络代理功能。

kube-proxy 并不直接提供 DNS 服务(DNS 服务通常由 CoreDNS 等组件提供),它只是负责处理 IP 层面的流量转发。

Kubernetes 其他重要概念及与架构的关联

除了上述核心组件,理解 Kubernetes 架构还需要了解一些重要的资源对象和概念,以及它们如何与架构组件协同工作:

  • Pods: Kubernetes 调度的最小单位,包含一个或多个紧密相关的容器。Pod 运行在工作节点上,由 kubelet 和容器运行时管理。
  • Services: 一种抽象,定义了访问 Pods 的方式。Service 提供一个稳定的 IP 地址和 DNS 名称,以及负载均衡功能。Service 由 kube-proxy 在节点上实现,其对应的后端 Pods 列表由 Endpoint Controller 生成并维护。
  • Volumes: 为 Pods 提供持久化存储或共享存储。卷的挂载和管理涉及 kubelet 以及可能的 cloud-controller-manager 或 CSI (Container Storage Interface) 驱动。
  • Namespaces: 用于在集群内部对资源进行逻辑隔离,比如可以为不同的团队或应用创建独立的 Namespace。所有控制面组件和节点组件都需要考虑 Namespace 的限制。
  • Deployments, StatefulSets, DaemonSets 等工作负载API对象: 这些是更高层级的抽象,用于管理 Pods 的创建和更新。它们是控制器(运行在 kube-controller-manager 中)所管理的资源类型。例如,Deployment Controller 会创建 ReplicaSet,ReplicaSet Controller 会创建 Pods。
  • ConfigMaps 和 Secrets: 用于存储应用的配置数据和敏感信息。这些对象存储在 etcd 中,可以通过 Volume 或环境变量的方式注入到 Pods 中,由 kubelet 负责实现注入。
  • Kubernetes API 对象: 所有用户通过 kubectl 或其他客户端与 Kubernetes 交互时,都是在操作这些 API 对象。这些对象是声明式配置的核心,它们被发送到 kube-apiserver,验证后存储在 etcd 中,并被各种控制器监听和处理。

组件间的协同与交互流程示例

为了更好地理解这些组件如何协同工作,我们来看一个典型的 Pod 创建过程:

  1. 用户通过 kubectl apply -f pod.yaml 命令提交一个 Pod 的 YAML 定义。
  2. kubectl 将 Pod 定义发送到 kube-apiserver
  3. kube-apiserver 对请求进行认证、授权和准入控制。
  4. 验证通过后,kube-apiserver 将 Pod 对象的状态写入 etcd。此时 Pod 处于等待调度状态,还没有被分配到具体的节点。
  5. kube-scheduler 通过 watch 机制监听 kube-apiserver,发现了一个新的、未调度的 Pod。
  6. kube-scheduler 执行过滤和打分算法,选择一个最适合运行该 Pod 的工作节点。
  7. kube-scheduler 通过 kube-apiserver 更新 Pod 对象,将其 spec.nodeName 字段设置为选定的节点名称。这个信息也被写入 etcd
  8. 目标工作节点上的 kubelet 通过 watch 机制监听 kube-apiserver,发现有一个 Pod 被分配给了自己。
  9. kubelet 根据 Pod 的定义,与节点上的容器运行时(如 containerd)交互,拉取镜像(如果需要),并创建和启动 Pod 中的容器。
  10. kubelet 继续监控 Pod 中容器的运行状态(如健康探针结果),并定期将 Pod 的状态信息通过 kube-apiserver 报告回 etcd
  11. 如果 Pod 定义中包含 Service Selector,Endpoint Controller 会监听 Pod 的创建和状态变化,并更新 Service 对应的 Endpoints 对象。
  12. 工作节点上的 kube-proxy 监听 Service 和 Endpoints 对象的变化,并更新节点的网络规则(如 iptables),以便将发往 Service IP 的流量转发到新创建的 Pod 上。

这个流程展示了 Kubernetes 如何通过各个组件的协同,以及基于 API Server 和 etcd 实现的声明式控制回路,自动化地管理应用的部署和生命周期。

架构的考量与优势

Kubernetes 架构的设计体现了以下关键考量和优势:

  • 声明式 API 与控制回路: 这是 Kubernetes 最核心的设计理念。用户只需描述期望状态,系统通过控制器循环不断地将当前状态向期望状态调整,大大简化了复杂的运维任务,提高了系统的自动化水平和容错能力。
  • 松耦合的组件: 控制平面和工作节点的组件各自独立,通过 kube-apiserver 进行通信和状态共享。这种松耦合使得组件可以独立开发、部署和扩展,提高了系统的灵活性和可维护性。
  • 高可用性 (HA): 控制平面中的关键组件(如 kube-apiserver, etcd, kube-controller-manager, kube-scheduler)都可以部署多个副本来实现高可用。工作节点天然就是分布式的,一个节点的故障不会影响整个集群(除非是单工作节点的测试环境)。
  • 可扩展性: Kubernetes 的架构允许水平扩展。可以通过增加更多的工作节点来提升集群的计算能力;可以通过增加控制平面组件的副本来提升控制平面的处理能力(特别是 kube-apiserver);etcd 集群也可以扩展来提升存储能力和吞吐量。
  • 开放与可插拔: Kubernetes 设计了多种接口和扩展点,如 CRI (Container Runtime Interface)、CNI (Container Network Interface)、CSI (Container Storage Interface) 等,允许用户选择不同的容器运行时、网络方案、存储方案。cloud-controller-manager 也体现了这种可插拔的设计。
  • 状态集中管理: 将所有集群状态存储在 etcd 这个唯一的真相源中,并通过 kube-apiserver 提供一致的访问接口,避免了状态分散和数据不一致的问题。

总结:理解架构,驾驭 Kubernetes

本文详细介绍了 Kubernetes 集群的核心架构,包括控制平面(kube-apiserver, etcd, kube-scheduler, kube-controller-manager, cloud-controller-manager)和工作节点(kubelet, 容器运行时, kube-proxy)的各个组件。我们深入探讨了它们各自的功能、职责以及它们如何通过 kube-apiserveretcd 协同工作,共同实现声明式地管理容器化应用。

理解 Kubernetes 的架构不仅仅是了解各个组件的名称,更重要的是理解它们之间的关系、通信方式以及它们如何协同工作来维持集群的期望状态。这对于:

  • 有效部署和配置 Kubernetes 集群: 知道哪些组件需要高可用,如何配置它们以满足性能和可靠性要求。
  • 进行故障排除: 当出现问题时,能够快速定位是哪个组件或哪个环节出了问题。例如,Pod 创建失败可能是调度问题、镜像拉取问题或容器运行时问题;Service 无法访问可能是 kube-proxy 或网络配置问题。
  • 优化集群资源利用: 理解调度器的工作原理有助于编写更好的 Pod 配置,实现更高效的资源分配。
  • 进行二次开发或扩展: 如果需要为 Kubernetes 添加新的功能或集成第三方服务,了解其架构和接口是必不可少的基础。

Kubernetes 是一个复杂而强大的系统,其架构是其稳定、灵活和可扩展性的基石。希望通过本文的详细介绍,读者能够对 Kubernetes 的内部工作原理有一个更深入、更全面的理解,从而更好地利用这一强大的容器编排平台。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部