创建有状态负载(StatefulSet)
操作场景
在运行过程中会保存数据或状态的工作负载称为“有状态工作负载(statefulset)”。例如MySQL,它需要存储产生的新数据。
因为容器可以在不同主机间迁移,所以在宿主机上并不会保存数据,这依赖于CCE提供的高可用存储卷,将存储卷挂载在容器上,从而实现有状态工作负载的数据持久化。
约束与限制
- 当您删除或扩缩有状态负载时,为保证数据安全,系统并不会删除它所关联的存储卷。
- 当您删除一个有状态负载时,为实现有状态负载中的Pod可以有序停止,请在删除之前将副本数缩容到0。
- 您需要在创建有状态负载的同时,创建一个Headless Service,用于解决有状态负载Pod互相访问的问题,详情请参见Headless Service。
前提条件
- 在创建容器工作负载前,您需要存在一个可用集群。若没有可用集群,请参照购买Autopilot集群中内容创建。
- 在创建容器工作负载前,您需要配置访问SWR和OBS服务的VPC终端节点,详情请参见配置访问SWR和OBS服务的VPC终端节点。
- 若工作负载需要被外网访问,请为工作负载创建负载均衡类型的服务。
单个实例(Pod)内如果有多个容器,请确保容器使用的端口不冲突 ,否则部署会失败。
通过控制台创建
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”。
- 配置工作负载的信息。
基本信息
- 负载类型:选择有状态工作负载StatefulSet。
- 负载名称:填写工作负载的名称。请输入1到63个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。
- 命名空间:选择工作负载的命名空间,默认为default。您可以单击后面的“创建命名空间”,命名空间的详细介绍请参见创建命名空间。
- 实例数量:填写实例的数量,即工作负载Pod的数量。
容器配置- 容器信息
Pod中可以配置多个容器,您可以单击右侧“添加容器”为Pod配置多个容器。
- 基本信息:配置容器的基本信息。
参数
说明
容器名称
为容器命名。
更新策略
镜像更新/拉取策略。可以勾选“总是拉取镜像”,表示每次都从镜像仓库拉取镜像;如不勾选则优使用节点已有的镜像,如果没有这个镜像再从镜像仓库拉取。
镜像名称
单击后方“选择镜像”,选择容器使用的镜像。
如果需要使用第三方镜像,请参见使用第三方镜像。
镜像版本
选择需要部署的镜像版本。
CPU配额
CPU资源限制值,即允许容器使用的CPU最大值,防止占用过多资源。
内存配额
内存资源限制值,即允许容器使用的内存最大值。如果超过,容器会被终止。
初始化容器(可选)
选择容器是否作为初始化(Init)容器。初始化(Init)容器不支持设置健康检查。
Init容器是一种特殊容器,可以在Pod中的其他应用容器启动之前运行。每个Pod中可以包含多个容器,同时Pod中也可以有一个或多个先于应用容器启动的Init容器,当所有的Init 容器运行完成时,Pod中的应用容器才会启动并运行。详细说明请参见Init容器。
- 生命周期(可选):在容器的生命周期的特定阶段配置需要执行的操作,例如启动命令、启动后处理和停止前处理,详情请参见设置容器生命周期。
- 健康检查(可选):根据需求选择是否设置存活探针、就绪探针及启动探针,详情请参见设置容器健康检查。
- 环境变量(可选):支持通过键值对的形式为容器运行环境设置变量,可用于把外部信息传递给Pod中运行的容器,可以在应用部署后灵活修改,详情请参见设置环境变量。
- 数据存储(可选):在容器内挂载本地存储或云存储,不同类型的存储使用场景及挂载方式不同。
- 有状态负载支持“动态挂载”存储。
动态挂载通过volumeClaimTemplates字段实现,并依赖于StorageClass动态创建能力。有状态工作负载通过volumeClaimTemplates字段为每一个Pod关联了一个独有的PVC,而这个PVC又会和对应的PV绑定。因此当Pod被重新调度后,仍然能够根据该PVC名称挂载原有的数据。
- 负载创建完成后,动态挂载的存储不支持更新。
- 有状态负载支持“动态挂载”存储。
- 安全设置(可选):对容器权限进行设置,保护系统和其他容器不受其影响。请输入用户ID,容器将以当前用户权限运行。
- 基本信息:配置容器的基本信息。
- 镜像访问凭证:用于访问镜像仓库的凭证,默认取值为default-secret,使用default-secret可访问SWR镜像仓库的镜像。default-secret详细说明请参见default-secret。
实例间发现服务配置
Headless Service用于解决StatefulSet内Pod互相访问的问题,Headless Service给每个Pod提供固定的访问域名。具体请参见Headless Service。
服务配置(可选)
服务(Service)可为Pod提供外部访问。每个Service有一个固定IP地址,Service将访问流量转发给Pod,而且Service可以为这些Pod自动实现负载均衡。
您也可以在创建完工作负载之后再创建Service,不同类型的Service概念和使用方法请参见服务(Service)。
高级配置(可选)- 升级策略:指定工作负载的升级方式及升级参数,支持滚动升级和替换升级,详情请参见设置工作负载升级策略。
- 实例管理策略(podManagementPolicy):
对于某些分布式系统来说,StatefulSet的顺序性保证是不必要和/或者不应该的。 这些系统仅仅要求唯一性和身份标志。
- 有序策略:默认实例管理策略,有状态负载会逐个的、按顺序的进行部署、删除、伸缩实例,只有前一个实例部署Ready或者删除完成后,有状态负载才会操作后一个实例。
- 并行策略:支持有状态负载并行创建或者删除所有的实例,有状态负载发生变更时立刻在实例上生效。
- 标签与注解:以键值对形式为工作负载Pod添加标签或注解,填写完成后需单击“确认添加”。关于标签与注解的作用及配置说明,请参见设置标签与注解。
- DNS配置:为工作负载单独配置DNS策略,详情请参见工作负载DNS配置说明。
- 单击右下角“创建工作负载”。
通过kubectl命令行创建
Autopilot集群暂不支持配置节点亲和与反亲和,所以当您使用kubectl命令行创建工作负载时,为避免Pod创建失败,请不要配置affinity字段。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建一个名为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 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
- 创建工作负载以及对应headless服务。
kubectl create -f nginx-statefulset.yaml
回显如下,表示有状态工作负载(stateful)已创建成功。
statefulset.apps/nginx created
kubectl create -f nginx-headless.yaml
回显如下,表示对应headless服务已创建成功。
service/nginx-svc created
- 若工作负载需要被访问(集群内访问或节点访问),您需要设置访问方式,具体请参见服务(Service)创建对应服务。