Kubernetes 架构零基础教学:K8s 工作流揭秘 – wiki大全


Kubernetes 架构零基础教学:K8s 工作流揭秘

导语: 容器化技术的普及使得应用程序的部署和管理变得更加高效。然而,随着应用规模的扩大和复杂性的增加,容器的编排和管理成为新的挑战。Kubernetes(常简称为 K8s)应运而生,作为一款强大的开源容器编排平台,它能够自动化地部署、扩展和管理容器化应用。本文将从零开始,详细解析 Kubernetes 的架构及其核心工作流,帮助初学者快速掌握 K8s 的奥秘。


一、什么是 Kubernetes (K8s)?

Kubernetes 是一个开源平台,旨在自动化部署、扩展和管理容器化应用程序。它通过将应用程序容器分组到逻辑单元中,以便于管理和发现,从而简化了复杂分布式系统的管理。简单来说,K8s 就像一个智能的“操作系统”,但它管理的是集群中的容器,而不是单个机器上的进程。


二、Kubernetes 核心架构

Kubernetes 作为一个分布式系统,其核心架构主要由两类节点组成:控制平面 (Control Plane)工作节点 (Worker Node)

2.1 控制平面 (Control Plane / Master 节点)

控制平面是 Kubernetes 集群的“大脑”,负责维护集群的期望状态,并对集群进行全局决策。它不直接运行应用程序容器,而是管理和协调工作节点上的活动。

核心组件包括:

  • kube-apiserver

    • 这是 Kubernetes API 的入口,暴露了 Kubernetes API。
    • 它是集群的通信枢纽,所有内部和外部组件(如 kubectl 命令行工具)都通过它进行通信。
    • 负责请求的认证、授权和验证。
  • etcd

    • 一个高可用、分布式、一致的键值存储。
    • 用于保存集群的所有配置数据和状态信息,是集群的“单一事实来源”。
  • kube-scheduler

    • 负责监视新创建的、但尚未分配到节点 (Node) 的 Pod。
    • 根据资源需求、策略、亲和性/反亲和性等多种因素,选择一个最合适的工作节点来运行这些 Pod。
  • kube-controller-manager

    • 运行各种控制器进程,这些控制器持续监控集群的当前状态。
    • 其职责是努力将集群的实际状态调整到期望状态。例如,Deployment Controller 确保部署中指定数量的 Pod 副本始终运行;Node Controller 负责在节点出现故障时进行响应。
  • cloud-controller-manager (云控制器管理器)

    • 这是一个可选组件,仅在云环境中运行。
    • 用于将 Kubernetes 集群与云提供商的 API 进行集成,处理与云平台相关的操作,如节点管理、路由和负载均衡器配置等。

2.2 工作节点 (Worker Node)

工作节点是运行实际应用程序容器的地方。每个工作节点都由控制平面管理,并且包含运行 Pod 所需的服务。

核心组件包括:

  • kubelet

    • 在每个工作节点上运行的代理。
    • 负责与控制平面通信,接收并执行 Pod 的指令,确保 Pod 中的容器按照预期运行并保持健康。
  • kube-proxy

    • 在每个工作节点上运行的网络代理。
    • 维护节点上的网络规则,负责实现 Pod 之间的网络通信以及从集群外部到 Pod 的网络访问。
  • 容器运行时 (Container Runtime)

    • 负责运行容器的软件,例如 Docker、containerd 或 CRI-O。
    • 它从 kubelet 接收指令,拉取容器镜像并启动容器。

三、Kubernetes 核心概念

理解 Kubernetes 的架构离不开以下几个核心概念:

  • Pod:Kubernetes 中最小的可部署单元。一个 Pod 封装了一个或多个紧密相关的容器,这些容器共享网络、存储和生命周期。Pod 是应用程序的实例。

  • Node:Kubernetes 集群中的一台物理或虚拟机。它可以是控制平面节点(Master)或工作节点(Worker),负责承载 Pod。

  • Cluster:由一组节点(包括一个或多个控制平面节点和多个工作节点)组成的集合,它们共同协作,用于运行容器化应用程序。

  • 声明式配置 (Declarative Configuration):这是 Kubernetes 的一个核心思想。用户通过 YAML 文件等方式描述应用程序的期望状态(例如,“我需要运行 3 个 Nginx 容器”),而不是指令(“启动 Nginx 容器 A,然后启动 Nginx 容器 B…”)。Kubernetes 系统会负责监控集群的实际状态,并自动将其调整到这个期望状态。


