通过镜像部署物创建并更新服务

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

前提条件

创建部署物前,需要先完成如下操作。

  1. 已创建ECS实例。具体操作,请参见自定义购买实例

  2. 使用已创建的ECS实例创建自定义镜像。具体操作,请参见使用实例创建自定义镜像

流程介绍

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

整体流程

步骤一:创建部署物

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

  1. 登录计算巢控制台

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

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

    配置项

    配置示例

    部署物名称

    部署物版本演示

    部署物版本名称

    版本1

    部署物描述

    演示部署物版本1

    部署物类型

    ECS镜像

    镜像类型

    自定义镜像

    选择镜像

    • 自定义镜像所在地域:华东1(杭州)。

    • 镜像名称:NginxV1。

    选择要分发的地域

    支持全部地域分发。

  4. 单击发布部署物

    单击发布部署物后,可在部署物详情页面,单击部署物名称,进入部署物详情界面,查看部署物的部署进度。分发镜像的时长由于地域和镜像大小的不同,可能在几分钟到几十分钟不等。2024-05-16_16-01-44.png

步骤二:创建服务

此处以创建一个包含ECS镜像的服务为例。

  1. 登录计算巢控制台

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

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

    此处只列举创建服务需要特别配置的参数,其他参数配置,请参见创建私有部署服务

    • 录入模板区域的模板内容处,填写使用自定义镜像创建单ECS实例的服务模板。模板内容,请参见模板示例

    • 部署物关联区域的设置镜像关联处,关联已创建的镜像部署物,并选择部署物的版本为版本1。2024-05-16_16-10-32.png

  4. 单击创建服务

  5. 测试服务。

    服务保存后,您可以对服务进行自测试,也可以将服务进行预发布后,分享给指定的客户进行测试。更多信息,请参见测试服务

  6. 发布服务。

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

步骤三:创建和查看服务实例

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

  1. 创建服务实例。

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

    服务实例部署成功,则表示镜像部署物也已经在服务实例中部署成功。

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

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

    2. 找到您创建的服务实例,单击服务实例ID。进入服务实例详情页。查看服务实例的软件包版本信息。

      • 查看服务实例版本信息版本信息

      • 查看镜像信息。

        在服务实例详情页,单击资源页签,单击ECS实例对应的资源ID,进入ECS实例详情页,查看镜像信息。15.png

步骤四:更新部署物

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

  1. 登录计算巢控制台

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

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

    创建新版本界面,在部署物内容区域的选择镜像中选择新的镜像,其他参数保持不变。选择新的部署物

  4. 单击发布部署物

步骤五:更新服务

  1. 登录计算巢控制台

  2. 在左侧导航栏中,选择我的服务

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

    此处只列举更新镜像需要特别配置的参数,其他参数配置,请参见更新服务

    • 部署物关联区域,将关联镜像修改为部署物更新后的镜像版本。2024-05-16_16-10-32.png

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

      配置项

      配置示例

      支持用户升级服务实例

      开启支持用户升级服务实例

      支持用户回滚服务实例

      支持用户回滚服务实例

      升级描述

      镜像升级

      支持升级版本

      全部版本

      升级服务组件

      服务配置和应用配置

      配置升级信息

      • 应用分组:默认分组

      • 描述:升级镜像

      • 升级类型:镜像升级

      • 选择部署物:Nginx镜像、版本2

      2024-05-28_14-04-12.png

  4. 单击提交审核

步骤六:升级服务实例

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

  1. 登录计算巢控制台

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

  3. 服务实例页面,单击服务实例ID,进入服务实例详情页面。

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

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

步骤七:查看升级后的服务实例版本和镜像信息

服务实例升级成功后,查看服务实例版本和镜像信息是否已经更新。

  1. 登录计算巢控制台

  2. 在左侧导航栏中,单击服务实例

  3. 找到您创建的服务实例,单击服务实例ID,进入服务实例详情页。查看服务实例版本、Nginx和镜像信息是否已经更新。

    • 查看服务实例版本信息

      服务实例版本已经升级为版本2。服务版本

    • 查看镜像信息

      在服务实例详情页,单击资源页签,单击ECS实例对应的资源ID,进入ECS实例详情页,查看镜像信息。可以发现镜像ID已经变更。镜像信息

