当前位置: 首页 > news >正文

【kubernetes】--Controller(StatefulSet)

文章目录

  • 有状态无状态
    • (1)无状态--deployment
    • (2)有状态--statefulset
  • Kubernetes StatefulSet 控制器详解
    • 1. StatefulSet 的核心特性
      • (1) 稳定的 Pod 标识
      • (2) 有序部署与扩展
      • (3) 持久化存储
      • (4) 稳定的网络标识
    • 2. StatefulSet 的典型应用场景
    • 3. StatefulSet 的工作流程
    • 4. StatefulSet 的关键操作
      • (1) 扩容与缩容
      • (2) 更新策略
      • (3) 删除 StatefulSet
    • 5. StatefulSet 的注意事项
    • 6.案列
    • 7. 对比 StatefulSet 与 Deployment

有状态无状态

(1)无状态–deployment

  • 认为pod都是一样的
  • 没有顺序要求
  • 不用考虑在哪个pod上运行
  • 随意扩展和伸缩

(2)有状态–statefulset

  • 上面因素都要考虑到
  • 每个pod是独立的,保持pod的启动顺序和唯一性
  • 唯一网络标识符,持久存储
  • 有序(比如mysql主从)

Kubernetes StatefulSet 控制器详解

StatefulSet 是 Kubernetes 中用于管理 有状态应用(Stateful Applications) 的核心控制器,它确保 Pod 拥有稳定的标识、有序部署/扩展、持久化存储和稳定的网络身份。与 Deployment(适用于无状态应用)不同,StatefulSet 为每个 Pod 提供唯一的标识,并保证其生命周期中的可预测性。

StatefulSet 是 Kubernetes 管理有状态应用的核心控制器,通过 唯一标识、有序性、持久化存储和稳定网络 满足数据库、消息队列等场景的需求。正确使用时需注意存储配置、更新策略和备份方案。

1. StatefulSet 的核心特性

(1) 稳定的 Pod 标识

  • 每个 Pod 的名称是 唯一且有序 的,格式为 <statefulset-name>-<ordinal-index>(如 mysql-0mysql-1)。
  • Pod 重启后名称不变,且会绑定到相同的持久化存储。
    在这里插入图片描述
    在这里插入图片描述
    每个pod名称都是唯一的

(2) 有序部署与扩展

  • 顺序性:Pod 按索引顺序创建(从 0N-1)、删除(从 N-10)。
    • 例如,扩容时先创建 mysql-1,再创建 mysql-2;缩容时先删除 mysql-2,再删除 mysql-1
  • 适用场景:主从架构的数据库(如 MySQL 主库需先于从库启动)。

(3) 持久化存储

  • 通过 PersistentVolume (PV)PersistentVolumeClaim (PVC) 为每个 Pod 提供独立的存储。
    • 删除 Pod 后,关联的 PVC 和 PV 不会被删除,数据得以保留。
    • 重新调度时,Pod 会绑定到原来的 PVC。

(4) 稳定的网络标识

  • 每个 Pod 拥有稳定的 DNS 名称:
    • Pod 专属域名<pod-name>.<headless-service-name>.<namespace>.svc.cluster.local
    • 例如:mysql-0.mysql.default.svc.cluster.local
  • 通过 Headless Service(无头服务)暴露 Pod,直接解析到 Pod IP。

2. StatefulSet 的典型应用场景

  • 数据库集群:MySQL、PostgreSQL、MongoDB 等。
  • 分布式存储系统:Etcd、ZooKeeper、Redis Cluster。
  • 消息队列:Kafka、RabbitMQ(需持久化存储和固定节点标识)。

3. StatefulSet 的工作流程

  1. 创建 Headless Service
    定义一个无 ClusterIP 的 Service,用于 Pod 的网络标识。

    apiVersion: v1
    kind: Service
    metadata:name: mysql
    spec:clusterIP: None  # Headless Serviceselector:app: mysqlports:- port: 3306
    
  2. 定义 StatefulSet
    指定副本数、存储模板(volumeClaimTemplates)和 Pod 模板。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:name: mysql
    spec:serviceName: mysql  # 关联 Headless Servicereplicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7volumeMounts:- name: datamountPath: /var/lib/mysqlvolumeClaimTemplates:  # 每个 Pod 独立的 PVC- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 10Gi
    
  3. Pod 与存储的绑定

    • StatefulSet 会自动为每个 Pod 创建 PVC,名称格式为 <volumeClaimTemplate-name>-<pod-name>(如 data-mysql-0)。
    • Pod 重启或重新调度时,会绑定到相同的 PVC。

