K8s Pod调度基础——2

目录

一、Deployment

‌一、Deployment 原理‌

‌二、核心特性‌

‌三、意义与场景‌

‌四、示例与逐行解释‌

‌五、总结‌

StatefulSet

‌一、StatefulSet 原理‌

‌二、核心特性‌

‌三、意义与场景‌

‌四、示例与逐行解释‌

‌五、总结‌

 彼此的区别

一、本质区别‌

‌二、核心特性对比‌

1. ‌Pod 标识与网络‌

2. ‌存储管理‌

3. ‌扩缩容与更新‌

4. ‌服务发现‌

‌三、运维约束对比‌

‌四、强制使用 StatefulSet 的场景‌

‌五、总结‌


一、Deployment

一、Deployment 原理

  1. 核心功能‌:

    • 管理 ‌无状态应用‌ 的 Pod 副本集(通过控制 ReplicaSet 实现),支持声明式更新、滚动升级和回滚。
    • 通过 ‌控制器模式‌ 监听集群状态,确保实际 Pod 数量与期望值一致。
  2. 工作流程‌:

    • 版本控制‌:每次更新会创建新的 ReplicaSet,逐步替换旧 Pod(滚动更新)或直接全量替换(重建更新)。
    • 回滚机制‌:记录历史版本,可快速回退到任意修订版本。

二、核心特性

特性说明
多副本管理通过 replicas 字段维持指定数量的 Pod,自动扩缩容。
滚动更新支持逐步替换旧 Pod(可配置 maxUnavailable 和 maxSurge)。
版本回滚使用 kubectl rollout undo 回退到历史版本。
健康检查集成 Liveness/Readiness 探针,确保服务可用性。
暂停与恢复暂停更新(kubectl rollout pause)以手动调试。

三、意义与场景

  • 意义‌:
    • 实现应用发布的‌零停机更新‌,提升 DevOps 效率。
    • 为微服务提供高可用、自愈的底层支撑。
  • 典型场景‌:Web 服务、API 后端、无状态计算任务等。

四、示例与逐行解释

apiVersion: apps/v1 
kind: Deployment 
metadata:
 name: nginx-deployment
 labels:
   app: nginx
 spec:
   replicas: 3
   selector:
     matchLabels:
       app: nginx
   strategy:
     type: RollingUpdate
     rollingUpdate:
       maxUnavailable: 1
       maxSurge: 1
     template:
       metadata:
         labels:
           app: nginx
         spec:
           containers:
           - name: nginx
             image: nginx:1.19
             ports:
             - containerPort: 80
             livenessProbe:
               httpGet:
                 path: /
                 port: 80
               initialDelaySeconds: 5
               periodSeconds: 10 

逐行解释‌:

  1. apiVersion: apps/v1:使用 apps 组的 API 版本。
  2. kind: Deployment:声明资源类型为 Deployment。
  3. replicas: 3:维持 3 个 Pod 副本。
  4. selector.matchLabels:选择标签为 app=nginx 的 Pod 管理。
  5. strategy:定义滚动更新策略,最多允许 1 个 Pod 不可用(maxUnavailable)和 1 个临时超额 Pod(maxSurge)。
  6. template:Pod 模板,包含容器配置(Nginx 1.19 镜像)和健康检查(每 10 秒检测 80 端口)。

五、总结

Deployment 是 Kubernetes 管理无状态应用的‌核心控制器‌,通过自动化副本管理、滚动更新和回滚机制,显著提升应用部署的可靠性和灵活性。

StatefulSet

一、StatefulSet 原理

  1. 核心功能‌:

    • 管理‌有状态应用‌(如数据库、消息队列),为每个 Pod 提供‌稳定的唯一标识‌(有序编号、持久化存储、固定网络标识)。
    • 通过 ‌Headless Service‌ 为每个 Pod 分配唯一的 DNS 记录(如 pod-name.svc-name.namespace.svc.cluster.local)。
  2. 工作流程‌:

    • 有序部署/扩缩容‌:Pod 按顺序创建(从 0 到 N-1)或删除(从 N-1 到 0),确保依赖关系(如主从数据库)。
    • 持久化存储‌:通过 volumeClaimTemplates 为每个 Pod 动态绑定独立的 PersistentVolume(PV)。

