创建有状态工作负载StatefulSet
阿里云容器计算服务ACS集群支持通过界面创建StatefulSet类型的应用,满足您快速创建有状态应用的需求。本例中将创建一个Nginx的有状态应用,并演示StatefulSet应用的特性。
前提条件
使用镜像创建有状态StatefulSet应用前,请确保您已经进行以下操作:
背景信息
StatefulSet包括以下特性:
场景 | 说明 |
Pod一致性 | 包含次序(启动、停止次序)、网络一致性。此一致性与Pod相关,与被调度到哪个Node节点无关。 |
稳定的持久化存储 | 通过VolumeClaimTemplate为每个Pod创建一个PV。删除、减少副本,不会删除相关的存储卷。 |
稳定的网络标志 | Pod的 |
稳定的次序 | 对于N个副本的StatefulSet,每个Pod都在 [0,N)的范围内分配一个数字序号,且是唯一的。 |
操作步骤
登录容器计算服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏,选择 。
在有状态页面,单击使用镜像创建。
在应用基本信息页签中,设置应用的基本信息。
配置项
描述
命名空间
设置应用部署所处的命名空间,默认使用default命名空间。
应用名称
设置应用的名称。
副本数量
应用包含的Pod数量。
工作负载
定义资源对象的类型,选择有状态(StatefulSet)
标签
为该应用添加一个标签,标识该应用。
注解
为该应用添加一个注解(Annotation)。
实例类型
请选择实例类型。
时区同步
容器与节点是否使用相同的时区。
单击下一步进入容器配置页签。
设置容器相关的配置。
说明在容器配置页签上方,单击添加容器为应用的Pod设置多个容器。
容器配置的配置项及描述如下。
基本配置
参数
描述
镜像名称
单击选择镜像,选择所需的镜像并单击确定。本例中为官方Nginx镜像,可以在搜索页签中,选择Docker镜像,然后在文本框中输入nginx进行搜索。
容器镜像服务:在容器镜像服务页签中,可以选择托管在容器镜像服务ACR中的镜像。需要选择镜像所属地域,以及镜像服务实例。关于ACR的更多信息,请参见什么是容器镜像服务ACR。
说明您可以在容器镜像服务页签,根据名称搜索托管在容器镜像服务ACR中的镜像。
Docker官方镜像:在Docker官方镜像页签中,可以选择Docker官方提供的容器镜像。
用户收藏:在用户收藏页签中,可以选择您收藏的Docker官方镜像。
搜索:在搜索页签中,可以分别在ACR的特定地域和Docker官方镜像中搜索容器镜像。
镜像Tag
您可以单击选择镜像Tag选择镜像的版本。若不指定,默认为最新版。
ACS支持总是拉取镜像(Always)镜像拉取策略(imagePullPolicy)。
说明总是拉取镜像(Always)表示每次部署或扩容都会从容器镜像服务重新拉取镜像,而不会从本地拉取镜像。
单击设置镜像密钥,您可以实现免密拉取镜像。
CPU
可指定该容器预留的CPU资源额度和资源限制,默认资源额度和资源限制相等。如果需要设置不同于资源额度的资源限制,可以通过YAML创建资源方式来创建应用。
Memory
可指定该容器预留的Memory资源额度和资源限制,默认资源额度和资源限制相等。如果需要设置不同于资源额度的资源限制,可以使用YAML创建资源的方式来创建应用。
容器启动项
stdin:表示为该容器开启标准输入。
tty:表示为该容器分配一个虚拟终端,以便于向容器发送信号。
通常这两个选项是一起使用的,表示将终端(tty)绑定到容器的标准输入(stdin)上。例如,一个交互式的程序从用户获取标准输入,并显示到终端中。
初始化容器
勾选该项,表示创建一个Init Container。
Init Container提供了一种机制来阻塞或延迟应用容器的启动,Init Container执行成功后,Pod内的应用容器会并行启动。例如检测依赖服务的可用性。Init Container可以包括一些应用镜像中不存在的实用工具和安装脚本,用来初始化应用容器的运行环境,例如设置内核参数、生成配置文件。更多信息,请参见Init Containers。
可选:端口设置
设置容器的端口。
名称:设置容器端口名称。
容器端口:设置暴露的容器访问端口或端口名,端口号必须介于1~65535。
协议:支持TCP和UDP。
可选:环境变量
支持通过键值对的形式为Pod配置环境变量。用于给Pod添加环境标志或传递配置等,具体请参见Pod variable。
类型:设置环境变量的类型,支持自定义、配置项、保密字典、变量/变量引用及资源引用。配置项、保密字典支持全部文件的引用,以保密字典为例。
选择保密字典,只选择目标保密字典,则默认全部文件引用。
对应的yaml,则引用了整个Secret。
变量名称:设置环境变量名称。
变量/变量引用:设置变量引用的值。
可选:健康检查
支持存活检查(Liveness)、就绪检查(Readiness)和启动探测。存活检查用于检测何时重启容器;就绪检查确定容器是否已经就绪,且可以接受流量;启动探测用于检测何时启动容器。
说明仅Kubernetes集群1.18及之后版本支持启动探测。
关于健康检查的更多信息,请参见Configure Liveness, Readiness and Startup Probes。
请求类型
配置说明
HTTP请求
即向容器发送一个HTTP GET请求,支持的参数包括:
协议:HTTP/HTTPS。
路径:访问HTTP server的路径。
端口:容器暴露的访问端口或端口名,端口号必须介于1~65535。
HTTP头:即HTTP Headers,HTTP请求中自定义的请求头,HTTP允许重复的Header。支持键值对的配置方式。
延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为3秒。
执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为10秒,最小为1秒。
超时时间(秒):即timeoutSeconds,探测超时时间。默认1秒,最小1秒。
健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(Liveness)必须是1。
不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。
TCP连接
即向容器发送一个TCP Socket,kubelet将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。支持的参数包括:
端口:容器暴露的访问端口或端口名,端口号必须介于1~65535。
延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为15秒。
执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为10秒,最小为1秒。
超时时间(秒):即timeoutSeconds,探测超时时间。默认1秒,最小1秒。
健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(Liveness)必须是1。
不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。
命令行
通过在容器中执行探针检测命令,来检测容器的健康情况。支持的参数包括:
命令行:用于检测容器健康情况的探测命令。
延迟探测时间(秒):即initialDelaySeconds,容器启动后第一次执行探测时需要等待多少秒,默认为5秒。
执行探测频率(秒):即periodSeconds,指执行探测的时间间隔,默认为10秒,最小为1秒。
超时时间(秒):即timeoutSeconds,探测超时时间。默认1秒,最小1秒。
健康阈值:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1,最小值是1。对于存活检查(Liveness)必须是1。
不健康阈值:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3,最小值是1。
生命周期
您可以为容器的生命周期配置启动执行、启动后处理和停止前处理。具体参见配置生命周期。
启动执行:为容器设置预启动命令和参数。
启动后处理:为容器设置启动后的命令。
停止前处理:为容器设置预结束命令。
可选:数据卷
支持增加本地存储、云存储声明(PVC)或增加存储声明模板。
本地存储:支持配置项(ConfigMap)、保密字典(Secret)和临时目录,将对应的挂载源挂载到容器路径中。更多信息,请参见Volumes。
增加云存储声明(PersistentVolumeClaim):支持云存储。
本例中配置了一个云存储类型的数据卷声明disk-ssd,将其挂载到容器的/tmp路径下。
完成容器配置后,单击下一步。
可选:进行高级配置。
访问设置
说明针对应用的通信需求,您可灵活进行访问设置:
内部应用:对于只在集群内部工作的应用,您可根据需要创建ClusterIP类型的服务,来进行内部通信。
外部应用:对于需要暴露到公网的应用,您可以采用两种方式进行访问设置。
创建LoadBalancer类型的服务:使用阿里云提供的负载均衡服务SLB(Server Load Balancer),该服务提供公网访问能力。
创建路由(Ingress):通过路由(Ingress)提供公网访问能力,详情请参见Ingress。
您可以设置暴露后端Pod的方式。本例中选择ClusterIP服务和路由(Ingress),构建一个公网可访问的Nginx应用。
配置项
描述
服务(Service)
在服务(Service)右侧,单击创建设置创建服务的配置项。配置项的详情,请参见使用Service对外暴露应用。本例中服务类型选择ClusterIP。
路由(Ingress)
在路由(Ingress)右侧,单击创建。在弹出的对话框中,为后端Pod配置路由规则。详细的路由配置信息,请参见创建Nginx Ingress。
说明通过镜像创建应用时,您仅能为一个服务创建路由(Ingress)。本例中使用一个虚拟主机名称作为测试域名,您需要在Hosts中添加一条记录。在实际工作场景中,请使用备案域名。
101.37.XX.XX foo.bar.com #即ingress的IP
伸缩配置
在伸缩配置区域,配置是否开启指标伸缩,从而满足应用在不同负载下的需求。
容器服务支持容器组的指标伸缩,即根据容器CPU和内存资源占用情况自动调整容器组数量。
说明若要启用自动伸缩,您必须为容器设置所需资源,否则容器自动伸缩无法生效。
配置项
描述
指标
支持CPU和内存,需要和设置的所需资源类型相同。
触发条件
资源使用率的百分比,超过该使用量,容器开始扩容。
最大副本数量
该应用可扩容的容器数量上限。
最小副本数量
该应用可缩容的容器数量下限。
标签和注释
Pod标签:为该Pod添加一个标签,标识该应用。
Pod注解:为该Pod添加一个注解(Annotation)。
单击创建。
查看创建的应用。
创建成功后,默认进入创建完成页面,会列出应用包含的对象,您可以单击查看应用详情进行查看。
默认进入有状态副本集详情页面。
然后单击左上角返回列表,进入有状态副本集列表页面,查看创建的StatefulSet应用。
后续步骤
连接到Master节点,执行以下命令,验证持久化存储特性。
执行以下命令在云盘中创建临时文件。
kubectl exec nginx-1 -- ls /tmp #列出该目录下的文件lost+found。 kubectl exec nginx-1 -- touch /tmp/statefulset #增加一个临时文件statefulset。 kubectl exec nginx-1 -- ls /tmp
预期输出:
lost+found statefulset
执行以下命令删除Pod,验证数据持久性。
kubectl delete pod nginx-1
预期输出:
pod"nginx-1" deleted
过一段时间,待Pod自动重启后,验证数据持久性,证明StatefulSet应用的高可用性。
kubectl exec nginx-1 -- ls /tmp #数据持久化存储lost+found。
预期输出:
statefulset