睿诚科技协会

Kubernetes是什么?为何成容器编排首选?

Kubernetes 技术介绍

什么是 Kubernetes?

Kubernetes(常简称为 K8s)是一个用于自动部署、扩展和管理“容器化应用程序”的开源平台

Kubernetes是什么?为何成容器编排首选?-图1
(图片来源网络,侵删)

您可以将它想象成“容器操作系统的内核”,它负责调度、运行和维护一堆容器,就像您的电脑操作系统负责调度和管理 CPU、内存、进程一样。

  • 为什么需要它? 当您只有几个容器时,手动管理还可行,但当容器数量达到几十、几百甚至上千时,手动操作(如启动、停止、更新、发现故障)将变得极其困难和不可靠,Kubernetes 就是为了解决这个大规模容器管理难题而生的。

  • 核心目标:

    1. 服务自愈: 如果一个容器或节点挂了,Kubernetes 能自动重启或替换它。
    2. 弹性伸缩: 您可以根据负载情况,自动增加或减少容器的数量。
    3. 服务发现与负载均衡: 自动为容器分配 IP 和 DNS 名,并实现负载均衡,让用户请求可以平滑地分发到多个容器上。
    4. 自动化发布与回滚: 您可以轻松地更新应用版本,如果新版本有问题,可以一键回滚到旧版本。
    5. 配置与密钥管理: 管理应用的配置信息和敏感数据(如密码、API Key),而无需将它们硬编码在镜像中。

核心概念与架构

理解 Kubernetes 的关键在于理解它的核心组件和抽象概念,我们可以从它的控制平面工作节点两部分来理解其架构。

Kubernetes是什么?为何成容器编排首选?-图2
(图片来源网络,侵删)

1 控制平面

控制平面是 Kubernetes 的大脑,负责做出集群决策,例如调度应用、维护应用状态、伸缩等。

  • kube-apiserver (API 服务器): 所有组件的统一入口,它暴露了 Kubernetes 的 API,并负责处理所有 REST 请求,您可以通过 kubectl 命令行工具或直接发送 HTTP 请求与之交互。
  • etcd (键值存储): Kubernetes 的“数据库”,它是一个高可用的键值存储系统,用于持久化存储集群的所有数据,包括节点信息、Pod 状态、配置等。etcd 的数据一致性和可靠性是整个集群稳定运行的基石。
  • kube-scheduler (调度器): 负责为新创建的 Pod(见下文)选择一个合适的工作节点来运行,它会考虑多种因素,如节点的资源是否充足、是否有特定的硬件/软件要求、亲和性/反亲和性规则等。
  • kube-controller-manager (控制器管理器): 运行“控制器”的进程,控制器是集群中“期望状态”与“实际状态”的协调者,如果期望有 3 个副本的 Pod,但其中一个挂了,控制器就会负责创建一个新的 Pod 来弥补这个差距,常见的控制器有 Node Controller、Replication Controller 等。

2 工作节点

工作节点是真正运行您应用程序容器的地方。

  • kubelet (节点代理): 每个节点上运行的代理,它负责与 API 服务器通信,确保节点上的 Pod(容器)都处于运行状态,它也负责管理容器的生命周期,包括启动、停止、监控等。
  • kube-proxy (网络代理): 负责维护节点上的网络规则,实现 Kubernetes 的服务抽象,它允许集群内的网络通信,并负责实现负载均衡,当有新的 Service 创建时,kube-proxy 会在节点上设置规则(如 iptables 或 IPVS)将流量转发到正确的后端 Pod。
  • 容器运行时: 负责实际运行容器的软件,最常见的是 Docker,但 Kubernetes 也支持其他容器运行时,如 containerd, CRI-O 等。

3 核心抽象对象

您在 Kubernetes 中操作的主要是这些 API 对象,它们定义了您集群的“期望状态”。

  • Pod (波德): Kubernetes 中最小的可部署单元,一个 Pod 包含一个或多个紧密相关的容器,这些容器共享网络命名空间(IP 地址和端口)和存储卷,Pod 通常是短暂的,生命周期很短,被设计为可以被轻易地创建和销毁。
  • Deployment (部署): 这是您最常用来管理无状态应用的对象,它描述了应用的期望状态,比如应该运行多少个 Pod 副本、使用哪个 Docker 镜像等,Deployment 控制器会确保实际状态始终与期望状态一致,它还支持滚动更新和回滚。
  • Service (服务): 为一组功能相同的 Pod 提供一个统一的网络入口,Service 为这组 Pod 提供了一个稳定的虚拟 IP(ClusterIP)和 DNS 名称,无论后端的 Pod 如何变化(比如被重新调度、IP 地址改变),Service 的入口保持不变,实现了服务发现和负载均衡。
  • Namespace (命名空间): 用于在单个集群内隔离不同的资源,您可以将命名空间视为一个虚拟的子集群,常用于隔离开发、测试、生产等不同环境的资源。
  • Volume (存储卷): 为 Pod 提供持久化存储,Pod 本身是短暂的,但数据需要持久化,Volume 允许您将存储挂载到 Pod 中的容器,即使 Pod 被销毁,Volume 中的数据也可以保留。
  • ConfigMap & Secret (配置映射与密钥): 用于将配置和敏感数据与容器镜像解耦,ConfigMap 用于存储非敏感的配置(如环境变量、配置文件),Secret 用于存储敏感数据(如密码、Token)。