二、核心特性

特性说明
稳定标识Pod 名称(如 web-0web-1)和 DNS 记录在生命周期内保持不变。
有序管理支持顺序启停(OrderedReady)或并行(Parallel)策略。
持久化存储每个 Pod 绑定独立的 PV,数据不受 Pod 重建影响。
网络稳定性通过 Headless Service 提供固定网络端点。

三、意义与场景

  • 意义‌:
    • 解决有状态应用的‌数据持久性‌和‌拓扑稳定性‌问题,填补 Deployment 的不足。
  • 典型场景‌:MySQL 集群、MongoDB 副本集、ZooKeeper 等分布式系统。

四、示例与逐行解释

apiVersion: apps/v1
kind: StatefulSet 
metadata:
 name: mysql 
spec:
 serviceName: mysql-headless
 replicas: 3
 selector:
   matchLabels:
     app: mysql
 template:
   metadata:
     labels:
       app: mysql
     spec: containers:
     - name: mysql
       image: mysql:5.7
       ports:
       - containerPort: 3306
       volumeMounts:
       - name: mysql-data
         mountPath: /var/lib/mysql
 volumeClaimTemplates:
 - metadata:
     name: mysql-data
   spec:
     accessModes: ["ReadWriteOnce"]
     resources:
       requests:
         storage: 10Gi 

逐行解释‌:

  1. apiVersion: apps/v1:使用 apps 组 API。
  2. kind: StatefulSet:声明资源类型。
  3. serviceName: mysql-headless:关联的 Headless Service 名称。
  4. replicas: 3:创建 3 个有序 Pod(mysql-0mysql-1mysql-2)。
  5. volumeMounts:将名为 mysql-data 的卷挂载到容器路径 /var/lib/mysql
  6. volumeClaimTemplates:为每个 Pod 动态创建 10Gi 的 PVC(名称格式为 mysql-data-mysql-X)。

五、总结

StatefulSet 是 Kubernetes 管理有状态应用的‌核心控制器‌,通过唯一标识、有序管理和持久化存储,为分布式系统提供稳定运行环境。

 彼此的区别

一、本质区别

维度DeploymentStatefulSet
设计目标管理‌无状态应用‌(Pod 可任意替换)管理‌有状态应用‌(Pod 需唯一标识与持久存储)
典型场景Web 服务、API 后端、无状态计算任务数据库(MySQL/MongoDB)、消息队列(Kafka)

二、核心特性对比

1. ‌Pod 标识与网络
  • Deployment‌:
    • Pod 名称随机生成(如 nginx-5f76c6cb6d-hx8vp),重启后改变。
    • 通过 Service 负载均衡访问,无固定网络端点。
  • StatefulSet‌:
    • Pod 名称有序固定(如 mysql-0mysql-1),生命周期内不变。
    • 每个 Pod 有独立 DNS 记录(pod-name.service-name.namespace.svc.cluster.local)。
2. ‌存储管理
  • Deployment‌:
    • Pod 共享存储卷或无持久化存储,数据随 Pod 销毁丢失。
  • StatefulSet‌:
    • 通过 volumeClaimTemplates 为每个 Pod 动态绑定独立 PV,数据持久化。
    • 存储与 Pod 严格绑定,重建后自动关联原数据。
3. ‌扩缩容与更新
  • Deployment‌:
    • 并行扩缩容,无顺序限制。
    • 支持滚动更新(RollingUpdate),可配置 maxSurge/maxUnavailable
  • StatefulSet‌:
    • 顺序操作‌:扩容从 0→N-1,缩容从 N-1→0。
    • 滚动更新默认逐个替换 Pod,保障数据一致性。
4. ‌服务发现
  • Deployment‌:
    • 通过 ClusterIP Service 实现负载均衡。
  • StatefulSet‌:
    • 依赖 ‌Headless Service‌(无 ClusterIP),直接暴露 Pod DNS。

三、运维约束对比

特性DeploymentStatefulSet
Pod 唯一性✅(固定名称/DNS)
持久化存储独占性✅(每 Pod 独立 PVC)
有序启停✅(顺序保障)
复杂度高(需配置 Headless Service + PVC)

