Skip to content

Kubernetes概念

Kubernetes核心概念一览

Kubernetes中有很多概念和术语,理解这些概念是学习Kubernetes的基础。以下是Kubernetes中最核心的概念:

Pod

Pod是Kubernetes中的最小部署单元。一个Pod可以包含一个或多个紧密耦合的容器,这些容器共享网络和存储。在Kubernetes中,Pod是最小被调度的单位,不存在单独运行在节点上的容器。

为什么Pod中的容器要紧密耦合?这基于一个朴素的观点:如果两个容器需要共享资源(比如一个容器生成数据,另一个容器处理数据),它们应该生活在同一个"屋子"里,这个"屋子"就是Pod。

Pod中的容器共享以下资源:

  • 网络命名空间:容器之间可以通过localhost通信
  • IPC命名空间:容器之间可以通过进程间通信 -UTS命名空间:容器共享主机名

ReplicaSet

ReplicaSet确保指定数量的Pod副本正在运行。它是 Deployment 的底层实现,负责维护一组Pod副本。通常不直接使用ReplicaSet,而是通过Deployment来管理。

ReplicaSet的主要工作:

  • 监控指定标签的Pod数量
  • 当Pod数量少于期望时,创建新的Pod
  • 当Pod数量多于期望时,删除多余的Pod
  • 当Pod出现故障时,尝试重启或替换

Deployment

Deployment是最常用的工作负载控制器。它提供了声明式的更新能力,使得应用的无缝更新和回滚成为可能。

Deployment的核心概念:

  • 定义期望状态(如需要3个nginx副本,镜像版本等)
  • 控制器确保期望状态始终被满足
  • 支持滚动更新,逐步替换旧版本
  • 支持回滚到历史版本
  • 支持暂停和恢复更新

Service

Service为Pod提供稳定的访问入口。由于Pod的IP地址是临时的(Pod重启后IP会变化),需要Service来提供一个稳定的访问地址。

Service的工作:

  • 为一组Pod提供稳定的DNS名称和IP
  • 在多个Pod之间进行负载均衡
  • 健康检查,自动从Endpoints中移除不健康的Pod

StatefulSet

StatefulSet用于管理有状态应用。与Deployment不同,StatefulSet保证:

  • 稳定的网络标识(Pod名称始终不变)
  • 稳定的存储(即使Pod重新调度,也能绑定到相同的PersistentVolume)
  • 有序的部署和扩缩容(按顺序进行)
  • 有序的更新

典型的有状态应用场景:

  • 数据库(MySQL、PostgreSQL)
  • 消息队列(Kafka、RabbitMQ)
  • 分布式存储(Cassandra、Elasticsearch)

DaemonSet

DaemonSet确保每个节点上都运行一个特定的Pod。这对于节点级别的系统服务非常有用。

典型使用场景:

  • 日志收集代理(如Fluentd)
  • 监控导出器(如node-exporter)
  • 网络插件(如Calico、Flannel)

Job和CronJob

Job用于执行一次性任务,CronJob用于执行定时任务。

Job的特点:运行直到完成,正常退出后就进入Completed状态。 CronJob的特点:根据Cron表达式定时执行任务。

ConfigMap和Secret

ConfigMap用于存储非敏感配置,Secret用于存储敏感信息(如密码、密钥、证书等)。

ConfigMap和Secret可以被挂载为环境变量或文件,也可以用于配置容器的启动参数。

PersistentVolume和PersistentVolumeClaim

PersistentVolume(PV)是集群中的存储资源,可以是本地存储、网络存储或云存储。 PersistentVolumeClaim(PVC)是Pod对存储的请求。

这种分离的设计使得存储的管理更加灵活:PV可以预先配置,也可以动态创建;Pod只需要声明需要的存储大小和访问模式。

Namespace

Namespace提供资源隔离。不同的Namespace可以有相同的资源名称,互不干扰。

默认的Namespace:

  • default:普通资源
  • kube-system:系统资源
  • kube-public:公开可访问的资源

Label和Selector

Label是附加在资源上的键值对,用于组织和选择资源。 Selector使用Label来选择一组资源。

常见用途:

  • 按环境标记(environment=dev/test/prod)
  • 按应用标记(app=myapp)
  • 按版本标记(version=v1/v2)

资源组织方式

在Kubernetes中,资源通过Namespace进行逻辑隔离:

Namespace (逻辑隔离)
├── Pod (最小单元)
│   └── ReplicaSet (控制 Pod 副本)
│       └── Deployment (控制 ReplicaSet)
├── Service (服务发现)
├── ConfigMap (配置)
├── Secret (敏感配置)
├── PersistentVolume (持久化存储)
└── ...

核心对象关系

理解资源之间的关系对于理解Kubernetes非常重要:

Deployment → ReplicaSet → Pod

当创建一个Deployment时,Kubernetes会自动创建一个ReplicaSet来管理指定数量的Pod。 当更新Deployment时(修改镜像版本等),会创建新的ReplicaSet,逐步将Pod从旧ReplicaSet迁移到新ReplicaSet,这就是滚动更新。

Service → Pod

Service通过Selector选择一组Pod,为它们提供负载均衡。 每个Service都有一个Endpoints对象,记录了所有健康Pod的IP和端口。 Kube Proxy负责将Service的请求转发到后端Pod。

Deployment → ReplicaSet → Pod的删除顺序

当Deployment被删除时,相关的ReplicaSet和Pod都会被删除。 删除顺序是:先缩容到0(删除所有Pod),然后删除ReplicaSet。

PVC → PV

当Pod需要持久化存储时,会创建PersistentVolumeClaim(PVC)。 PVC会匹配最合适的PersistentVolume(PV)进行绑定。 Pod使用PVC作为存储卷。

资源对象元数据

每个Kubernetes资源对象都有一些标准的元数据字段:

metadata

  • name:资源名称(同一Namespace中必须唯一)
  • namespace:所属Namespace(不指定则使用default)
  • labels:标签(用于组织和选择资源)
  • annotations:注释(存储非标识性信息)
  • resourceVersion:用于乐观并发控制
  • uid:资源的唯一标识

spec

期望状态,定义资源的属性。 不同的资源类型有不同的spec字段。

status

实际状态,由Kubernetes自动更新。 包含当前的资源状态信息,如Pod的IP地址、容器状态等。

声明式API

Kubernetes使用声明式API,用户只需要声明期望状态,Kubernetes会自动确保当前状态与期望状态一致。

这与传统的命令式API形成对比:

  • 命令式:告诉Kubernetes"怎么做"(执行什么命令)
  • 声明式:告诉Kubernetes"想要什么结果"(期望状态)

声明式API的优势:

  • 幂等性:多次执行相同声明,不会产生副作用
  • 可预测性:系统会自动处理各种变化
  • 可版本化:声明可以存储在Git中,实现基础设施即代码