5月27日 18:31

什么是 Kubernetes?它的核心概念和工作原理是什么?

Kubernetes 是什么?

Kubernetes(常缩写为 K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和运维管理。它最初由 Google 基于内部运行大规模容器的经验(Borg/Omega 系统)设计并开发,于 2014 年开源,随后成为 Cloud Native Computing Foundation(CNCF)的旗舰项目。

简单来说,当你从"在一台机器上跑几个容器"发展到"在几百台机器上跑几千个容器,还要保证服务不中断、能自动扩缩容、出了故障能自愈"时,Kubernetes 就是解决这个问题的工具。

核心概念详解

Pod — 最小调度单元

Pod 是 Kubernetes 中最小的可部署单元。一个 Pod 包含一个或多个紧密耦合的容器,它们共享网络命名空间(同一个 IP 地址和端口空间)和存储卷。大多数情况下,一个 Pod 只运行一个容器;多容器 Pod 的典型场景是 Sidecar 模式,比如主容器运行业务逻辑,Sidecar 容器负责日志收集或代理网络请求。

yaml
apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: my-app:1.0 ports: - containerPort: 8080

Node — 工作节点

Node 是集群中实际运行工作负载的机器,可以是物理机或虚拟机。每个 Node 上运行着三个关键组件:

  • kubelet:负责管理本 Node 上 Pod 的生命周期,向控制平面汇报状态
  • kube-proxy:维护节点上的网络规则,实现 Service 的负载均衡
  • 容器运行时:实际运行容器的软件,如 containerd、CRI-O

Cluster — 集群

Cluster 由一组 Node 组成,是 Kubernetes 管理的计算资源池。一个集群通常包含多个 Worker Node 和至少一个 Master Node(控制平面)。集群是 Kubernetes 运维的基本单元——所有的应用部署、资源分配、网络策略都在集群范围内定义和管理。

Service — 服务发现与负载均衡

Pod 的 IP 地址是临时的——每次 Pod 重建后 IP 都会变化。Service 通过标签选择器(Label Selector)匹配一组 Pod,并为它们提供一个稳定的虚拟 IP(ClusterIP)和 DNS 名称,解决了"如何找到一组随时可能变化的 Pod"这个问题。

常见的 Service 类型:

  • ClusterIP:默认类型,仅在集群内部可访问
  • NodePort:通过每个 Node 的指定端口暴露服务
  • LoadBalancer:向云厂商请求外部负载均衡器

Deployment — 声明式应用管理

Deployment 是最常用的工作负载控制器,它管理 ReplicaSet,而 ReplicaSet 管理 Pod 副本数量。你只需要声明"我需要 3 个副本运行 my-app:2.0 镜像",Kubernetes 就会自动完成从旧版本到新版本的滚动更新,并且在更新出问题时支持一键回滚。

yaml
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: app image: my-app:2.0

ConfigMap 与 Secret — 配置管理

ConfigMap 用于存储非敏感的配置数据(如应用配置文件、环境变量),Secret 用于存储敏感信息(如数据库密码、TLS 证书)。将配置与镜像解耦后,同一份镜像可以在开发、测试、生产环境中复用,只需替换不同的 ConfigMap 和 Secret 即可。

Namespace — 资源隔离

Namespace 在同一个物理集群中划分出多个逻辑上的"虚拟集群"。不同 Namespace 下的资源名称可以重复,资源配额(ResourceQuota)和访问控制(RBAC)也可以按 Namespace 粒度设置。常见做法是为每个团队或每个环境(dev/staging/prod)创建独立的 Namespace。

Kubernetes 的工作原理

Kubernetes 采用经典的主从架构,分为控制平面(Control Plane)和数据平面(Worker Node)两部分。

控制平面(Control Plane)

控制平面是集群的"大脑",负责全局决策和响应集群事件:

  • kube-apiserver:集群的统一入口,所有组件之间的通信都通过 REST API 经由 apiserver 完成。它是唯一直接与 etcd 交互的组件。
  • etcd:分布式键值存储,保存集群的全部状态数据。etcd 的数据就是集群的"唯一真相来源"(Single Source of Truth)。
  • kube-scheduler:监听新创建且尚未被调度的 Pod,根据资源需求、亲和性规则、污点容忍等策略为 Pod 选择合适的 Node。
  • kube-controller-manager:运行各种控制器(Deployment Controller、ReplicaSet Controller、Node Controller 等),通过控制循环不断将集群的当前状态向期望状态收敛。

工作节点(Worker Node)

工作节点是集群的"手脚",负责实际运行业务容器:

  • kubelet:在每个 Node 上运行的代理,接收 PodSpec 并确保容器按照规范运行,同时向 apiserver 汇报 Node 和 Pod 的状态。
  • kube-proxy:在每个 Node 上维护网络规则(默认使用 iptables 或 IPVS 模式),实现 Service 到 Pod 的请求转发和负载均衡。
  • 容器运行时:负责拉取镜像、启动和停止容器。Kubernetes 通过 CRI(Container Runtime Interface)与运行时交互,不再直接依赖 Docker。

一个请求的完整流程

当你执行 kubectl apply -f deployment.yaml 时,发生了什么:

  1. kubectl 将 YAML 发送到 kube-apiserver
  2. apiserver 对请求进行认证、鉴权和准入控制后,将数据写入 etcd
  3. kube-scheduler 监听到未调度的 Pod,为其选择 Node 并将结果写回 etcd
  4. 目标 Node 上的 kubelet 监听到有 Pod 分配给自己,调用容器运行时启动容器
  5. kube-controller-manager 不断监控实际副本数与期望副本数是否一致,如有偏差则创建或删除 Pod

这个"声明式 + 控制循环"的设计思想是 Kubernetes 最核心的理念——你只需要告诉它"我想要什么",而不是"怎么做"。

Kubernetes 的主要特性

  • 自动化部署和回滚:通过声明式配置实现滚动更新,支持按比例控制升级速度,出错时可一键回滚到上一版本
  • 服务发现和负载均衡:自动为 Service 分配 ClusterIP 和 DNS 记录,内置轮询式负载均衡
  • 自动扩缩容:Horizontal Pod Autoscaler(HPA)根据 CPU/内存使用率或自定义指标自动增减 Pod 副本数
  • 自愈能力:自动重启失败容器、替换无响应节点上的 Pod、杀死未通过健康检查的容器
  • 存储编排:通过 PV/PVC 机制自动挂载各种存储后端(本地磁盘、NFS、云盘等),无需关心底层实现
  • 配置和密钥管理:ConfigMap 和 Secret 将配置与镜像解耦,支持热更新而不需要重新构建镜像

典型应用场景

  • 微服务架构:每个微服务独立部署为一个 Deployment,通过 Service 互相调用,配合 Istio 等 Service Mesh 实现流量治理
  • CI/CD 流水线:利用 Kubernetes 的声明式特性,将构建、测试、部署全流程容器化,实现 GitOps 工作流
  • 批处理和定时任务:Job 和 CronJob 控制器支持一次性任务和定时调度任务
  • 机器学习训练:利用 GPU 调度、分布式训练框架(如 Kubeflow)在 Kubernetes 上运行大规模模型训练

掌握 Kubernetes 的核心概念和工作原理,是理解整个云原生技术栈的基础。从 Pod 到 Deployment,从 Service 到 Namespace,每一个概念都对应着生产环境中真实存在的问题和解决方案。建议在学习理论的同时动手搭建一个多节点集群,用 kubectl 完成一次完整的部署、扩容和滚动更新,这样对这些概念的理解才会从"知道"变成"会用"。

标签:Kubernetes