什么是 Kubernetes?它的核心概念和工作原理是什么?
Kubernetes 是什么?
Kubernetes(常缩写为 K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和运维管理。它最初由 Google 基于内部运行大规模容器的经验(Borg/Omega 系统)设计并开发,于 2014 年开源,随后成为 Cloud Native Computing Foundation(CNCF)的旗舰项目。
简单来说,当你从"在一台机器上跑几个容器"发展到"在几百台机器上跑几千个容器,还要保证服务不中断、能自动扩缩容、出了故障能自愈"时,Kubernetes 就是解决这个问题的工具。
核心概念详解
Pod — 最小调度单元
Pod 是 Kubernetes 中最小的可部署单元。一个 Pod 包含一个或多个紧密耦合的容器,它们共享网络命名空间(同一个 IP 地址和端口空间)和存储卷。大多数情况下,一个 Pod 只运行一个容器;多容器 Pod 的典型场景是 Sidecar 模式,比如主容器运行业务逻辑,Sidecar 容器负责日志收集或代理网络请求。
yamlapiVersion: 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 就会自动完成从旧版本到新版本的滚动更新,并且在更新出问题时支持一键回滚。
yamlapiVersion: 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 时,发生了什么:
- kubectl 将 YAML 发送到 kube-apiserver
- apiserver 对请求进行认证、鉴权和准入控制后,将数据写入 etcd
- kube-scheduler 监听到未调度的 Pod,为其选择 Node 并将结果写回 etcd
- 目标 Node 上的 kubelet 监听到有 Pod 分配给自己,调用容器运行时启动容器
- 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 完成一次完整的部署、扩容和滚动更新,这样对这些概念的理解才会从"知道"变成"会用"。