本文以管理包含弹性伸缩生命周期挂钩功能的服务实例为例,介绍服务商如何创建或者更新服务版本,供用户创建并更新服务实例。
背景信息
弹性伸缩是根据业务需求和策略自动调整计算能力(即实例数量)的云服务。您可以指定实例的类型,即ECS或ECI实例。在业务需求增长时,弹性伸缩自动增加指定类型的实例以保证计算能力,在业务需求下降时自动减少指定类型的实例。更多信息,请参见什么是弹性伸缩ESS。
生命周期挂钩是一个管理伸缩组内ECS实例或ECI实例生命周期的工具。弹性伸缩会自动触发扩缩容活动,并触发生命周期挂钩使伸缩活动中的ECS实例或ECI实例处于挂起中的状态(即等待的状态),为您保留一段自定义操作的时间,直至生命周期挂钩超时结束。更多信息,请参见生命周期挂钩概述。
对于通过软件包部署的服务实例,有些情况下需要对其中的ECS实例做弹性扩缩容。这时服务实例升级不仅需要将新版本的软件包部署到ECS实例中,还需要更新弹性伸缩组生命周期挂钩中的软件包地址,从而保证新扩容的ECS实例商部署的是新版本软件包。
流程介绍
此处介绍了该最佳实践的整体流程。
创建部署物
使用软件包部署物创建服务和服务实例前,需要先完成部署物的创建和发布。
登录计算巢控制台。
在左侧导航栏中,选择服务部署物,然后在部署物界面,单击创建部署物。
在创建部署物界面,填写部署物信息、部署物内容和设置分发的信息。
配置项
配置示例
部署物名称
部署物版本演示
部署物版本名称
版本1
部署物描述
演示部署物版本1
部署物类型
文件
上传部署物
华东1(杭州)
上传名称为version.html的文件,文件内容如下。
DemoVersion1
是否配置脚本命令
开启
操作系统
Linux
部署物下载目录
/root
命令类型
linux Shell
命令内容
yum install nginx -y mkdir -p /usr/share/nginx/html cp /root/version.html /usr/share/nginx/html systemctl start nginx
选择要分发的地域
支持全部地域分发
单击发布部署物。
创建服务
以创建一个包含支持弹性伸缩生命周期挂钩功能的服务为例。
创建和查看服务实例
该步骤是服务商以用户的身份验证服务中配置的软件包,是否能够在服务实例中正确部署。
创建服务实例。
更多信息,请参考创建私有部署服务实例。
查看服务实例的版本信息。
在左侧导航栏中,单击服务实例。
找到您创建的服务实例,单击服务实例ID。进入服务实例详情页。查看服务实例的软件包版本和生命周期挂钩的软件包地址信息。
查看服务实例软件包版本信息:
在服务详情页的概览页签,单击基本信息区域ServiceEndpoint后的链接地址。
跳转到软件包信息页面,查看软件包版本信息。
查看生命周期挂钩的软件包地址信息。
在服务详情页的资源页签,单击弹性伸缩对应的资源ID,进入弹性伸缩组管理界面。
单击生命周期挂钩页签,在通知标识处查看软件包地址信息。
更新部署物
服务商更新服务中的软件包之前,需要先完成部署物的更新和发布。
在左侧导航栏,单击服务部署物,进入部署物管理页面。
找到已创建的部署物,单击创建新版本,进入编辑版本页面,更新部署物参数。
下表列举了创建新版本部署物中需要更新的参数,其他参数保存不变。
配置项
配置示例
上传部署物
华东1(杭州)
上传名称为version.html的文件,文件内容如下。
DemoVersion2
命令内容
yum install nginx -y mkdir -p /usr/share/nginx/html cp /root/version.html /usr/share/nginx/html systemctl start nginx
单击发布部署物。
更新服务
升级服务实例
该步骤是服务商以用户的身份验证更新服务后,用户侧是否能够成功升级服务实例。
登录计算巢控制台。
在左侧导航栏中选择服务实例。
找到您创建的服务实例,单击服务实例ID,进入服务实例详情页。
单击右上角的升级服务实例。进入升级服务实例弹窗。
选择升级版本,然后单击开始升级。
查看升级后的服务实例软件包版本和生命周期挂钩软件包地址
上一步服务实例升级成功后,查看软件包版本和生命周期挂钩的软件包地址是否已经更新。
在左侧导航栏中,单击服务实例。
找到您创建的服务实例,单击服务实例ID,进入服务实例详情页。查看服务实例的软件包版本和生命周期挂钩的软件包地址信息。
服务实例软件包版本信息:
在服务详情页的概览页签,单击基本信息区域ServiceEndpoint后的IP地址。
跳转到软件包信息页面,查看软件包版本信息。
可以看到软件版本信息已升级为DemoVersion2。
查看生命周期挂钩的软件包地址信息。
在服务详情页的资源页签,单击弹性伸缩对应的资源ID。进入弹性伸缩组管理界面。
单击生命周期挂钩页签,在通知标识处查看软件包地址信息。
可以看到软件包地址信息已更新为:https://computenest-artifacts-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/156345785543XXXX/cn-hangzhou/1664176098757/version.html。
示例模板
此处展示了创建弹性伸缩组的生命周期挂钩功能服务的完整模板。
若您想使用弹性伸缩组的生命周期挂钩来实现在扩容的机器上部署关联的软件包,并且服务实例升级后,同步更新弹性伸缩组的生命周期挂钩上的软件包配置时,需在模板中配置如下信息。
模板中配置弹性伸缩组。
伸缩组上配置以下生命周期挂钩的信息:
生命周期挂钩的名字设置为:LifecycleHookByComputeNestArtifact
生命周期挂钩使用的OOS模板必须为:ACS-ESS-LifeCycleDownloadFileAndRunCommand
ROSTemplateFormatVersion: '2015-09-01'
Description:
en: scaling-ecs
zh-cn: ecs部署,支持弹性功能
# 参数配置
Parameters:
PayType:
Type: String
Label:
en: ECS Instance Charge Type
zh-cn: 付费类型
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
AssociationPropertyMetadata:
LocaleKey: InstanceChargeType
PayPeriodUnit:
Type: String
Label:
en: Pay Period Unit
zh-cn: 购买资源时长周期
Default: Month
AllowedValues:
- Month
- Year
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
PayPeriod:
Type: Number
Description:
en: When the purchasing Period is Week, the value of Period ranges from 1 to 4. <br> When the resource purchase duration is Month, the value of Period ranges from 1 to 9, 12, 24, 36, 48, or 60. <br><b><font color='red'> When ECS instance types are PrePaid valid </b></font>
zh-cn: 当购买资源时长为Week时,Period取值:1~4。<br>当购买资源时长为Month时,Period取值:1~9 <br><b><font color='red'>当ECS实例类型为PrePaid有效</b></font>
Label:
en: Period
zh-cn: 购买资源时长
Default: 1
AllowedValues:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Or:
- Fn::Equals:
- ${PayType}
- PrePaid
- Fn::Equals:
- ${PayType}
- undefined
ZoneId:
Type: String
AssociationProperty: ALIYUN::ECS::Instance::ZoneId
Label:
en: VSwitch Availability Zone
zh-cn: 交换机可用区
VpcId:
AssociationProperty: ALIYUN::ECS::VPC::VPCId
Type: String
Description:
en: Please search the ID starting with (vpc-xxx) from console-Virtual Private Cloud
zh-cn: 现有虚拟专有网络的实例ID
Label:
en: VPC ID
zh-cn: 专有网络VPC实例ID
VSwitchId:
AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
AssociationPropertyMetadata:
VpcId: ${VpcId}
ZoneId: ${ZoneId}
Type: String
Description:
en: Instance ID of existing business network switches, console-Virtual Private Cloud-VSwitches under query
zh-cn: 现有业务网络交换机的实例ID
Label:
en: VSwitch ID
zh-cn: 交换机实例ID
EcsInstanceType:
Type: String
Label:
en: Instance Type
zh-cn: 实例类型
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
InstanceChargeType: ${InstanceChargeType}
InstancePassword:
NoEcho: true
Type: String
Description:
en: Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)
AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$'
Label:
en: Instance Password
zh-cn: 实例密码
ConstraintDescription:
en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)
MinLength: 8
MaxLength: 30
AssociationProperty: ALIYUN::ECS::Instance::Password
InstanceCount:
Type: Number
Description:
en: ECS Instance Count
zh-cn: ECS实例数量
Label:
en: Instance Count
zh-cn: 实例数量
Default: 1
LoadBalancerSpec:
Type: String
AssociationProperty: ALIYUN::SLB::Instance::InstanceType
Label:
en: Specifications
zh-cn: 规格
Default: slb.s1.small
# 资源配置
Resources:
EcsSecurityGroup:
Type: ALIYUN::ECS::SecurityGroup
Properties:
SecurityGroupName: 'agent-sg'
VpcId:
Ref: VpcId
# 安全组入端口
SecurityGroupIngress:
- PortRange: 80/80
Priority: 1
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
NicType: internet
# 安全组出端口
SecurityGroupEgress:
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: internet
- PortRange: '-1/-1'
Priority: 1
IpProtocol: all
DestCidrIp: 0.0.0.0/0
NicType: intranet
EssInstanceScalingGroupEnable:
Type: 'ALIYUN::ESS::ScalingGroupEnable'
Properties:
ScalingRuleArisExecuteVersion: '1'
ScalingConfigurationId:
Ref: EcsInstanceScalingConfiguration
ScalingGroupId:
Ref: EssInstanceScalingGroup
DependsOn:
- EcsInstanceScalingConfiguration
- EssInstanceScalingGroup
- ScaleOutLifecycleHook
EcsInstanceScalingConfiguration:
Type: 'ALIYUN::ESS::ScalingConfiguration'
Properties:
# 网络配置
SecurityGroupId:
Ref: EcsSecurityGroup
# 伸缩组
ScalingGroupId:
Ref: EssInstanceScalingGroup
ScalingConfigurationName:
Fn::Join:
- '-'
- - 'sc'
- Ref: ALIYUN::StackName
# 实例类型
InstanceType:
Ref: EcsInstanceType
InternetMaxBandwidthIn: 10
# 磁盘配置
SystemDiskCategory: cloud_essd
SystemDiskSize: 200
ImageId: centos_7_9_x64_20G_alibase_20220727.vhd
InstanceName:
Fn::Join:
- '-'
- - Ref: ALIYUN::StackName
- '[1,4]'
UserData: |-
#!/bin/bash
mkdir -p /usr/share/nginx/html
EssInstanceScalingGroup:
Type: 'ALIYUN::ESS::ScalingGroup'
DependsOn:
- EcsSecurityGroup
- SlbListener
Properties:
ScalingGroupName:
Fn::Join:
- '-'
- - 'scg'
- Ref: ALIYUN::StackName
RemovalPolicys:
- NewestInstance
MinSize:
Ref: InstanceCount
MaxSize: 50
VSwitchId:
Ref: VSwitchId
DefaultCooldown: 300
LoadBalancerIds:
- Ref: Slb
RamRole:
Type: ALIYUN::RAM::Role
Properties:
RoleName:
Fn::Join:
- ''
- - StackId-
- Ref: ALIYUN::StackId
AssumeRolePolicyDocument:
Version: '1'
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service:
- oos.aliyuncs.com
Policies:
- PolicyName:
Fn::Join:
- ''
- - StackId-
- Ref: ALIYUN::StackId
PolicyDocument:
Version: '1'
Statement:
- Action:
- ecs:DescribeInstances
- ecs:RunCommand
- ecs:DescribeInvocations
- ecs:DescribeInvocationResults
Resource:
- '*'
Effect: Allow
- Action:
- ess:CompleteLifecycleAction
Resource:
- '*'
Effect: Allow
ScaleOutLifecycleHook:
Type: ALIYUN::ESS::LifecycleHook
DependsOn:
- EssInstanceScalingGroup
- RamRole
Properties:
ScalingGroupId:
Ref: EssInstanceScalingGroup
LifecycleHookName: LifecycleHookByComputeNestArtifact
LifecycleTransition: SCALE_OUT
DefaultResult: CONTINUE
HeartbeatTimeout: 600
NotificationArn:
Fn::Join:
- ''
- - 'acs:ess:'
- Ref: ALIYUN::Region
- ':'
- Ref: ALIYUN::TenantId
- ':oos/'
- 'ACS-ESS-LifeCycleDownloadFileAndRunCommand'
NotificationMetadata:
Fn::Sub:
- '{"regionId": "${!regionId}","instanceIds": "${!instanceIds}","lifecycleHookId": "${!lifecycleHookId}","lifecycleActionToken": "${!lifecycleActionToken}", "sourcePath": "{{ computenest::file::Software }}", "destinationDir": "/root", "whetherSaveToFile": "false", "commandContent": "${commandContent}", "timeout": 600, "OOSAssumeRole": "${roleName}"}'
- commandContent: |-
#!/bin/bash
yum install nginx -y
mkdir -p /usr/share/nginx/html
cp /root/version.html /usr/share/nginx/html
systemctl start nginx
roleName:
Fn::GetAtt:
- RamRole
- RoleName
# 新建负载均衡
Slb:
Type: ALIYUN::SLB::LoadBalancer
Properties:
PayType:
Ref: PayType
PricingCycle:
Ref: PayPeriodUnit
Duration:
Ref: PayPeriod
VpcId:
Ref: VpcId
VSwitchId:
Ref: VSwitchId
LoadBalancerName:
Ref: ALIYUN::StackName
LoadBalancerSpec:
Ref: LoadBalancerSpec
AddressType: intranet
SlbListener:
DependsOn: Slb
Type: ALIYUN::SLB::Listener
Properties:
Persistence:
CookieTimeout: 60
StickySession: 'on'
PersistenceTimeout: 0
XForwardedFor: 'off'
StickySessionType: insert
ListenerPort: 80
Bandwidth: -1
Scheduler: rr
HealthCheck:
HttpCode: http_2xx,http_3xx,http_4xx,http_5xx
HealthCheckType: tcp
UnhealthyThreshold: 3
Timeout: 5
HealthyThreshold: 3
Port: 80
URI: /
Interval: 2
LoadBalancerId:
Ref: Slb
BackendServerPort: 80
Protocol: tcp
# 新建eip
EipSlbAddress:
Type: ALIYUN::VPC::EIP
Properties:
InternetChargeType: PayByTraffic
Bandwidth: 10
# 绑定eip到负载均衡
EipSlbAddressAssociation:
Type: ALIYUN::VPC::EIPAssociation
Properties:
InstanceId:
Ref: Slb
AllocationId:
Ref: EipSlbAddress
Outputs:
ServiceEndpoint:
Description:
zh-cn: 对外暴露的公网IP地址
en: Public IP Addresses
Value:
Fn::Sub:
- http://${ServerAddress}/version.html
- ServerAddress:
Fn::GetAtt:
- EipSlbAddress
- EipAddress
Metadata:
ALIYUN::ROS::Interface:
# 分组信息
ParameterGroups:
- Parameters:
- PayType
- PayPeriodUnit
- PayPeriod
Label:
default:
en: PayType Configuration
zh-cn: 付费类型配置
- Parameters:
- ZoneId
Label:
default:
zh-cn: 可用区配置
en: Zone Configuration
- Parameters:
- VpcId
- VSwitchId
Label:
default:
zh-cn: 选择已有基础资源配置
en: Choose existing Infrastructure Configuration
- Parameters:
- EcsInstanceType
- InstancePassword
- InstanceCount
Label:
default:
en: Instance
zh-cn: ECS实例配置