文档首页/ 云容器引擎 CCE/ 用户指南/ 工作负载/ 创建工作负载/ 创建有状态负载(StatefulSet)
更新时间:2025-06-30 GMT+08:00
分享

创建有状态负载(StatefulSet)

有状态负载(StatefulSet)是指那些在运行过程中需要保存数据或状态的应用,例如数据库、缓存服务、消息队列等。与无状态工作负载不同,有状态负载存在以下特点:

  • 固定标识符:有状态工作负载中的每个Pod都有一个固定的标识符,这个标识符与Pod的名字相关联,格式通常为“<StatefulSet名称>-<序号>”,例如一个名为web的StatefulSet,则Pod名称分别为web-0、web-1等。这种命名机制使得各个Pod即使在重启或迁移后,也能保持其身份和数据的持久性。
  • 有序部署和扩缩:StatefulSet中的Pod按照固定的顺序进行部署、扩展或删除。例如,扩展操作总是先增加序号较高的Pod;缩容时则是先删除序号较高的Pod。这种方式对于需要有序启动或停止的有状态应用至关重要,比如数据库集群中的主从复制等场景。
  • 持久化存储:为了保障数据的持久性,StatefulSet可以使用动态挂载(VolumeClaimTemplate)来为每个Pod分配稳定的持久化存储卷。即使Pod被重新调度到不同的节点,也可以通过PVC重新挂载之前的数据卷,保证数据不丢失。

约束与限制

  • 当您删除或扩缩有状态负载时,为保证数据安全,系统并不会删除它所关联的存储卷。
  • 当您删除一个有状态负载时,为实现有状态负载中的Pod可以有序停止,请在删除之前将副本数缩容到0。
  • 您需要在创建有状态负载的同时,创建一个Headless Service,用于解决有状态负载Pod互相访问的问题,详情请参见Headless Service
  • 节点不可用时,Pod状态变为“未就绪”,此时需要手工删除有状态工作负载的Pod,Pod实例才会迁移到正常节点上。

前提条件

  • 在创建工作负载前,您需要存在一个可用集群。若没有可用集群 ,请参照购买Standard/Turbo集群中内容创建。
  • 工作负载需要运行在节点上,因此集群中需要包含可用节点。如果集群中无可用节点,请参见创建节点进行创建。

