Alicloud Image Builder是阿里云推出的一款镜像构建工具,旨在通过简易的方式自动化构建镜像。利用Alicloud Image Builder构建出的操作系统镜像,再结合ACK集群节点池的自定义镜像功能,可以快速地扩容节点。本文介绍如何在ACK集群中将Alicloud Image Builder通过Job的方式构建自定义操作系统镜像。

前提条件

背景信息

容器服务ACK节点池支持ACK集群节点的弹性伸缩,默认创建节点池时,提供的操作系统镜像包括CentOS、Alibaba Cloud Linux 2等操作系统镜像,已经能够满足绝大多数场景的使用。但是针对一些预安装或者高性能场景下,可能原有的基础镜像并不能满足我们的需求。阿里云提供的Alicloud Image Builder,可以帮助您构建属于自己的自定义操作系统镜像,可以提高复杂场景下弹性伸缩的便捷性。

使用Alicloud Image Builder创建自定义镜像时,您可以通过Job或CronJob将镜像构建任务下发到集群完成构建。

使用ACK Job快速构建自定义操作系统镜像

本文通过创建名为build-config的配置项和名为build的Job工作负载为例,说明如何使用Alicloud Image Builder快速构建自定义操作系统镜像。

  1. 创建名为build-config的配置项用以配置构建操作系统镜像的参数。
    1. 使用以下YAML内容创建名为build-config.yaml的文件。
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: build-config
      data:
        ack.json: |-
          
          {
            "variables": {
              "region": "{{env `REGION`}}",
              "image_name": "ack-custom_image",
              "source_image": "centos_7_02_64_20G_alibase_20170818.vhd",
              "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
              "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
            },
            "builders": [
              {
                "type": "alicloud-ecs",
                "access_key": "{{user `access_key`}}",
                "secret_key": "{{user `secret_key`}}",
                "region": "{{user `region`}}",
                "image_name": "{{user `image_name`}}",
                "source_image": "{{user `source_image`}}",
                "ssh_username": "root",
                "instance_type": "ecs.g6.large",
                "skip_image_validation": "true",
                "io_optimized": "true"
              }
            ],
            "provisioners": [{
              "type": "shell",
              "inline": [
                          "sleep 30",
              ]
            }]
          }

      上述YAML中涉及参数解释如下。

      表 1. Alicloud Image Builder配置文件的参数解释
      参数 示例值 描述
      variables{"<variable1>":"<value>"} variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"} 定义了Alicloud Image Builder中会用到的变量(variables)。
      说明 如果将重要信息,例如AccessKey(包括access_keysecret_key)写入配置文件的话,存在信息泄露的风险,但是将其设置成变量后可防止意外,变量的值来源于运行时的输入值。
      builders{"type":"<value>"} builders{"type":"alicloud-ecs"} 镜像生成器(builders)。当设置typealiyun-ecs时,表示构建镜像时,会临时创建一个ECS实例来完成镜像构建。构建完成后,ECS实例会自动销毁。
      provisioners{"type":"<value>"} provisioners{"type":"shell"} 镜像配置器(provisioners),用以定义需要在临时实例内执行的操作。当设置typeshell时,说明使用的是Shell Provisioner,表示在连接Linux实例后自动执行一段Shell命令。例如,执行Shell命令yum install redis.x86_64 -y安装Redis。

      关于Provisioner配置的更多信息,请参见下文的Provisioner配置介绍

      表 2. 镜像构建涉及的参数解释
      参数 示例值 描述 重要度
      access_key LTAInPyXXXXQ**** 您的AccessKey ID。更多详情,请参见获取AccessKey
      secret_key CM1ycKrrCekQ0dhXXXXXXXXXl7y**** 您的AccessKey Secret。
      region cn-beijing 目标自定义镜像的所属地域。
      image_name ack-custom_image 目标自定义镜像的名称。不允许与已有镜像重名。
      source_image aliyun_2_1903_x64_20G_alibase_20200904.vhd 具有相同操作系统的阿里云公共镜像ID。
    2. 执行以下命令部署Alicloud Image Builder到集群。
      kubectl apply -f build-config.yaml
  2. 创建Job工作负载以完成自定义操作系统镜像的构建。
    1. 使用以下YAML内容创建名为build.yaml的文件。
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: image-builder
        namespace: default
      spec:
        template:
          metadata:
            name: image-builder
          spec:
            containers:
              - name: image-builder
                image: registry.cn-hangzhou.aliyuncs.com/acs/image-builder:v1
                env:
                  - name: ALICLOUD_ACCESS_KEY  
                    value: xxxxxxx
                  - name: ALICLOUD_SECRET_KEY
                    value: xxxxxxx
                  - name: REGION
                    value: cn-hangzhou
                command: ["packer"]
                args:  ["build","/config/ack.json"]
                volumeMounts:
                  - name: config
                    mountPath: /config
            volumes:
              - name: config
                configMap:
                  name: build-config
                  items:
                    - key: ack.json
                      path: ack.json
            restartPolicy: Never
    2. 执行以下命令部署Job到集群开始构建操作系统镜像。
      kubectl apply -f build.yaml
  3. 可选:登录ACK控制台查看自定义镜像构建日志。
    构建镜像时会产生操作日志。日志给出了构建过程中执行的每一个步骤,包括校验参数、创建临时资源、预安装软件、创建目标资源和释放临时资源等。您可以执行以下步骤查看镜像构建日志。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 任务
    5. 在任务列表中,找到上步创建的任务(Job),并单击其右侧操作列下的详情
    6. 在目标任务详情页,单击日志页签,然后查看镜像构建日志。