模板示例

此处展示的模板示例为该最佳实践创建服务使用的模板内容。

ROSTemplateFormatVersion: '2015-09-01'
Description:
  en: This template deploys Nginx service for single instance
  zh-cn: 此模板为单实例部署Nginx服务
Parameters:
  ZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    Label:
      en: VSwitch Availability Zone
      zh-cn: 交换机可用区
  VpcId:
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
    Type: String
    Label:
      en: VPC ID
      zh-cn: 专有网络VPC实例ID
  VSwitchId:
    AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: ${VpcId}
      ZoneId: ${ZoneId}
    Type: String
    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
  PayType:
    Type: String
    Label:
      en: ECS Instance Charge Type
      zh-cn: 付费类型
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType
  PayPeriodUnit:
    Type: String
    Description:
      en: The long cycle of purchasing resources. <br>Week is a Week and Month is a Month. <br> The default value is month.<br><b><font color='red'> When ECS instance types are PrePaid valid </b></font>
      zh-cn: 购买资源时长的周期。<br>Week为周,Month为月<br>默认值为月<br><b><font color='red'>当ECS实例类型为PrePaid有效</b></font>
    Label:
      en: Pay Period Unit
      zh-cn: 购买资源时长周期
    Default: Month
    AllowedValues:
      - Month
      - Year
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  PayPeriod:
    Type: Number
    Label:
      en: Period
      zh-cn: 购买资源时长
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
Resources:
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName: nginx-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
  WaitCondition:
    Type: ALIYUN::ROS::WaitCondition
    Properties:
      Count: 1
      Handle:
        Ref: WaitConditionHandle
      Timeout: 300
  WaitConditionHandle:
    Type: ALIYUN::ROS::WaitConditionHandle
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      IoOptimized: optimized
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      VpcId:
        Ref: VpcId
      VSwitchId:
        Ref: VSwitchId
      SecurityGroupId:
        Ref: EcsSecurityGroup
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      DiskMappings:
        - Category: cloud_essd
          Size: 200
      MaxAmount: 1
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      AllocatePublicIP: true
      InternetMaxBandwidthOut: 100
      InstanceName:
        Fn::Join:
          - '-'
          - - Ref: ALIYUN::StackName
            - '[1,4]'
      UserData:
        Fn::Sub:
          - |
            #!/bin/bash
            # 挂盘到/disk1
            cat >> /root/InitDataDisk.sh << EOF
            #!/bin/bash
            echo "p
            n
            p



            w
            " |  fdisk -u /dev/vdb
            EOF
            /bin/bash /root/InitDataDisk.sh
            rm -f /root/InitDataDisk.sh
            rm -f InitDataDisk.sh
            mkfs -t ext4 /dev/vdb1
            cp /etc/fstab /etc/fstab.bak
            mkdir /disk1
            echo `blkid /dev/vdb1 | awk '{print $2}' | sed 's/\\\"//g'` /disk1 ext4 defaults 0 0 >> /etc/fstab
            mount -a

            # 这里配置安装脚本
            yum install -y nginx
            # 配置启动脚本
            /usr/sbin/nginx

            # 执行成功回调WaitCondition结束waitCondition的等待
            ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
          - CurlCli:
              Fn::GetAtt:
                - WaitConditionHandle
                - CurlCli
Outputs:
  endpoint:
    Description:
      zh-cn: 对外暴露的公网IP地址
      en: Public IP Addresses
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::Select:
              - 0
              - Fn::GetAtt:
                  - EcsInstanceGroup
                  - PublicIps
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - ZoneId
        Label:
          default:
            zh-cn: 可用区配置
            en: Zone Configuration
      - Parameters:
          - VpcId
          - VSwitchId
        Label:
          default:
            zh-cn: 选择已有基础资源配置
            en: Choose existing Infrastructure Configuration
      - Parameters:
          - PayType
          - PayPeriodUnit
          - PayPeriod
        Label:
          default:
            en: PayType Configuration
            zh-cn: 付费类型配置
      - Parameters:
          - EcsInstanceType
          - InstancePassword
        Label:
          default:
            en: Instance
            zh-cn: ECS实例配置
    TemplateTags:
      - acs:example:ISV软件部署:创建单ECS实例并部署Nginx