文档首页> 云容器引擎 CCE> 最佳实践> 集群> 制作CCE节点自定义镜像
更新时间:2022-05-10 GMT+08:00
分享

制作CCE节点自定义镜像

使用限制

  • CCE节点镜像使用建议:
    • 节点镜像推荐优先使用CCE服务维护的默认节点镜像。相关镜像经过严格的测试,且能获得最新的更新推送,具有更好的兼容性、稳定性和安全性。
    • 如果您有特殊场景需要使用自定义镜像功能,请使用CCE提供的基础镜像来制作自定义镜像。
    • CCE自定义镜像制作基于开源工具HashiCorp Packer(>=1.7.2)以及开源插件实现,并提供了cce-image-builder配置模板帮助您快速制作符合要求的自定义镜像。

    Packer是一款可以创建自定义镜像的开源工具。Packer包含构建器(Builder)、配置器(Provisioner)、后处理器(Post-Processor)三个组件,支持通过json或者hcl格式的模板文件,可以灵活组合这三种组件并行地、自动化地创建镜像文件。

    Packer作为镜像制作的工具有如下优势:

    1. 构建过程自动化:创建镜像的过程变成可以通过Packer配置文件的形式固化,支持自动化构建。
    2. 云平台兼容性强:原生支持对接绝大多数的云平台,也包括各类第三方插件。
    3. 配置文件易用性高:Packer配置文件中模块职责清晰,参数定义简单直观,学习成本低。
    4. 镜像构建功能全面:原生支持较多常用功能模块,例如Provisioner中支持使用远程执行脚本的shell模块、支持远程传输文件的file模块、支持暂停流程的breakpoint模块。
  • 制作自定义镜像前,请提交工单申请:
    • 针对定制修改的内容,获得CCE服务专家的专业评估结论和建议。
    • 获取CCE服务的最新节点镜像ID,用于后续镜像制作
    • 若涉及后续镜像调整影响使用中自定义镜像的兼容性,将会至少提前一个月收到通知,辅助您进行兼容性适配,避免节点与节点池场景的扩容受到影响,避免影响业务扩容。
  • 制作过程中:
    • 制作镜像的过程中必须按照操作指南进行制作,防止一些不可预期问题出现。
    • 根据基础镜像创建出来的虚机,默认SSH登录用户需要支持sudo root权限,或者拥有root权限。
  • 制作结束时:
    • 制作过程会消耗一定计费资源,主要涉及ECS服务器、EVS云硬盘、弹性IP及带宽和IMS镜像。正常场景制作成功或者失败后会自动释放。但制作完成后,建议再次确认资源已彻底释放,以避免非预期的消费。

使用须知

  • 基础镜像中预置了用户节点依赖的组件包,该包的版本会跟着集群版本变更。
  • 制作镜像前需要准备:
    • ECS执行机:一台ECS x86服务器作为Linux执行机,建议选择CentOS7操作系统并绑定EIP支持访问公网,便于后续安装Packer工具。
    • 认证凭据:制作镜像需要获取具有相关权限用户或者租户的AK/SK认证凭据,请提前获取,详情请参考IAM 如何获取访问密钥AK/SK
    • 安全组:由于Packer通过创建临时ECS服务器并使用秘钥对SSH登录,需要提前确保安全组放开TCP:22端口通道。详情请参考安全组配置示例

