Kubernetes

生产级别的容器编排系统 · 现代云原生基石

一、K8S 概述

Kubernetes (K8S) 是一个开源的容器编排引擎,最初由 Google 设计并捐赠给 Cloud Native Computing Foundation (CNCF) 维护。它是基于 Google 内部使用了超过 15 年的 Borg 系统演进而来,汇聚了 Google 在容器管理方面的丰富经验。

1.1 历史背景

Kubernetes 于 2014 年首次发布,迅速成为容器编排领域的事实标准。它的名字来源于希腊语,意为"舵手"或"飞行员",反映了它在容器集群中的核心控制地位。

1.2 生态系统

Kubernetes 生态系统非常庞大,包含了众多开源项目:

核心价值:

  • 自动化部署与回滚:自动发布应用变化,并在失败时回滚到之前的稳定版本。
  • 服务发现与负载均衡:内置 DNS 服务,自动分配 ClusterIP,实现流量负载均衡。
  • 自动扩缩容:基于 CPU 利用率、自定义指标或定时规则自动调整容器数量。
  • 自我修复:自动重启失败容器,替换故障节点上的容器,确保期望状态与实际状态一致。
  • 存储编排:支持多种存储解决方案,实现存储的动态挂载和管理。
  • 配置管理与密钥管理:集中管理应用配置和敏感信息,支持热更新。

二、核心架构

K8S 集群采用 控制平面 (Control Plane)工作节点 (Worker Nodes) 的分层架构。控制平面负责整个集群的管理和决策,工作节点负责运行实际的应用负载(参见图1)。

1. 控制平面组件

控制平面是 Kubernetes 集群的大脑,负责管理集群的状态和决策:

2. 工作节点组件

工作节点是运行应用负载的实际机器(物理机或虚拟机),包含以下核心组件:

3. 核心设计理念

Master Node (Control Plane) API Server Scheduler Controller Mgr etcd (Storage) Worker Node Kubelet Kube-proxy Container Runtime Pod Pod Control Loop
图1:K8S 整体架构图 - 展示了控制平面与工作节点的交互

三、关键概念与对象

1. Pod (豌豆荚)

Pod 是 K8S 中最小的可部署单元。一个 Pod 包含一个或多个容器(Container),这些容器共享存储、网络和命名空间(参见图2)。

通常一个 Pod 运行一个主容器,但在需要辅助程序(如日志收集、代理)时,会使用 Sidecar 模式运行多个容器。

Pod (Shared IP: 10.244.1.5) App Container Port 8080 Sidecar Log Agent Shared Volume
图2:Pod 结构图 - 多容器共享网络与存储

2. Deployment & ReplicaSet

Deployment 用于声明应用的期望状态(如版本、副本数)。它通过管理 ReplicaSet 来确保指定数量的 Pod 副本始终运行(参见图3)。

Deployment 支持滚动更新(Rolling Update)和回滚,是部署无状态应用的首选方式。

Deployment Manages ReplicaSet Replicas: 3 Pod-1 Pod-2 Pod-3
图3:Deployment 管理 ReplicaSet,ReplicaSet 维持 Pod 副本数

3. Service (服务)

由于 Pod 的 IP 是动态变化的,Service 提供了一个稳定的虚拟 IP (ClusterIP),并通过 Label Selector 自动关联后端的 Pod,实现负载均衡(参见图4)。

Service ClusterIP: 10.96.0.1 Selector: app=web Pod A app=web Pod B app=web Pod C app=web
图4:Service 通过 Label Selector 路由流量到后端 Pod

4. ConfigMap & Secret

ConfigMap 用于存储非机密配置(如配置文件),Secret 用于存储敏感信息(如密码、证书)。它们可以作为环境变量注入 Pod,或挂载为文件(参见图5)。

ConfigMap config.yaml Secret db-password Pod ENV: DB_PASS=*** Mount: /etc/config/app.conf
图5:配置解耦 - 将配置注入到 Pod 中

5. Namespace

Namespace 用于将集群资源划分为多个虚拟集群,实现资源隔离和多租户管理。Kubernetes 默认包含三个命名空间:

命名空间的核心功能:

apiVersion: v1
kind: Namespace
metadata:
  name: production

6. StatefulSet

