通过云效流水线自动构建和更新ECI伸缩组容器镜像

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

在您使用ECI伸缩组时,手动更新ECI实例中的容器镜像可能会成为一个耗时且易出错的任务。为了解决这一问题,您可以借助弹性伸缩服务集成的云效流水线功能,实现一键自动构建镜像、更新镜像和更新伸缩组中的实例。

实现原理

本方案通过集成云效的流水线组件,在您更新您的业务代码后,可以在伸缩组一键完成镜像的构建更新和部署,具体实现流程如下:

  1. 云效流水线会将您配置的代码仓库的代码打包构建成Docker镜像。

  2. 在打包构建好镜像后,将镜像发布到容器镜像仓库(ACR)

  3. 在完成镜像发布之后,云效流水线会通过系统运维管理(OOS),将您的镜像更新到您伸缩组实例中,同时您伸缩组实例配置来源中的镜像也会得到更新。

更多云效的信息,请参见云效

准备工作

如果您使用RAM账号登录,请您确保您有以下权限。如何为RAM用户授权,请参见为RAM用户授权

自定义权限示例

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "ess:*",
                "cr:*",
                "rdc:*",
                "vpc:Describe*",
                "ecs:DescribeSecurityGroups",
                "oos:ListExecutions",
                "oos:ListTaskExecutions",
                "oos:GetExecutionTemplate",
                "eci:Describe*",
                "eci:ListUsage",
                "oss:GetExecutionTemplate",
                "ram:GetRole"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

配置环境

为完成一键构建部署镜像到伸缩组,您需要先完成下述配置。

步骤一:创建阿里云容器镜像仓库

重要

如果您已经有阿里云容器镜像仓库,可以跳过该步骤。

创建容器镜像仓库后,您构建好的镜像将会存储在此仓库。

  1. 登录容器镜像服务控制台

  2. 创建容器镜像实例。

    1. 在顶部菜单栏选择地域。

      说明

      推荐容器镜像仓库的地域与伸缩组的地域保持一致,同地域可直接通过内网VPC域名访问。若不一致,需镜像仓库开通公网访问能力,且伸缩组下实例具备公网访问能力。

    2. 在实例列表页面,点击个人实例,等待实例创建完成。

      image

    3. 创建完成后会进入如下界面,点击设置Registry登录密码,并按照界面提示完成密码设置。

      image

  3. 设置完成Registry登录密码之后,在左侧导航栏点击命名空间,点击创建命名空间,按照界面提示完成命名空间的创建。

  4. 在左侧导航栏选择镜像仓库,然后点击创建镜像仓库。按照界面提示完成参数配置。主要参数说明如下:

    • 仓库信息

      配置项

      说明

      示例

      命名空间

      选择步骤3创建的命名空间。

      ess_eci_test_namespace

      仓库名称

      自定义仓库名称。

      ess_eci_test_repo

      仓库类型

      选择私有

      私有

      摘要

      简要描述创建镜像仓库的用途。

      test

    • 代码源

      代码源选择本地仓库,然后单击创建镜像仓库

  5. 创建完成后,会进入仓库的基本信息页面,找到公网地址并复制,供后续步骤使用。

步骤二:创建ECI伸缩组

重要

如果您已经创建好伸缩组,可以跳过该步骤。

您可以通过以下两种方式创建伸缩组:

  • 通过YAML创建。

  • 通过表单创建。

方式一:通过YAML创建

  1. 登录阿里云弹性伸缩控制台

  2. 在顶部菜单栏选择地域,在左侧点击伸缩组管理,点击创建伸缩组

  3. 通过YAML创建页签下,完成伸缩组配置后点击创建。本示例采用以下配置。更多关于通过YAML创建伸缩组的配置说明,请参见通过Kubernetes YAML文件方式配置ECI类型的伸缩组

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-demo
      annotations:
        k8s.aliyun.com/ess-scaling-group-name: ess-eci-test
        k8s.aliyun.com/ess-scaling-group-min-size: 0
        k8s.aliyun.com/ess-scaling-group-max-size: 5
    spec:
      selector:
        matchLabels:
          app: nginx-demo
      replicas: 0
      template:
        metadata:
          labels:
            app: nginx-demo
          annotations:
            k8s.aliyun.com/eci-with-eip: false
        spec:
          containers:
            - name: nginx
              image: registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx:latest
              ports:
                - containerPort: 80
                  name: http
                - containerPort: 443
                  name: https
              resources:
                requests:
                  memory: 0.05Gi
                  cpu: 50m
                limits:
                  memory: 1Gi
                  cpu: '1'
    警告

    如果您已有业务镜像,您可以将镜像修改为您的业务镜像。如果没有,请使用示例里的镜像,后续步骤运行流水线会自动替换该镜像。镜像为空将无法创建伸缩组。

    参数说明:

    参数名

    说明

    示例

    k8s.aliyun.com/ess-scaling-group-name

    伸缩组名称

    ess-eci-test

    k8s.aliyun.com/ess-scaling-group-min-size

    组内最小实例数。当伸缩组的当前实例数小于伸缩最小实例数时,弹性伸缩服务会自动添加实例,使得伸缩组的当前实例数等于伸缩最小实例数。

    0

    k8s.aliyun.com/ess-scaling-group-max-size

    组内最大实例数。当伸缩组的当前实例数大于伸缩最大实例数时,弹性伸缩服务会自动移出实例,使得伸缩组的当前实例数等于伸缩最大实例数。

    5

    k8s.aliyun.com/eci-with-eip

    是否自动创建并绑定EIP

    false