关键特性与优势

  • 服务自愈:

    • 健康检查: liveness 探针(存活探针)和 readiness 探针(就绪探针)可以检测容器是否存活或准备好接收流量。
    • 自动重启: liveness 探针失败,kubelet 会重启容器。
    • 自动替换: 如果一个节点本身挂了,控制器会在其他健康的节点上创建新的 Pod 来替代它。
    • 自动扩缩容: 可以根据 CPU 使用率等指标自动增减 Pod 数量。
  • 服务发现与负载均衡:

    • 无需手动配置,Kubernetes 会为每个 Service 分配一个 DNS 名称和集群 IP,Pod 只需向这个 Service 名称发送请求,kube-proxy 就会自动将请求负载均衡到后端的健康 Pod 上。
  • 存储编排:

    Kubernetes 支持多种存储后端(如本地存储、公有云存储、网络存储 NFS、Ceph 等),您可以像挂载一个普通目录一样,将持久化存储挂载到 Pod 中。

  • 自动化发布与回滚:

    Deployment 支持滚动更新,可以逐步用新版本的 Pod 替换旧版本,实现零停机发布,如果新版本出现问题,可以一键回滚到之前的稳定版本。

  • 批量执行:

    • 使用 JobCronJob 对象,可以一次性运行任务(如数据处理、报表生成)或定时任务。
  • 密钥与配置管理:

    将配置和敏感信息与容器镜像分离,使得应用配置更加灵活和安全。


典型工作流程

  1. 用户提交请求: 用户通过 kubectl 命令行工具向 kube-apiserver 发送一个请求,例如创建一个 Deployment。
  2. API 服务器处理: apiserver 验证请求并将其写入 etcd 数据库。
  3. 控制器响应: Deployment 控制器通过 apiserver 监听到 Deployment 被创建,它会读取 etcd 中的期望状态。
  4. 创建 ReplicaSet: Deployment 控制器会创建一个对应的 ReplicaSet 对象,并指定副本数量(3)。
  5. ReplicaSet 控制器响应: ReplicaSet 控制器启动工作,发现当前有 0 个符合要求的 Pod。
  6. 调度 Pod: ReplicaSet 控制器创建 3 个 Pod 对象。kube-scheduler 监听到这些待调度的 Pod,并为它们选择合适的工作节点。
  7. 节点执行: 目标节点上的 kubelet 接收到指令,使用容器运行时(如 Docker)来拉取镜像并启动容器。
  8. 状态更新: kubelet 将 Pod 的运行状态(如 Running)报告给 apiserverapiserver 再更新到 etcd
  9. 服务暴露: 用户创建一个 Service,并将其指向这些 Pod 的标签。kube-proxy 在节点上设置规则,将流量转发到这些 Pod。

应用场景

  • 微服务架构: Kubernetes 是部署和管理微服务的理想平台,因为它可以轻松地为每个微服务创建独立的部署、服务和扩缩容策略。
  • 持续集成与持续部署: Kubernetes 提供了强大的自动化能力,可以与 CI/CD 工具(如 Jenkins, GitLab CI, Argo CD)无缝集成,实现应用的快速、可靠交付。
  • 混合云与多云: Kubernetes 提供了统一的 API 和抽象,使得应用可以在本地数据中心、公有云(AWS, Azure, GCP)或任何支持 Kubernetes 的环境中以相同的方式运行,增强了业务的灵活性和可移植性。
  • 批处理与大数据: 通过 JobCronJob,可以高效地运行计算密集型任务、数据处理管道等。
  • 边缘计算: Kubernetes 也可以被轻量化,用于在边缘节点上运行和管理应用,满足低延迟和高带宽的需求。

Kubernetes 已经成为现代云原生应用的事实标准,它不仅仅是一个工具,更是一套强大的理念和生态系统,通过自动化、声明式配置和丰富的生态系统(如 Helm 包管理、Istio 服务网格、Prometheus 监控等),Kubernetes 极大地简化了复杂应用的运维,让开发者能够更专注于业务逻辑本身,从而加速创新和交付。

对于任何希望构建可扩展、高可用、易于维护的现代应用的组织来说,学习和掌握 Kubernetes 都是一项至关重要的投资。

分享:
扫描分享到社交APP
上一篇
下一篇