通过控制台创建

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”
  3. 配置工作负载的基本信息

    参数

    说明

    负载类型

    选择有状态工作负载StatefulSet。关于不同工作负载类型的介绍请参见工作负载概述

    负载名称

    填写工作负载的名称。请输入1到63个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。

    命名空间

    选择工作负载的命名空间,默认为default。您可以单击后面的“创建命名空间”,命名空间的详细介绍请参见创建命名空间

    实例数量

    填写实例的数量,即工作负载Pod的数量。

    容器运行时

    CCE Standard集群默认使用普通运行时,CCE Turbo集群可以使用普通运行时或安全运行时。具体区别请参见安全运行时与普通运行时

    时区同步

    选择是否开启时区同步。开启后容器与节点使用相同时区(时区同步功能依赖容器中挂载的本地磁盘,请勿修改删除),时区同步详细介绍请参见设置容器与节点时区同步

  4. 填写工作负载的容器配置

    • 容器信息:Pod中可以配置多个容器,您可以单击右侧“添加容器”为Pod配置多个容器。

      单个Pod内如果配置了多个容器,请确保每个容器中使用的端口不冲突 ,否则工作负载将会部署失败。

      • 基本信息:配置容器的基本信息。

        参数

        说明

        容器名称

        为容器命名。

        更新策略

        镜像更新/拉取策略。可以勾选“总是拉取镜像”,表示每次都从镜像仓库拉取镜像;如不勾选则优使用节点已有的镜像,如果没有这个镜像再从镜像仓库拉取。

        镜像名称

        单击后方“选择镜像”,选择容器使用的镜像。

        • 容器镜像服务 共享版:提供简单易用、安全可靠的镜像管理功能。
          • 我的镜像:可选择您上传的私有镜像。关于上传镜像的操作详情请参见客户端上传镜像
          • 镜像中心:可选择SWR提供的公共镜像。关于镜像中心的说明请参见镜像中心
          • 共享镜像:可选择由其他账号共享的镜像。关于共享镜像的操作详情请参见共享私有镜像
        • 容器镜像服务 企业版:提供企业级的独享安全托管服务,支持镜像加签、镜像安全扫描,保障数据安全。
          • 所属实例:选择企业版仓库实例,您需要提前购买一个企业版仓库,详情请参见购买仓库
          • 域名:企业版仓库支持配置多个自定义域名,您可以选择采用默认域名或自定义域名。关于自定义域名的操作详情请参见域名管理

        如果需要使用第三方镜像,可直接输入镜像地址,但需同时保证使用的镜像访问凭证可访问镜像仓库,详情请参见使用第三方镜像

        如果使用SWR容器镜像服务企业版镜像,需同时保证使用的镜像访问凭证可访问SWR企业版镜像仓库,详情请参见使用SWR企业版镜像仓库镜像

        镜像版本

        选择需要部署的镜像版本。

        CPU配额

        • 申请:容器需要使用的最小CPU值,默认0.25Core。
        • 限制:允许容器使用的CPU最大值,防止占用过多资源。

        如不填写申请值和限制值,表示不限制配额。申请值和限制值的配置说明及建议请参见设置容器规格

        内存配额

        • 申请:容器需要使用的内存最小值,默认512MiB。
        • 限制:允许容器使用的内存最大值。如果超过,容器会被终止。

        如不填写申请值和限制值,表示不限制配额。申请值和限制值的配置说明及建议请参见设置容器规格

        GPU配额(可选)

        当集群中包含GPU节点时,才能设置GPU配额,且集群中需安装CCE AI套件(NVIDIA GPU)插件。

        • 不使用:表示不使用GPU。
        • GPU 整卡:单个容器独享GPU。
        • GPU 虚拟化:容器需要使用的GPU百分比,例如设置为10%,表示该容器需使用GPU资源的10%。

        关于如何在集群中使用GPU,请参见使用Kubernetes默认GPU调度

        NPU配额(可选)

        使用NPU芯片的数量,必须为整数,且必须安装CCE AI套件(Ascend NPU)插件后才能使用。

        关于如何在集群中使用NPU,请参见NPU整卡调度

        特权容器(可选)

        特权容器是指容器里面的程序具有一定的特权。

        若选中,容器将获得超级权限,例如可以操作宿主机上面的网络设备、修改内核参数等。

        初始化容器(可选)

        选择容器是否作为初始化(Init)容器。初始化(Init)容器不支持设置健康检查。

        Init容器是一种特殊容器,可以在Pod中的其他应用容器启动之前运行。每个Pod中可以包含多个容器,同时Pod中也可以有一个或多个先于应用容器启动的Init容器,当所有的Init 容器运行完成时,Pod中的应用容器才会启动并运行。详细说明请参见Init 容器

        容器启动项(可选)

        为容器添加启动项参数,详情请参见Pod参数。CCE当前支持以下容器启动项参数:

        • stdin:为容器开启标准输入,允许从外部源(如终端或其他输入流)接收输入。
        • tty:为容器分配一个虚拟终端,允许您像在本地终端中一样向容器发送命令。

          一般需要同时开启stdin,表示将终端(tty)绑定到容器的标准输入(stdin)上,可以支持类似于kubectl exec -i -t命令的交互式操作,但区别在于该参数在Pod启动时就已经配置完成。

      • 生命周期(可选):在容器的生命周期的特定阶段配置需要执行的操作,例如启动命令、启动后处理和停止前处理,详情请参见设置容器生命周期
      • 健康检查(可选):根据需求选择是否设置存活探针、就绪探针及启动探针,详情请参见设置容器健康检查
      • 环境变量(可选):支持通过键值对的形式为容器运行环境设置变量,可用于把外部信息传递给Pod中运行的容器,可以在应用部署后灵活修改,详情请参见设置环境变量
      • 数据存储(可选):在容器内挂载本地存储或云存储,不同类型的存储使用场景及挂载方式不同,详情请参见存储
      • 安全设置(可选):对容器权限进行设置,保护系统和其他容器不受其影响。请输入用户ID,容器将以当前用户权限运行。
      • 容器日志(可选):容器标准输出日志将默认上报至 AOM 服务,无需独立配置。您可以手动配置日志采集路径,详情请参见通过ICAgent采集容器日志(不推荐)

        如需要关闭当前负载的标准输出,您可在“高级配置 > 标签与注解”中添加键为kubernetes.AOM.log.stdout,值为[]的注解,即可关闭当前负载下全部容器的标准输出。该注解的使用方法请参见表1

    • 镜像访问凭证:用于访问镜像仓库的凭证,默认取值为default-secret,使用default-secret可访问SWR共享版镜像仓库的镜像。default-secret详细说明请参见default-secret
    • GPU显卡(可选):默认为不限制。当集群中存在GPU节点时,工作负载实例可以调度到指定GPU显卡类型的节点上。

  5. 填写工作负载关联的实例间发现服务配置(即Headless Service)。

    Headless Service用于解决StatefulSet内Pod互相访问的问题,Headless Service给每个Pod提供固定的访问域名。具体请参见Headless Service

  6. (可选)填写工作负载关联的服务配置

    服务(Service)可为Pod提供外部访问。每个Service有一个固定IP地址,Service将访问流量转发给Pod,而且Service可以为这些Pod自动实现负载均衡。

    您也可以在创建完工作负载之后再创建Service,不同类型的Service概念和使用方法请参见服务概述

  7. (可选)填写工作负载中的高级配置

    参数

    说明

    升级策略

    指定工作负载的升级方式及升级参数,支持滚动升级和替换升级,详情请参见工作负载升级与回退

    实例管理策略

    对于某些分布式系统来说,StatefulSet 的顺序性保证是不必要和/或者不应该的。 这些系统仅要求唯一性和身份标志。

    • 有序策略:默认实例管理策略,有状态负载会逐个的、按顺序地进行部署、删除、伸缩实例, 只有前一个实例部署Ready或者删除完成后,有状态负载才会操作后一个实例。
    • 并行策略:支持有状态负载并行创建或者删除所有的实例,有状态负载发生变更时立刻在实例上生效。

    调度策略

    通过配置亲和与反亲和规则,可实现灵活的工作负载调度,支持负载亲和与节点亲和。

    • 负载亲和:提供常用的负载亲和策略,快速实现负载亲和部署。
      • 不配置:不设置负载亲和策略。
      • 优先多可用区部署:通过设置Pod间反亲和(podAntiAffinity)实现,优先将工作负载的Pod调度到不同可用区的节点上。
      • 强制多可用区部署:通过设置Pod间反亲和(podAntiAffinity)实现,强制将工作负载的Pod调度到不同可用区的节点上,如集群下节点支持的可用区数量小于实例数,工作负载的Pod无法全部运行。
      • 自定义亲和策略:根据需求自定义设置亲和与反亲和规则,详情请参见设置工作负载亲和/反亲和调度(podAffinity/podAntiAffinity)
    • 节点亲和:提供常用的负载亲和策略,快速实现负载亲和部署。
      • 不配置:不设置节点亲和策略。
      • 指定节点调度:通过设置节点亲和(nodeAffinity)实现,指定工作负载的Pod部署的节点,若不指定,将根据集群默认调度策略随机调度。
      • 指定节点池调度:通过设置节点亲和(nodeAffinity)实现,指定工作负载的Pod部署的节点池,若不指定,将根据集群默认调度策略随机调度。
      • 自定义亲和策略:根据需求自定义设置亲和与反亲和规则,详情请参见设置节点亲和调度(nodeAffinity)

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)负载调度到带有与之匹配的污点的节点上,也可用于控制负载所在的节点被标记污点后负载的驱逐策略,详情请参见设置容忍策略

    标签与注解

    以键值对形式为工作负载Pod添加标签或注解,填写完成后需单击“确认添加”。关于标签与注解的作用及配置说明,请参见设置标签与注解

    DNS配置

    为工作负载单独配置DNS策略,详情请参见工作负载DNS配置说明

    性能管理配置

    使用应用性能管理(APM)服务,为JAVA程序提供更精准的问题分析与定位,详情请参见设置性能管理配置

    网络配置

    • Pod入/出口带宽限速:支持为Pod设置入/出口带宽限速,详情请参见为Pod配置QoS
    • 是否开启固定IP:仅支持该功能的集群显示该选项,开启后可设置Pod IP的回收时间间隔,详情请参见为Pod配置固定IP
    • 是否开启指定容器网络配置:仅支持该功能的集群显示该选项,开启指定容器网络配置,工作负载使用指定的容器网络配置中的容器子网跟安全组来创建,详情请参见使用容器网络配置为命名空间/工作负载绑定子网及安全组
    • 指定容器网络配置名:只支持选择关联资源类型为工作负载类型的自定义容器网络配置。
    • IPv6共享带宽:仅支持该功能的集群显示该选项,开启后可为Pod的IPv6双栈网卡绑定共享带宽,详情请参见为IPv6双栈网卡的Pod配置共享带宽

  8. 单击右下角“创建工作负载”,等待一段时间后,工作负载状态为“运行中”。