方式二:通过表单创建

  1. 登录阿里云弹性伸缩控制台。在顶部菜单栏选择地域。

  2. 创建伸缩组。

    1. 在左侧点击伸缩组管理,点击创建伸缩组

    2. 通过表单创建页签下,完成伸缩组配置,然后点击创建按钮。本示例采用以下配置,更多关于伸缩组的配置说明,请参见创建伸缩组

      配置项

      说明

      示例

      伸缩组名称

      输入伸缩组名称。

      ess-eci-test

      伸缩组类型

      选择ECI,表示伸缩组内的实例类型为ECI实例。

      ECI

      组内实例配置信息来源

      先不指定自动创建实例的模板。伸缩组创建完成后,您需要继续创建伸缩配置。

      从零开始创建

      组内最小实例数

      代表伸缩组最小有1个ECI实例。

      0

      组内最大实例数

      代表伸缩组最大有5个ECI实例。

      5

      专有网络

      该伸缩组下创建的ECS实例会在此专有网络下。

      vpc-test****-001

      选择交换机

      您可以配置多个可用区的交换机以提高扩容成功率。

      vsw-test****

  3. 为伸缩组创建伸缩配置。

    1. 找到刚刚创建的伸缩组,点击查看详情进入伸缩组详情页。

    2. 实例配置来源页签下,点击伸缩配置,点击创建伸缩配置按钮进入创建伸缩配置页。

    3. 本实例采用以下配置,其他配置项均按默认配置,完成配置后点击配置确认,点击确认创建,更多关于创建伸缩配置的说明,请参见创建伸缩配置(ECI实例)

      配置项

      说明

      示例

      付费模式

      根据您的需求,选择付费模式。

      按量付费

      安全组

      根据您的需求,选择安全组。

      sg-****oer

      容器配置 > 容器名称

      输入您的容器名称。

      nginx

      容器配置 > 镜像

      选择容器的镜像和版本。

      警告

      如果您已有业务镜像,您可以将镜像修改为您的业务镜像。如果没有,请使用示例里的镜像。镜像为空将无法创建伸缩组。

      • 镜像名称:registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/nginx

      • 镜像版本:latest

    4. 伸缩配置页签下找到刚才创建的伸缩配置,点击启用

步骤三:在弹性伸缩控制台配置云效流水线

配置云效流水线,使其可以自动完成镜像的打包、发布和部署。

  1. 伸缩组管理页面,点击发布管理,点击使用云效发布

    image

  2. 选择云效企业,点击下一页

    重要

    如果尚未创建云效企业,需要先点击创建企业,根据界面提示完成云效企业的创建。创建完成在选择企业后,请按照界面提示完成授权操作。

  3. 配置流水线。

    1. 配置流水线源。在流水线源下,点击添加,选择示例代码源,点击添加

      image

      说明

      如果您已经有自己业务的代码源,您可以根据界面提示,选择您的代码仓库地址。

    2. 添加镜像构建任务。

      1. 镜像构建任务下,点击添加

      2. 镜像构建任务 > 选择服务链接下,点击创建服务链接,会跳转到云效的服务链接管理界面,点击新建服务连接

        image

      3. 选择容器镜像服务(ACR),点击下一步,选择服务授权(若没有,点击新建会跳转到授权页),点击创建

      4. 回到镜像构建任务页面,在选择服务连接参数下选择之前创建的链接服务,在镜像仓库参数下选择之前创建的镜像仓库,点击添加

        image

    3. 添加部署任务。

      1. 部署任务下,点击添加,在选择服务连接配置下,点击创建服务链接

        image

      2. 服务连接类型选择弹性伸缩(ESS),点击下一步,点击创建

      3. 部署镜像配置下,选择镜像构建并推送至阿里云镜像仓库个人版.镜像VPC地址,点击添加

        说明

        如果您伸缩组的Region和镜像服务的Region相同时,推荐优先选择镜像VPC地址,其他情况需要实例能够访问公网才能够拉取镜像。

    4. 点击完成新建

使用:一键构建镜像并部署到伸缩组

重要

如果其他RAM用户需要使用该功能,请确保该RAM用户在您的云效企业下,同时具有该流水线的权限。且该RAM用户至少需要具有以下权限:

  • 管理云效(RDC)的权限。

  • 只读访问访问控制(RAM)的权限。

  • 管理系统运维管理(OOS)的权限。

在您更新代码后,点击云效发布运行按钮,即可将新代码打包并部署到您的伸缩组。

  1. 准备工作。

    • 已经环境配置。具体操作,可参见配置环境

    • 已经更新了您的代码并推送到了代码仓库。

  2. 一键构建镜像并部署。

    1. 进入伸缩组,点击发布管理页签,点击使用云效发布页签,点击运行按钮,此时运行记录列表里会新增一条记录。

      image

    2. 在运行记录列表,点击详细按钮查看流水线详细信息,等待流水线执行完毕。流水线执行结束后,您的伸缩组中的实例和伸缩配置将会自动更新,相应的新扩容出的实例也将采用新镜像。

      image

      • 实例配置来源页签下,找到正在生效的伸缩配置,点击修改进行伸缩配置的检查。核实伸缩配置中的容器配置 > 镜像是否已更新。

      • 手动触发一次扩容,在实例列表页签下点击新扩容出的ECI实例,确认新加入的ECI实例采用新镜像。

      • 如果伸缩组存在正在运行的ECI实例,您可以在实例列表页签下点击该ECI实例的名称,进入实例详细页面,确认已有ECI实例镜像已更新。