四、K8s 工作流揭秘:以 Pod 创建为例

理解 Kubernetes 工作流的关键在于其“声明式”的特性和各组件之间的协作。下面以创建一个 Pod 为例,详细揭示其典型工作流程:

  1. 用户提交请求
    用户通常通过 kubectl 命令行工具(或直接使用 Kubernetes API 客户端)向 kube-apiserver 提交创建 Pod 的请求。这个请求通常是一个 YAML 文件,其中定义了 Pod 的期望状态,包括容器镜像、端口、资源限制等。

  2. API Server 处理
    kube-apiserver 接收到请求后,会进行认证、授权和验证。如果请求有效且用户有权限,它会在 etcd 中创建一个新的 Pod 对象。此时,这个 Pod 对象存在于 etcd 中,但尚未分配到任何工作节点上。

  3. Scheduler 调度
    kube-scheduler 持续监听 kube-apiserver,发现有一个新的、未调度的 Pod。它会根据一系列复杂的调度算法(如节点的可用资源、Pod 的亲和性/反亲和性规则、污点/容忍度等)来选择一个最合适的工作节点来运行该 Pod。

  4. API Server 更新
    kube-scheduler 完成调度决策后,会将 Pod 与选定的节点绑定信息(即更新 Pod 的 nodeName 字段)通过 kube-apiserver 更新到 etcd 中。

  5. Kubelet 执行
    目标工作节点上的 kubelet 也在持续监听 kube-apiserver。当 kubelet 发现有一个 Pod 被调度到它所在的节点时,它会获取该 Pod 的详细信息。

  6. 容器运行时启动
    kubelet 随后指示节点上的容器运行时(如 Docker 或 containerd)根据 Pod 的定义拉取所需的容器镜像,并启动容器。

  7. Kubelet 报告状态
    kubelet 持续监控 Pod 的运行状态(例如,容器是否正在运行、是否健康检查通过等),并将这些状态信息通过 kube-apiserver 报告回 etcd。这样,etcd 中始终保存着 Pod 最新的实际状态。

在整个过程中,kube-apiserver 是所有组件通信的枢纽,etcd 是集群状态的持久化存储,而 kube-scheduler 和各种 Controller Manager 则共同实现了自动化,确保集群的实际状态与用户的期望状态保持一致。


五、进阶工作流与自动化能力

Kubernetes 的强大之处不仅在于单个 Pod 的创建,更在于其丰富的自动化能力,覆盖了应用程序生命周期的各个方面:

  • 服务发现与负载均衡 (Service):通过 Service 对象,Kubernetes 可以为一组 Pod 提供稳定的网络访问点(虚拟 IP),并自动进行请求的负载均衡,即使 Pod 数量或 IP 地址发生变化,服务也保持可达。

  • 自动扩缩容 (Auto-scaling)

    • HPA (Horizontal Pod Autoscaler):根据 CPU 利用率、内存或其他自定义指标,自动增加或减少 Pod 的副本数量。
    • Cluster Autoscaler:根据集群资源的利用情况和 Pod 的调度需求,自动增减工作节点的数量。
  • 滚动更新与回滚:Kubernetes 允许在不中断服务的情况下,逐步更新应用程序版本(滚动更新)。当新版本出现问题时,也能快速自动回滚到旧版本,确保服务的连续性。

  • 存储编排:为有状态应用程序动态提供和管理存储卷。无论是基于云的存储(如 AWS EBS, Google Persistent Disk)还是本地存储,Kubernetes 都能抽象化存储细节,使其对应用透明。

  • 批处理与定时任务 (Job, CronJob):通过 Job 对象运行一次性任务,确保任务成功完成。通过 CronJob 对象则可以像传统的 cron 命令一样,在指定的时间周期性地运行任务。


结语

Kubernetes 通过其精巧的架构设计和声明式 API,极大地简化了容器化应用的部署和管理。理解其控制平面和工作节点中各个组件的功能及其之间的协作机制,是深入学习和有效使用 K8s 的关键。希望本文能为您的 K8s 学习之路打下坚实的基础,助您在云原生时代游刃有余。


滚动至顶部