4. StatefulSet 的关键操作

(1) 扩容与缩容

  • 扩容:增加 replicas 字段,新 Pod 按顺序创建。
    kubectl scale statefulset mysql --replicas=5
    
  • 缩容:减少 replicas,Pod 按逆序终止。
    kubectl scale statefulset mysql --replicas=2
    

(2) 更新策略

  • 滚动更新(RollingUpdate):默认策略,按顺序更新 Pod(从高序号到低序号)。
    spec:updateStrategy:type: RollingUpdate
    
  • 删除重建(OnDelete):手动删除 Pod 后触发更新。
    spec:updateStrategy:type: OnDelete
    

(3) 删除 StatefulSet

  • 默认会删除 Pod 但保留 PVC(需手动清理 PVC):
    kubectl delete statefulset mysql
    kubectl delete pvc -l app=mysql  # 清理关联的 PVC
    

5. StatefulSet 的注意事项

  1. 存储依赖:必须提前配置 StorageClass 或手动创建 PV。
  2. 网络依赖:需搭配 Headless Service 实现稳定的 DNS。
  3. 性能开销:有序性可能导致部署/扩展速度较慢。
  4. 数据备份:需额外工具(如 Velero)备份 PVC 数据。

6.案列

apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx---apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx-statefulsetnamespace: default
spec:serviceName: nginxreplicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.27.5ports:- containerPort: 80

7. 对比 StatefulSet 与 Deployment

特性StatefulSetDeployment
Pod 名称唯一有序(如 web-0随机哈希(如 web-5x6d7
存储每个 Pod 独立 PVC共享或无持久化存储
网络标识稳定的 DNS通过 Service 负载均衡
部署顺序顺序创建/删除并行创建
适用场景数据库、有状态服务无状态应用(如 Web)
http://www.dtcms.com/a/276219.html

相关文章:

  • 【PTA数据结构 | C语言版】链式队列的3个操作
  • Git常用命令一览
  • pyqt5界面开发学习
  • 034_多态的实现(编译时 / 运行时)
  • 洛谷 P11961 [GESP202503 五级] 原根判断-提高+/省选-
  • Vue工程化
  • Spring Boot 基础入门与实战:从框架理解到项目搭建
  • 如何检测自动化设备中的直线导轨品质是否优良?
  • Oracle 数据库实战项目
  • SAC : 具有随机Actor的离策略最大熵深度强化学习
  • Android开发中RxJava的使用与原理
  • 杨娇兽の阴谋
  • 基于springboot+Vue的二手物品交易的设计与实现
  • 休闲项目策划与设计实训室:赋能实践育人的重要平台
  • 【学习笔记】Nginx常用安全配置
  • arcgis投影后数据显示问题记录
  • 以电商平台性能测试为例,详细描述Jmeter性能测试步骤,及如何确定用户并发数、用户启动时间、循环次数的设置
  • 算法练习6-大数乘法(高精度乘法)
  • jenkins部署vue前端项目
  • 【TA/Unity】Shader基础结构
  • TCP套接字
  • 网络配置综合实验全攻略(对之前学习的总结)
  • 医学AI前沿论坛第6期|目前主流的医学AI基础模型有哪些?我们应该如何在有限的数据下构建高性能的基础模型?
  • 某某航空 (新版)同盾 blackbox 补环境
  • 迷宫可达性统计问题详解
  • 缓存三剑客解决方案
  • 基于YOLO11的垃圾分类AI模型训练实战
  • 计算机毕业设计ssm医院耗材管理系统 基于SSM框架的医疗物资供应链管理平台 医院低值易耗品信息化监管系统
  • 解决MySql8报错:Public Key Retrieval is not allowed
  • 六年级数学知识边界总结思考-上册