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中,实现基础设施即代码