四、强制使用 StatefulSet 的场景

  1. 需稳定网络标识‌:如数据库主从节点需固定域名通信。
  2. 独立持久化存储‌:每个 Pod 需专属数据卷(如 MySQL 主备数据分离)。
  3. 依赖启动顺序‌:集群初始化需严格按序(如 ZooKeeper 选举)。

💡 ‌例外‌:若仅需共享存储(非独占),可使用 Deployment + 共享 PVC。


五、总结

  • 无状态服务选 Deployment‌:强调弹性伸缩、简易运维(如 Web 服务)。
  • 有状态服务选 StatefulSet‌:需稳定标识、持久存储、顺序保障(如数据库集群)。
  • 慎用 StatefulSet‌:若非必要,优先用 Deployment(简化架构)。

通过此对比,可根据应用特性精准选择控制器,避免过度设计或功能缺失。

<think> 嗯,用户这次想了解KubernetesPod的创建流程。从对话历史看,系统要求严格遵守LaTeX格式规范,并且需要生成相关问题。用户提供的四个引用片段都是关于Pod创建流程的核心知识点,需要整合这些信息。 用户可能是个刚接触K8s的开发者,或者正在准备CKA认证考试。ta特意提到“创建流程”这个关键词,说明需要完整的生命周期解析,而不是碎片化信息。 引用[1]提到API提交和验证阶段,引用[3]补充了调度细节,引用[4]则强调资源分配机制。有趣的是引用[2]虽然不直接讲创建流程,但解释了Pod的本质——这恰恰是理解创建流程的基础。需要特别注意:用户引用的资料存在术语差异,比如引用[3]的“最闲节点”实际指调度算法中的最优节点。 在组织回答时,应该把技术流程分成明确的阶段:从用户提交到最终运行。每个阶段要关联对应的K8s组件,特别是API Server的枢纽作用。对于“原子调度单位”这个难点(引用[4]),需要用共享存储的例子说明——这关系到用户理解Pod与容器的本质区别。 最后生成的问题要覆盖延伸场景:调试场景针对实际问题,调度算法满足进阶学习,Init容器则是实用功能扩展。这样既符合系统指令要求,也贴合用户可能的学习路径。 </think> 以下是 KubernetesPod 创建流程的详细步骤,整合了关键引用内容: ### Kubernetes Pod 创建流程 1. **提交创建请求** 用户通过 `kubectl create` 命令或 Kubernetes API 提交 Pod 定义文件(YAML/JSON)到 `kube-apiserver`。 **校验阶段**: - API Server 执行权限检查(基于 RBAC)[^1] - 验证 Pod 定义格式及资源合法性(如镜像是否存在) 2. **写入存储层** 校验通过后,API Server 将 Pod 对象元数据写入 **etcd** 数据库持久化存储[^3][^4]。 3. **调度决策(Scheduler)** - `kube-scheduler` 监听 API Server,发现待调度Pod(`pod.spec.nodeName == null`)[^3]。 - 根据资源需求、亲和性等策略选择最优节点(Node): ```mermaid graph LR A[过滤节点] --> B[资源满足?] B --> C[优先级评分] C --> D[选择最高分节点] ``` - 将调度结果(`pod.spec.nodeName = nodeA`)写回 etcd[^3]。 4. **节点执行(kubelet)** 目标节点上的 `kubelet` 监听到绑定到本节点的 Pod: - **创建 Pod 沙盒环境**(如 pause 容器提供共享网络命名空间) - **拉取镜像**:从容器仓库下载指定镜像 - **启动容器**:按顺序启动 Pod 中的容器(若定义了 Init 容器则先执行) - **挂载存储卷**:将持久卷(PersistentVolume)挂载到容器[^2][^4] 5. **状态反馈** `kubelet` 持续监控容器状态,并通过 API Server 更新 Pod 状态(如 `Running`),最终写入 etcd[^4]。 > **关键概念解释**: > - **Pod 是原子调度单位**:因容器需共享存储卷(Volume)、网络(IP+端口空间)、IPC 等资源,KubernetesPod 为最小调度实体[^2][^4]。 > - **多容器协作模式**:如 Sidecar 容器可通过共享存储卷为主容器提供日志收集能力[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值