# 创建有状态负载（StatefulSet）
[有状态负载（StatefulSet）](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/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](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0398.html)。
 
#### 前提条件
- 在创建工作负载前，已存在一个可用集群。若没有可用集群，请参照[购买CCE Autopilot集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0028.html)中内容创建。
- 在创建工作负载前，已配置访问镜像中心的VPC终端节点。创建集群时，系统将自动创建对应的VPC终端节点，您可以进入集群的"概览"页，在"网络信息"模块的"镜像访问"中查看是否配置终端节点。如果集群暂未配置终端节点，请参考[配置访问镜像中心的VPC终端节点](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0461.html)进行配置。
 
#### 创建有状态负载
您可以通过控制台或kubectl命令行创建有状态负载。
- [通过控制台创建]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称进入集群，在左侧选择"工作负载"，在右上角单击"创建工作负载"。
  
  3. 填写工作负载的**基本信息** 。
     
     表1工作负载的基本信息 
     | 参数  | 说明                                                                                                                                                    |
     |:---|:---|
     | 负载类型 | 选择有状态工作负载StatefulSet。关于不同工作负载类型的介绍请参见[工作负载概述](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0907.html)。                            |
     | 负载名称   | 填写工作负载的名称。请输入1到63个字符的字符串，可以包含小写英文字母、数字和中划线（-），并以小写英文字母开头，小写英文字母或数字结尾。                                                                     |
     | 命名空间  | 选择工作负载的命名空间，默认为default。您可以单击后面的"创建命名空间"，命名空间的详细介绍请参见[创建命名空间](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0278.html)。 |
     | 实例类型 | 选择工作负载的实例类型，默认为通用型。关于实例类型的详细介绍，请参见[设置实例类型](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0908.html)。                  |
     | 实例数量  | 填写实例的数量，即工作负载Pod的数量。                                                                                                                      |
        
     
     
  
  4. 填写工作负载的**容器配置** 。
     
     - 镜像缓存（可选）：如果您已创建相关的镜像缓存，可以选择自动匹配镜像缓存或指定镜像缓存，具体参数说明请参见[镜像缓存参数说明]。使用镜像缓存可以加速镜像下载，提升负载的启动速度，详情请参见[镜像缓存概述](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0157.html)。当集群版本在v1.28.8、v1.31.4及以上时支持使用镜像缓存功能。
       ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
       目前，只有部分区域支持使用镜像缓存，具体请以控制台为准。
        表2镜像缓存参数说明 
       | 参数选项      | 示例              | 选项说明                                                                                                                                                                                                                                                                                                                         |
       |:---|:---|:---|
       | 不使用      | -                | 不使用镜像缓存，按照"容器信息"中的镜像内容重新下载镜像。                                                                                                                                                                                                                                                                                              |
       | 自动匹配镜像缓存 | -               | 从所有可用的镜像缓存中自动匹配最优镜像，并且匹配顺序如下： - 镜像匹配度：选择镜像信息匹配度最高的镜像缓存。  - 创建时间：选择创建时间最新的镜像缓存。   如果集群未匹配到镜像，则不再使用镜像缓存。 |
       | 指定镜像缓存  | autopilot-test | 指定已有的镜像缓存，该镜像缓存必须为可用状态。如果您需要新建镜像缓存请单击创建镜像缓存，参数说明请参见[创建镜像缓存](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0158.html)。                                                                                                                                                                                       |
          
       
     
     - 容器信息：Pod中可以配置多个容器，您可以单击右侧"添加容器"为Pod配置多个容器。
       - 基本信息：配置容器的基本信息。
         表3容器的基本信息 
         | 参数       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
         |:---|:---|
         | 容器名称     | 为容器命名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
         | 更新策略     | 镜像更新/拉取策略。可以勾选"总是拉取镜像"，表示每次都从镜像仓库拉取镜像；如不勾选则优先使用本地已有的镜像，如果没有这个镜像再从镜像仓库拉取。 如果使用镜像缓存，建议不要勾选"总是拉取镜像"，避免重复从原镜像仓库拉取镜像。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
         | 镜像名称     | 单击后方"选择镜像"，选择容器使用的镜像。如果需要使用第三方镜像，请参见[使用第三方镜像](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0009.html)。 如果选择镜像缓存，您需要填入以下信息： - 如果您选择"自动匹配镜像缓存"：您可以在"容器信息 \> 基本信息 \> 镜像名称"中直接输入待使用的镜像名称，集群会按照[镜像缓存参数说明](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0047.html#cce_11_0047__table84021337125719)中的匹配顺序自动匹配。如果在镜像缓存中未匹配到镜像，则不再使用镜像缓存。不使用镜像缓存后，集群将在SWR镜像仓库、镜像中心依次匹配输入的镜像名称，若最终未匹配，则返回镜像拉取失败。  - 如果您选择"指定镜像缓存"：您需要在"容器信息 \> 基本信息 \> 镜像名称"中直接输入该镜像缓存中待使用的镜像的地址。 镜像地址获取方式：鼠标悬浮于指定的镜像缓存上，在出现的悬浮框中对应镜像的"镜像信息"即为镜像地址。    |
         | 镜像版本      | 选择需要部署的镜像版本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
         | CPU配额     | CPU资源限制值，即允许容器使用的CPU最大值，防止占用过多资源。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
         | 内存配额      | 内存资源限制值，即允许容器使用的内存最大值。如果超过，容器会被终止。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
         | 初始化容器（可选） | 选择容器是否作为初始化（Init）容器。初始化（Init）容器不支持设置健康检查。 Init容器是一种特殊容器，可以在Pod中的其他应用容器启动之前运行。每个Pod中可以包含多个容器，同时Pod中也可以有一个或多个先于应用容器启动的Init容器，当所有的Init 容器运行完成时，Pod中的应用容器才会启动并运行。详细说明请参见[Init容器](https://kubernetes.io/zh/docs/concepts/workloads/pods/init-containers/)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
         | 容器启动项（可选）  | 为容器添加启动项参数，详情请参见[Pod参数](https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/pod-v1/)。CCE Autopilot集群支持以下启动项参数： - stdin：为容器开启标准输入，允许从外部源（如终端或其他输入流）接收输入。  - tty：为容器分配一个虚拟终端，允许您像在本地终端中一样向容器发送命令。 一般需要同时开启stdin，表示将终端（tty）绑定到容器的标准输入（stdin）上，可以支持类似于**kubectl exec -i -t**命令的交互式操作，但区别在于该参数在Pod启动时就已经配置完成。                                                                                                                                                                               |
            
         
       
       - 生命周期（可选）：在容器的生命周期的特定阶段配置需要执行的操作，例如启动命令、启动后处理和停止前处理，详情请参见[设置容器生命周期](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0105.html)。
       
       - 健康检查（可选）：根据需求选择是否设置存活探针、就绪探针及启动探针，详情请参见[设置容器健康检查](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0112.html)。
       
       - 环境变量（可选）：支持通过键值对的形式为容器运行环境设置变量，可用于把外部信息传递给Pod中运行的容器，可以在应用部署后灵活修改，详情请参见[设置环境变量](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0113.html)。
       
       - 数据存储（可选）：在容器内挂载本地存储或云存储，不同类型的存储使用场景及挂载方式不同。
         ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
         - 有状态负载支持"动态挂载"存储。 动态挂载通过[volumeClaimTemplates](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/#volume-claim-templates)字段实现，并依赖于StorageClass动态创建能力。有状态工作负载通过volumeClaimTemplates字段为每一个Pod关联了一个独有的PVC，而这个PVC又会和对应的PV绑定。因此当Pod被重新调度后，仍然能够根据该PVC名称挂载原有的数据。
           
         
         - 负载创建完成后，动态挂载的存储不支持更新。
           
       
       - 安全设置（可选）：对容器权限进行设置，保护系统和其他容器不受其影响。请输入用户ID，容器将以当前用户权限运行。
        
     
     - 镜像访问凭证：用于访问镜像仓库的凭证，默认取值为default-secret，使用default-secret可访问SWR镜像仓库的镜像。default-secret详细说明请参见[default-secret](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0388.html#cce_11_0388__section136587457392)。
     
     
     
     
  
  5. 填写工作负载关联的**实例间发现服务配置** （即Headless Service）。
     
     Headless Service用于解决StatefulSet内Pod互相访问的问题，Headless Service给每个Pod提供固定的访问域名。具体请参见[Headless Service](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0398.html)。
     
     
  
  6. （可选）填写工作负载关联的**服务配置** 。
     
     服务（Service）可为Pod提供外部访问。每个Service有一个固定IP地址，Service将访问流量转发给Pod，而且Service可以为这些Pod自动实现负载均衡。
     您也可以在创建完工作负载之后再创建Service，不同类型的Service概念和使用方法请参见[服务（Service）](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0247.html)。
     
     
  
  7. （可选）填写工作负载关联的**高级配置** 。
     
     表4工作负载的高级配置 
     | 参数                          | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     |:---|:---|
     | 升级策略                     | 指定工作负载的升级方式及升级参数，支持滚动升级和替换升级，详情请参见[工作负载升级与回退](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0397.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                  |
     | 实例管理策略（podManagementPolicy） | 对于某些分布式系统来说，StatefulSet的顺序性保证是不必要和/或者不应该的。 这些系统仅仅要求唯一性和身份标志。 - 有序策略：默认实例管理策略，有状态负载会逐个的、按顺序地进行部署、删除、伸缩实例，只有前一个实例部署Ready或者删除完成后，有状态负载才会操作后一个实例。  - 并行策略：支持有状态负载并行创建或者删除所有的实例，有状态负载发生变更时立刻在实例上生效。                                                                                                                                                                                                          |
     | 标签与注解                     | 以键值对形式为工作负载Pod添加标签或注解，填写完成后需单击"确认添加"。关于标签与注解的作用及配置说明，请参见[设置标签与注解](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0386.html)。                                                                                                                                                                                                                                                                                                                                                                                                              |
     | DNS配置                      | 为工作负载单独配置DNS策略，详情请参见[工作负载DNS配置说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0365.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
     | 性能管理配置                    | 使用应用性能管理（APM）服务，为JAVA程序提供更精准的问题分析与定位，详情请参见[设置性能管理配置](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0055.html)。                                                                                                                                                                                                                                                                                                                                                                                                                           |
     | 网络配置                     | - 是否开启固定IP：开启固定IP功能后，Pod 每次重启，Pod IP 地址不会改变。开启后可设置Pod IP的回收时间间隔，详情请参见[为Pod配置固定IP](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0603.html)。  - 是否开启指定容器网络配置：开启指定容器网络配置，工作负载使用指定的容器网络配置中的容器子网和安全组来创建，详情请参见[使用容器网络配置为命名空间/工作负载绑定子网及安全组](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0196.html)。  - 指定容器网络配置名：只支持选择关联资源类型为工作负载类型的自定义容器网络配置。   |
        
     
     
  
  8. 在"规格确认"中，请确认以下信息： 
     1. Pod资源规格计算规则：
        - 默认情况：Pod申请的整体资源规格，基于所有初始化容器与普通容器所需CPU/内存配额计算。
        
        - 自定义配置：若您已配置Pod级别的资源配额，则以Pod级别配置数值作为最终Pod资源规格（优先级高于容器级别配置）。
         
     
     2. 请确保"单Pod临时存储"能够满足容器的需要，具体请参见[增加Pod的临时存储容量](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0867.html)。
     
     3. 计费规格说明：
        - 单Pod的实际计费规格会基于Pod资源规格向上自动规整为Autopilot支持的规格档位，具体规格档位请查看[CCE Autopilot规格说明](https://support.huaweicloud.com/productdesc-cce-autopilot/cce_12_0002.html#section1)。
        
        - 当Pod申请的资源规格低于实际计费规格时，建议使用"一键补齐"功能补足规格差值，避免资源浪费。
         
     
     4. 信息确认无误后，请勾选"我已知晓上述计费规则"。
     
     
     
     
  
  9. 单击右下角"创建工作负载"，等待一段时间后，工作负载状态为"运行中"。 
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002497574514.png "点击放大")
     
     
   
- [通过kubectl命令行创建]
  ![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/notice_3.0-zh-cn.png)
  Autopilot集群暂不支持配置节点亲和与反亲和，所以当您使用kubectl命令行创建工作负载时，为避免Pod创建失败，请不要配置affinity字段。
  1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)，使用kubectl连接集群。
  
  2. 创建一个名为nginx-statefulset.yaml的文件。 
     其中，nginx-statefulset.yaml为自定义名称，您可以随意命名。
     **vi nginx-statefulset.yaml**
     以下内容仅为示例，若需要了解statefulset的详细内容，请参考[kubernetes官方文档](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)。
     ```
     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
           imagePullSecrets:
             - name: default-secret
           dnsPolicy: ClusterFirst
       serviceName: nginx-svc
       replicas: 2
       updateStrategy:
         type: RollingUpdate
     ```
     **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. 创建工作负载以及对应headless服务。 
     **kubectl create -f nginx-statefulset.yaml**
     回显如下，表示有状态工作负载已创建成功。
     ```
     statefulset.apps/nginx created
     ```
     **kubectl create -f **nginx-headless**.yaml**
     回显如下，表示对应headless服务已创建成功。
     ```
     service/nginx-svc created
     ```
     
     
  
  4. 若工作负载需要被访问（集群内访问或外部访问），您需要设置对应的访问方式，具体请参见[服务（Service）](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0247.html)创建对应服务。
   
#### 相关文档
- 有状态工作负载支持动态挂载云硬盘存储，详情请参见：[在有状态负载中动态挂载云硬盘存储](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0616.html)。
- 如果创建工作负载时出现异常，请参见[工作负载状态异常定位方法](https://support.huaweicloud.com/cce-autopilot_faq/cce_13_0016.html)。
- 工作负载创建完成后，更多操作请参见[管理工作负载](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0007.html)。
 
