article.read --id=174

Kubernetes:容器编排的交响乐指挥

// published: 2025-08-05

Docker解决了单个容器的打包和运行问题,但当你的应用由数十个甚至数百个微服务组成,每个微服务有多个副本,分布在多台服务器上时,你需要一个更高层次的编排系统。Kubernetes(简称K8s)应运而生,它不仅仅是容器编排工具,更是一个完整的分布式系统运行时,为云原生应用提供了声明式的部署、自动化的扩缩容、自愈能力、服务发现、负载均衡、配置管理、密钥管理等一系列核心功能。

Pod是Kubernetes最小的调度单元,它包含一个或多个紧密耦合的容器,共享网络命名空间和存储卷。为什么不直接调度容器?因为在实际应用中,往往需要多个容器协同工作:主容器运行应用,边车容器(sidecar)处理日志收集、服务网格代理、配置热加载等辅助任务。Pod为这些容器提供了一个共同的执行环境,它们可以通过localhost相互通信,可以共享存储卷。

Deployment是管理Pod的高级抽象,它定义了Pod的期望状态:应该运行多少个副本、使用什么镜像、如何进行滚动更新、如何进行健康检查。当你修改Deployment的配置(比如更新镜像版本),Kubernetes会自动执行滚动更新:逐步创建新版本的Pod,同时逐步删除旧版本的Pod,确保在更新过程中始终有足够的Pod在运行,服务不会中断。如果新版本出现问题,可以一键回滚到上一个稳定版本。

Service为一组Pod提供稳定的网络入口。Pod的IP地址是动态分配的,当Pod重启或重新调度时IP会变化,因此不能直接用Pod IP访问服务。Service通过标签选择器(label selector)关联一组Pod,为它们分配一个稳定的ClusterIP,并提供负载均衡。Service有多种类型:ClusterIP只能在集群内部访问,NodePort在每个节点上开放一个端口,LoadBalancer在云环境中创建一个外部负载均衡器。

Ingress是HTTP/HTTPS流量的路由规则,它根据域名和URL路径将外部流量分发到不同的Service。Ingress Controller(如Nginx Ingress Controller、Traefik)负责实现Ingress规则,通常会创建一个负载均衡器作为集群的统一入口。通过Ingress,你可以用一个IP地址托管多个域名,实现基于路径的路由、SSL/TLS终止、URL重写等高级功能。

Airbnb是Kubernetes的早期采用者之一。在迁移到Kubernetes之前,Airbnb使用传统的虚拟机部署方式,部署一个新服务需要数周时间,扩容需要手动配置负载均衡器。迁移到Kubernetes后,部署时间缩短到几分钟,扩容变成了修改一个数字(replicas)。Kubernetes的自愈能力也大大提高了系统的可靠性:当某个Pod崩溃时,Kubernetes会自动重启它;当某个节点故障时,Kubernetes会自动将Pod调度到其他节点。

京东是中国最大的电商平台之一,其核心业务系统运行在自建的Kubernetes集群上。京东的K8s集群规模庞大,管理着数万个节点、数十万个Pod。为了应对双11等大促场景的流量洪峰,京东开发了基于Kubernetes的弹性伸缩系统:根据实时流量自动调整Pod副本数,根据资源使用率自动扩展节点。京东还深度定制了Kubernetes的调度器,实现了基于成本优化的调度策略,在保证性能的同时最小化基础设施成本。

Kubernetes的声明式API是其最迷人的特性。你不需要告诉Kubernetes如何部署应用(命令式),只需要描述应用的期望状态(声明式):应该有3个副本、使用nginx:1.21镜像、监听80端口。Kubernetes的控制器会持续观察实际状态,并采取行动使其与期望状态一致。这种自愈能力让系统更加健壮:即使有人手动删除了一个Pod,控制器也会立即创建一个新的Pod来替代它。

但Kubernetes的学习曲线陡峭,运维复杂度高。你需要理解Pod、Deployment、Service、Ingress、ConfigMap、Secret、PersistentVolume等数十个概念,需要配置网络插件(CNI)、存储插件(CSI)、监控系统、日志系统。对于小团队来说,托管的Kubernetes服务(如AWS EKS、Google GKE、阿里云ACK)是更务实的选择:云厂商负责管理控制平面,你只需要关注应用本身。

Kubernetes不是银弹,它适合微服务架构、需要频繁部署和扩缩容的场景。如果你的应用是单体架构,或者规模很小,Kubernetes可能是过度设计。但如果你正在构建云原生应用,Kubernetes几乎是唯一的选择——它已经成为容器编排的事实标准,拥有最活跃的社区、最丰富的生态、最广泛的云厂商支持。掌握Kubernetes,是现代运维工程师的核心竞争力。