文档

使用软件包更新服务并升级服务实例

本文以管理包含弹性伸缩生命周期挂钩功能的服务实例为例,介绍服务商如何创建或者更新服务版本,供用户创建并更新服务实例。

背景信息

  • 弹性伸缩是根据业务需求和策略自动调整计算能力(即实例数量)的云服务。您可以指定实例的类型,即ECS或ECI实例。在业务需求增长时,弹性伸缩自动增加指定类型的实例以保证计算能力,在业务需求下降时自动减少指定类型的实例。更多信息,请参见什么是弹性伸缩ESS

  • 生命周期挂钩是一个管理伸缩组内ECS实例或ECI实例生命周期的工具。弹性伸缩会自动触发扩缩容活动,并触发生命周期挂钩使伸缩活动中的ECS实例或ECI实例处于挂起中的状态(即等待的状态),为您保留一段自定义操作的时间,直至生命周期挂钩超时结束。更多信息,请参见生命周期挂钩概述

  • 对于通过软件包部署的服务实例,有些情况下需要对其中的ECS实例做弹性扩缩容。这时服务实例升级不仅需要将新版本的软件包部署到ECS实例中,还需要更新弹性伸缩组生命周期挂钩中的软件包地址,从而保证新扩容的ECS实例商部署的是新版本软件包。

流程介绍

此处介绍了该最佳实践的整体流程。整体流程

创建部署物

使用软件包部署物创建服务和服务实例前,需要先完成部署物的创建和发布。

  1. 登录计算巢控制台

  2. 在左侧导航栏中,单击部署物管理。然后在部署物管理界面,单击创建部署物

  3. 在创建部署物界面,填写部署物信息部署物内容设置分发的信息。

    配置项

    配置示例

    部署物名称

    部署物版本演示

    部署物版本名称

    版本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

    选择要分发的地域

    支持全部地域分发

  4. 单击发布部署物

创建服务

以创建一个包含支持弹性伸缩生命周期挂钩功能的服务为例。

  1. 登录计算巢控制台

  2. 在左侧导航栏中,选择服务目录 > 我的服务,在我的服务页面中,选择我发布的服务,然后单击创建新服务

  3. 创建新服务界面,根据需求配置相关参数。

    此处只列举创建支持弹性伸缩生命周期挂钩的服务需要特别配置的参数,其他参数配置,请参见创建私有部署服务

    • 录入模板区域的模板内容处,填写支持弹性伸缩生命周期挂钩的服务模板。模板详细内容,请参见示例模板

    • 部署应用区域的软件包关联处,关联已创建的部署物,并选择版本1。软件包关联

    • 升级配置区域的升级信息处,配置升级信息。配置升级信息

      说明

      若您需要服务实例升级的同时更新弹性伸缩组生命周期挂钩中的软件包地址,则需要勾选更新ESS生命周期挂钩

  4. 单击保存服务

  5. 测试服务。

    服务保存后,您需要对创建的服务进行测试,以确保其正常可用。更多信息,请参见测试服务

  6. 发布服务。

    服务测试通过后,再提交审核,审核通过后即可发布上线。更多信息,请参见上线服务

创建和查看服务实例

该步骤是服务商以用户的身份验证服务中配置的软件包,是否能够在服务实例中正确部署。

  1. 创建服务实例。

    更多信息,请参考创建私有部署服务实例

  2. 查看服务实例的版本信息。

    1. 在左侧导航栏中,单击服务实例管理

    2. 找到您创建的服务实例,单击服务实例ID。进入服务实例详情页。查看服务实例的软件包版本和生命周期挂钩的软件包地址信息。

      • 查看服务实例软件包版本信息:

        1. 在服务详情页的概览页签,单击基本信息区域ServiceEndpoint后的链接地址。ServiceEndpoint

        2. 跳转到软件包信息页面,查看软件包版本信息。软件包版本

      • 查看生命周期挂钩的软件包地址信息。

        • 在服务详情页的资源页签,单击弹性伸缩对应的资源ID,进入弹性伸缩组管理界面。资源

        • 单击生命周期挂钩页签,在通知标识处查看软件包地址信息。软件包地址

更新部署物

服务商更新服务中的软件包之前,需要先完成部署物的更新和发布。

  1. 在左侧导航栏,单击部署物管理,进入部署物管理页面。

  2. 找到已创建的部署物,单击创建新版本,进入编辑版本页面,更新部署物参数。

    下表列举了创建新版本部署物中需要更新的参数,其他参数保存不变。

    配置项

    配置示例

    上传部署物

    • 华东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
  3. 单击发布部署物

更新服务

  1. 登录计算巢控制台

  2. 找到需要更新的服务,单击创建新版本,进入创建新版本界面,更新参数。

    此处只列举创建支持弹性伸缩生命周期挂钩的服务需要特别配置的参数,其他参数配置,请参见更新服务

    • 部署应用区域的软件包关联处,关联已创建的部署物,并选择版本2。软件包关联

    • 升级配置区域的升级信息处,配置升级信息。配置升级信息

      说明

      若您需要服务实例升级的同时更新弹性伸缩组生命周期挂钩中的软件包地址,则需要勾选更新ESS生命周期挂钩

升级服务实例

该步骤是服务商以用户的身份验证更新服务后,用户侧是否能够成功升级服务实例。

  1. 登录计算巢控制台

  2. 在左侧导航栏中选择服务实例管理

  3. 找到您创建的服务实例,单击服务实例ID,进入服务实例详情页。

  4. 单击右上角的升级服务实例。进入升级服务实例弹窗。

  5. 选择升级版本,然后单击开始升级

    升级服务实例

查看升级后的服务实例软件包版本和生命周期挂钩软件包地址

上一步服务实例升级成功后,查看软件包版本和生命周期挂钩的软件包地址是否已经更新。

  1. 在左侧导航栏中,单击服务实例管理

  2. 找到您创建的服务实例,单击服务实例ID,进入服务实例详情页。查看服务实例的软件包版本和生命周期挂钩的软件包地址信息。

    • 服务实例软件包版本信息:

      1. 在服务详情页的概览页签,单击基本信息区域ServiceEndpoint后的IP地址。

      2. 跳转到软件包信息页面,查看软件包版本信息。

        可以看到软件版本信息已升级为DemoVersion2。

        软件包版本

    • 查看生命周期挂钩的软件包地址信息。

      1. 在服务详情页的资源页签,单击弹性伸缩对应的资源ID。进入弹性伸缩组管理界面。资源

      2. 单击生命周期挂钩页签,在通知标识处查看软件包地址信息。

        可以看到软件包地址信息已更新为:https://computenest-artifacts-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/156345785543XXXX/cn-hangzhou/1664176098757/version.html。

        软件包地址

示例模板

此处展示了创建弹性伸缩组的生命周期挂钩功能服务的完整模板。

重要

若您想使用弹性伸缩组的生命周期挂钩来实现在扩容的机器上部署关联的软件包,并且服务实例升级后,同步更新弹性伸缩组的生命周期挂钩上的软件包配置时,需在模板中配置如下信息。

  • 模板中配置弹性伸缩组。

  • 伸缩组上配置以下生命周期挂钩的信息:

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实例配置

  • 本页导读 (0)
文档反馈