制作镜像

  1. 登录ECS执行机,下载cce-image-builder并解压。

    wget https://cce-north-4.obs.cn-north-4.myhuaweicloud.com/cce-image-builder/cce-image-builder.tgz
    tar zvxf cce-image-builder.tgz
    cd cce-image-builder/

    cce-image-builder主要包含

    • turbo-node.pkr.hcl 镜像制作使用的Packer配置模板
    • scripts/* 模板预置的CCE镜像制作。建议不要修改,避免影响最终镜像可用性。
    • user-scripts/* 模板预置的自定义包脚本目录。以example.sh为例,制作自定义镜像时将自动上传至临时服务器并执行。
    • user-packages/* 模板预置的自定义包目录。制作自定义镜像时,以example.package为例,制作自定义镜像时将自动上传至临时服务器/tmp/example.package。

  2. 安装HashiCorp Packer,建议参考官方指导执行。

    Packer版本要求:packer >= 1.7.2

    以CentOS 7执行机为例,执行如下命令自动安装packer(以官方指导为准)

    # 配置Packer的yum源后安装Packer
    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    sudo yum -y install packer
    
    # 配置alias用于避免OS中同名packer二进制影响,并检查packer版本
    rpm -q packer
    alias packer=$(rpm -ql packer)
    packer -v

  3. 获取cce-image-builder/turbo-node.pkr.hcl所需的参数,并通过环境变量配置。

    turbo-node.pkr.hcl文件是packer的配置模板,定义了完整的镜像构建过程更详细说明请参考Packer官网文档

    • variables/variable

      变量定义。turbo-node.pkr.hcl中主要定义了构建所需填写的参数,支持用户按需修改或填写,参数定义参见 表1

    • packer
      packer模块定义。其中required_plugins定义了Packer的插件依赖,包括插件来源与插件版本范围,packer init时会自动下载插件并初始化,无需用户手动填写。
      packer {
        required_plugins {
          huaweicloud = {
            version = ">= 0.4.0"
            source  = "github.com/huaweicloud/huaweicloud"
          }
        }
      }
    • source

      source定义。通过引用了上述定义的变量,自动配置了插件创建ECS所需的参数,无需用户手动填写。

    • build
      build定义。按顺序从上到下依次执行,支持文件上传file模块、脚本执行shell模块等常用模块,样例参考:
      build {
        sources = ["source.huaweicloud-ecs.builder"]
      
        provisioner "file" {
          source      = "<source file path>"
          destination = "<destination file path>"
        }
      
        provisioner "shell" {
          scripts = [
            "<source script file: step1.sh>",
            "<source script file: step2.sh>"
          ]
        }
      
        provisioner "shell" {
          inline = ["echo foo"]
        }
      }
    export REGION_NAME=xxx
    export IAM_ACCESS_KEY=xxx
    export IAM_SECRET_KEY=xxx
    export ECS_VPC_ID=xxx
    export ECS_NETWORK_ID=xxx
    export ECS_SECGRP_ID=xxx
    export CCE_SOURCE_IMAGE_ID=xxx
    表1 variables配置参数说明

    参数

    参数说明

    备注

    REGION_NAME

    所属项目区域。

    请在我的凭证下查看所属区域。

    IAM_ACCESS_KEY

    用户认证凭据Access Key。

    建议临时申请,制作完成后删除。

    IAM_SECRET_KEY

    用户认证凭据Secret Key。

    建议临时申请,制作完成后删除。

    ECS_VPC_ID

    虚拟私有云ID。

    临时ECS服务器使用,需要与执行机一致。

    ECS_NETWORK_ID

    子网的网络ID。

    临时ECS服务器使用,建议与执行机一致,非子网的子网ID。

    ECS_SECGRP_ID

    安全组ID。

    临时ECS服务器使用,建议与执行机一致,或者允许执行机SSH登录。

    CCE_SOURCE_IMAGE_ID

    CCE服务的最新节点镜像ID。

    -

    备注:其他参数通常无需配置,默认即可。如需修改,可以参考turbo-node.pkr.hcl中variable定义中的description描述通过环境变量配置。

    以ECS规格变量ecs_az为例,未指定时选择随机可用区,如需指定可以按照如下格式通过环境变量配置。其他参数类似。

    # export PKR_VAR_<variable name>=<variable value>
    export PKR_VAR_ecs_az=xxx

  4. 参考1中样例说明,定制修改cce-image-builder下user-scripts,user-packages目录,并修改或添加turbo-node.pkr.hcl对应的file和shell模块配置实现。
  5. 定制修改结束后,执行make image并等待镜像制作完成,通常需要耗时3~5min。

    构建封装脚本packer.sh中,

    • 隐私和安全考虑,默认关闭了packer自动访问hashicorp.com检查版本的功能。
      export CHECKPOINT_DISABLE=false
    • 构建过程可见性与可追溯考虑,默认开启了debugging详细日志,并指定了本地packer构建日志packer_{timestamp}.log以在构建时打包至镜像/var/log/目录。如涉及敏感信息,移除相关逻辑即可。
      export PACKER_LOG=1
      export PACKER_BUILD_TIMESTAMP=$(date +%Y%m%d%H%M%S)
      export PACKER_LOG_PATH="packer_$PACKER_BUILD_TIMESTAMP.log"

    更多packer配置详细参见官网说明

    执行结束日志:

    如果出现packer插件报错的情况,请参见常见问题处理。

  6. 清理执行机上构建文件,主要涉及turbo-node.pkr.hcl中认证凭据清理。

    • 建议直接释放执行机,如认证凭据为临时申请建议直接删除;
    • 如需自动构建,建议自行在配置文件中添加post-processor实现相关功能。

  7. 镜像制作完成后,进入IMS镜像服务控制台,找制作好的镜像(默认名称为image-by-packer-xxxxxx,xxxxxx为制作时间),进入镜像详情页,删除如下3个标签(cce-created-at、cce-created-by、cce-created-from)。

    另外还可以修改镜像名称。

    CCE节点创建或者节点池创建时,在私有镜像中选择此镜像创建即可。

常见问题

执行packer制作镜像过程,会自动从github获取最新Huawei Cloud ECS开源插件。此过程会由于网络环境原因导致获取失败,如下所示。

该问题可以通过如下两种方案解决:

  • 在网络环境相对较优的香港等区域创建执行机,对接到原区域创建自定义镜像,例如北京4:

    export REGION_NAME=cn-north-4

  • 手动下载对应插件并初始化至对应本地插件路径。

    插件对应github发布地址为:https://github.com/huaweicloud/packer-plugin-huaweicloud/releases,以CentOS 7.6 x86执行机为例,下载 packer-plugin-huaweicloud_XXX_linux_amd64.zip。

    以CentOS 7.6 x86执行机为例,下载的插件为packer-plugin-huaweicloud_v0.4.0_x5.0_linux_amd64.zip,参考如下命令进行初始化:

    PLUGIN_PATH="$HOME/.packer.d/plugins/github.com/huaweicloud/huaweicloud"
    mkdir -p $PLUGIN_PATH
    unzip packer-plugin-huaweicloud_v0.4.0_x5.0_linux_amd64.zip -d /tmp/
    cp /tmp/packer-plugin-huaweicloud_v0.4.0_x5.0_linux_amd64 $PLUGIN_PATH/
    sha256sum /tmp/packer-plugin-huaweicloud_v0.4.0_x5.0_linux_amd64 | awk '{print $1}' > $PLUGIN_PATH/packer-plugin-huaweicloud_v0.4.0_x5.0_linux_amd64_SHA256SUM
    ll $PLUGIN_PATH/*

    再执行make image命令制作镜像。

分享:

    相关文档

    相关产品

close