生产级别的容器编排系统 · 现代云原生基石
Kubernetes (K8S) 是一个开源的容器编排引擎,最初由 Google 设计并捐赠给 Cloud Native Computing Foundation (CNCF) 维护。它是基于 Google 内部使用了超过 15 年的 Borg 系统演进而来,汇聚了 Google 在容器管理方面的丰富经验。
Kubernetes 于 2014 年首次发布,迅速成为容器编排领域的事实标准。它的名字来源于希腊语,意为"舵手"或"飞行员",反映了它在容器集群中的核心控制地位。
Kubernetes 生态系统非常庞大,包含了众多开源项目:
核心价值:
K8S 集群采用 控制平面 (Control Plane) 和 工作节点 (Worker Nodes) 的分层架构。控制平面负责整个集群的管理和决策,工作节点负责运行实际的应用负载(参见图1)。
控制平面是 Kubernetes 集群的大脑,负责管理集群的状态和决策:
工作节点是运行应用负载的实际机器(物理机或虚拟机),包含以下核心组件:
Pod 是 K8S 中最小的可部署单元。一个 Pod 包含一个或多个容器(Container),这些容器共享存储、网络和命名空间(参见图2)。
通常一个 Pod 运行一个主容器,但在需要辅助程序(如日志收集、代理)时,会使用 Sidecar 模式运行多个容器。
Deployment 用于声明应用的期望状态(如版本、副本数)。它通过管理 ReplicaSet 来确保指定数量的 Pod 副本始终运行(参见图3)。
Deployment 支持滚动更新(Rolling Update)和回滚,是部署无状态应用的首选方式。
由于 Pod 的 IP 是动态变化的,Service 提供了一个稳定的虚拟 IP (ClusterIP),并通过 Label Selector 自动关联后端的 Pod,实现负载均衡(参见图4)。
ConfigMap 用于存储非机密配置(如配置文件),Secret 用于存储敏感信息(如密码、证书)。它们可以作为环境变量注入 Pod,或挂载为文件(参见图5)。
Namespace 用于将集群资源划分为多个虚拟集群,实现资源隔离和多租户管理。Kubernetes 默认包含三个命名空间:
default:未指定命名空间时的默认选择,用于部署用户应用kube-system:用于运行 Kubernetes 系统组件kube-public:公共资源命名空间,所有用户均可访问kube-node-lease:用于节点心跳检测(Kubernetes 1.13+)命名空间的核心功能:
apiVersion: v1
kind: Namespace
metadata:
name: production
StatefulSet 用于管理有状态应用,如数据库(MySQL、PostgreSQL)、消息队列(Kafka、RabbitMQ)等。与 Deployment 管理无状态应用不同,StatefulSet 为每个 Pod 提供:
StatefulSet 与 Deployment 的主要区别:
Volume 是 Pod 中的存储抽象,用于在容器之间共享数据或持久化数据。Kubernetes 支持多种 Volume 类型:
emptyDir:Pod 创建时创建,Pod 销毁时删除,用于容器间共享临时数据tmpfs:基于内存的临时存储,速度快,重启后数据丢失hostPath:挂载节点上的文件或目录,适合单节点测试PersistentVolumeClaim:挂载集群级别的持久化存储资源Kubernetes 的持久存储采用 PV (PersistentVolume) 和 PVC (PersistentVolumeClaim) 的双资源模型:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
Ingress 提供了 HTTP/HTTPS 路由访问集群内部服务的方式,是 Kubernetes 集群的"入口网关"。它可以配置:
app.example.com → app-service)example.com/api → api-service)Ingress 控制器 是实现 Ingress 功能的组件,常见的有:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Kubernetes 提供了强大的资源管理和调度功能,确保应用高效、稳定地运行:
从提交部署配置到应用运行,Kubernetes 内部发生了一系列自动化的协作流程。下面以部署一个简单的 Web 应用为例,详细说明 Kubernetes 的工作流程:
kubectl apply -f deployment.yaml 提交部署请求。当用户更新 Deployment 时(如修改镜像版本),Kubernetes 执行滚动更新:
Kubernetes 已经成为云原生时代的核心基础设施,为现代应用提供了强大的编排能力。它的成功源于其:
总结:Kubernetes 不仅是一个容器编排工具,更是现代云原生应用的基础平台。它的设计理念和架构为构建弹性、可扩展、高可用的应用提供了强大的支持。随着云原生技术的不断发展,Kubernetes 将继续扮演核心角色,推动数字化转型和技术创新。