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(简化架构)。

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

### Kubernetes 创建 Pod 的详细流程 #### 1. 请求提交至 API Server 当用户通过 `kubectl` 或其他方式发送创建 Pod 的请求时,该请求会被转发给 Kubernetes 集群中的核心组件——API Server。API Server 负责接收并处理所有的 RESTful 请求,并对其进行验证和授权检查[^2]。 #### 2. 数据存储于 Etcd 经过验证后的 Pod 定义数据被转换为内部对象模型(通常是 YAML 或 JSON 格式),随后由 API Server 将其持久化到分布式键值数据库 Etcd 中。这一过程确保了集群的状态能够被可靠地记录下来。 #### 3. Scheduler 进行调度决策 一旦 Pod 对象的信息成功存入 Etcd 后,Scheduler 组件便会监控这些新加入但尚未分配节点的新 Pods 。它依据预定义策略挑选最合适的 Node 来承载此 Pod ,并将绑定关系更新回 Etcd 上面去[^1]。 #### 4. Kubelet 执行实际部署工作 每个 Worker Node 上运行着一个名为 Kubelet 的代理程序实例;当某个特定 Node 成功获得了一个待执行的 Pod 分配之后,本地对应的 Kubelet 实体会主动拉取最新的配置详情,并据此启动相应的容器环境。具体来说就是调用了 Docker Daemon (或者其他兼容 OCI 标准的 runtime)来完成最终镜像下载与实例化的动作[^3]。 在此期间,Kubelet还会定期向 APIServer 报告当前所管理范围内各个资源单元的实际健康状况以及其他元数据信息以便全局视图保持最新状态同步。 ```python # 示例 Python 伪代码展示如何模拟简单的调度逻辑 class Scheduler: def __init__(self, nodes): self.nodes = nodes def select_node(self, pod_requirements): best_fit_node = None for node in self.nodes: if meets_criteria(node, pod_requirements): # 假设有一个函数判断是否满足条件 best_fit_node = node return best_fit_node ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值