通过kubectl命令行创建

本示例以nginx为例,并使用volumeClaimTemplates动态挂载云硬盘。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建一个名为nginx-statefulset.yaml的文件。

    其中,nginx-statefulset.yaml为自定义名称,您可以随意命名。

    vi nginx-statefulset.yaml

    以下内容仅为示例,若需要了解StatefulSet的详细内容,请参考Kubernetes官方文档

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: container-1
              image: nginx:latest
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  cpu: 250m
                  memory: 512Mi
                limits:
                  cpu: 250m
                  memory: 512Mi
              volumeMounts:
                - name: test
                  readOnly: false
                  mountPath: /usr/share/nginx/html
                  subPath: ''
          imagePullSecrets:
            - name: default-secret
          dnsPolicy: ClusterFirst
          volumes: []
      serviceName: nginx-svc
      replicas: 2
      volumeClaimTemplates:  #动态挂载云硬盘示例
        - apiVersion: v1
          kind: PersistentVolumeClaim
          metadata:
            name: test
            namespace: default
            annotations:
              everest.io/disk-volume-type: SAS  # 云硬盘的类型
            labels:
              failure-domain.beta.kubernetes.io/region: cn-north-4  #云硬盘所在的区域
              failure-domain.beta.kubernetes.io/zone: cn-north-4b   #云硬盘所在的可用区,必须和工作负载部署的节点可用区一致
          spec:
            accessModes:
              - ReadWriteOnce  # 云硬盘必须为ReadWriteOnce
            resources:
              requests:
                storage: 10Gi
            storageClassName: csi-disk #StorageClass的名称,云硬盘为csi-disk
      updateStrategy:
        type: RollingUpdate

    创建一个名为nginx-headless.yaml的文件。

    vi nginx-headless.yaml

    内容如下:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
      namespace: default
      labels:
        app: nginx
    spec:
      selector:
        app: nginx
        version: v1
      clusterIP: None
      ports:
        - name: nginx
          targetPort: 80
          nodePort: 0
          port: 80
          protocol: TCP
      type: ClusterIP

  3. 创建工作负载。

    kubectl create -f nginx-statefulset.yaml

    回显如下,表示有状态工作负载(StatefulSet)已创建成功。

    statefulset.apps/nginx created

    创建对应headless服务。

    kubectl create -f nginx-headless.yaml

    回显如下,表示对应headless服务已创建成功。

    service/nginx-svc created

  4. 工作负载需要被访问(集群内访问或节点访问),您需要设置访问方式,具体请参见网络创建对应服务。

相关文档

相关文档