StatefulSet 用于管理有状态应用,如数据库(MySQL、PostgreSQL)、消息队列(Kafka、RabbitMQ)等。与 Deployment 管理无状态应用不同,StatefulSet 为每个 Pod 提供:

StatefulSet 与 Deployment 的主要区别:

  • Deployment 管理无状态应用,Pod 可以随意替换
  • StatefulSet 管理有状态应用,Pod 有固定身份和存储
  • Deployment 适合 Web 服务、API 等无状态应用
  • StatefulSet 适合数据库、缓存、分布式系统等有状态应用

7. Volume & PersistentVolume

Volume 是 Pod 中的存储抽象,用于在容器之间共享数据或持久化数据。Kubernetes 支持多种 Volume 类型:

7.1 临时存储卷

7.2 持久存储卷

7.3 PersistentVolume 架构

Kubernetes 的持久存储采用 PV (PersistentVolume)PVC (PersistentVolumeClaim) 的双资源模型:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard

8. Ingress

Ingress 提供了 HTTP/HTTPS 路由访问集群内部服务的方式,是 Kubernetes 集群的"入口网关"。它可以配置:

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

9. 资源管理与调度

Kubernetes 提供了强大的资源管理和调度功能,确保应用高效、稳定地运行:

9.1 资源请求与限制

9.2 调度策略

9.3 自动扩缩容

四、工作流程示例

从提交部署配置到应用运行,Kubernetes 内部发生了一系列自动化的协作流程。下面以部署一个简单的 Web 应用为例,详细说明 Kubernetes 的工作流程:

1. 部署流程详解

  1. 用户操作:使用 kubectl apply -f deployment.yaml 提交部署请求。
  2. API Server:接收并验证请求,将 Deployment 配置写入 etcd 存储。
  3. Deployment Controller:持续监听 API Server,发现新的 Deployment 资源后,创建对应的 ReplicaSet
  4. ReplicaSet Controller:监听新的 ReplicaSet,根据其规格创建指定数量的 Pod 定义,并写入 etcd。
  5. Scheduler:监控未分配节点的 Pod,根据调度策略(资源需求、节点亲和性、污点容忍度等)为每个 Pod 选择最合适的 Node
  6. API Server:将 Pod 与选定 Node 的绑定关系更新到 etcd。
  7. Kubelet:在目标 Node 上监听 API Server,发现新的 Pod 绑定后,调用 Container Runtime(如 containerd)拉取镜像并启动容器。
  8. Kubelet:持续监控容器状态,并将状态报告回 API Server。
  9. Kube-proxy:更新节点上的网络规则(如 iptables 或 IPVS),确保 Service 可以访问到新创建的 Pod。
  10. Readiness Probe:验证容器是否已准备好接收流量。

2. 滚动更新流程

当用户更新 Deployment 时(如修改镜像版本),Kubernetes 执行滚动更新:

  1. Deployment Controller:创建一个新的 ReplicaSet,设置副本数为 1。
  2. ReplicaSet Controller:新 ReplicaSet 启动一个新 Pod,旧 ReplicaSet 减少一个 Pod。
  3. 健康检查:等待新 Pod 就绪后,继续逐步增加新 ReplicaSet 的副本数,同时减少旧 ReplicaSet 的副本数。
  4. 完成更新:当新 ReplicaSet 达到目标副本数,旧 ReplicaSet 副本数为 0 时,滚动更新完成。
User kubectl apply API Server etcd Controllers Deployment + ReplicaSet Scheduler Worker Node Kubelet Container Runtime Pod 1. Apply Deployment 2. Store Config 3. Watch Changes 4. Create ReplicaSet 5. Create Pods 6. Schedule Pods 7. Bind Pods 8. Start Containers
图6:Kubernetes 部署工作流程图

五、总结与未来趋势

Kubernetes 已经成为云原生时代的核心基础设施,为现代应用提供了强大的编排能力。它的成功源于其:

1. 核心优势

2. 未来发展趋势

3. 最佳实践建议

总结:Kubernetes 不仅是一个容器编排工具,更是现代云原生应用的基础平台。它的设计理念和架构为构建弹性、可扩展、高可用的应用提供了强大的支持。随着云原生技术的不断发展,Kubernetes 将继续扮演核心角色,推动数字化转型和技术创新。