Provisioner配置介绍

Provisioner是在转换为静态操作系统镜像之前,在正在运行的机器中用于安装和配置软件的组件。常用来被执行安装软件到镜像中的主要工作场景包括:
  • 安装软件包。
  • 修补内核。
  • 创建用户。
  • 下载应用程序代码。
Provisioner常见操作:
  • 执行Shell脚本。
      "provisioners": [{
          "type": "shell",
          "script": "script.sh"
      }]
  • 使用Ansible执行编排脚本。
      "provisioners": [
        {
        "type": "ansible",
        "playbook_file": "./playbook.yml"
        }
      ]
  • 安装CPFS客户端。
    由于CPFS需要安装的包较多,且一部分安装包涉及现场编译流程,安装过程比较费时。在客户端节点数量较大时,使用自定义镜像可以极大减少批量安装CPFS客户端节点的成本。示例配置如下。
        {
          "variables": {
            "region": "{{env `REGION`}}",
            "image_name": "ack-custom_image",
            "source_image": "centos_7_04_64_20G_alibase_201701015.vhd",
            "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
            "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
          },
        "builders": [
            {
              "type": "alicloud-ecs",
              "access_key": "{{user `access_key`}}",
              "secret_key": "{{user `secret_key`}}",
              "region": "{{user `region`}}",
              "image_name": "{{user `image_name`}}",
              "source_image": "{{user `source_image`}}",
              "ssh_username": "root",
              "instance_type": "ecs.g6.large",
              "skip_image_validation": "true",
              "io_optimized": "true"
            }
          ],
       "provisioners": [{
            "type": "shell",
            "inline": [
                "cd $HOME",
                "wget https://cpfs-client.oss-cn-beijing.aliyuncs.com/kernel/kernel-devel-`uname -r`.rpm",
                "rpm -ivh --replacefiles kernel-devel-`uname -r`.rpm"
            ]
          }]

相关操作

使用Alicloud Image Builder创建好自定义镜像后,您就可以使用自定义的镜像创建弹性伸缩节点池以实现快速扩容节点。有关如何创建弹性节点池,请参见节点自动伸缩