随着云原生时代的到来,应用、业务上云的需求也越来越多,不同的业务场景对容器平台的需求也不尽相同,越来越多的业务需要使用自定义镜像创建Kubernetes集群。本文主要为您介绍如何使用自定义镜像创建Kubernetes集群。
前提条件
确定要使用自定义镜像前,您需要了解容器服务对于自定义镜像的一些要求:
- 基础镜像推荐使用容器服务的最新的基础镜像,因为该镜像不仅可以满足部署Kubernetes集群的需求,同时也是经过容器服务团队严格测试的镜像。自定义镜像需要满足以下要求:
- 满足阿里云cloud-init的要求。更多信息,请参见安装cloud-init。
- ACK专有集群需要开启SSHD Server,且使用默认端口22,以供节点拉起时的文件传输使用。具体操作,请参见通过SSH连接ACK专有版集群的Master节点。
- 使用阿里云NTP Server进行NTP时间同步。
- 若需使用自定义镜像请前往配额平台申请。
背景信息
容器服务支持您使用自定义镜像创建Kubernetes集群,但在制作打包自定义镜像时,往往会遇到以下情况:
- 人工操作步骤,效率低。
- 镜像变更历史记录缺失,不便于故障定位。
- 无法对自定义镜像进行校验并判断是否符合Kubernetes集群节点要求。
基于以上痛点,容器服务团队开源了ack-image-builder项目帮助您快速制作符合Kubernetes集群节点要求的自定义镜像。
ACK-image-builder项目基于开源工具HashiCorp Packer,提供默认配置模板和校验脚本。
注意事项
在使用自定义镜像时,如果您调整OS参数,可能会导致节点启动异常或者功能异常。例如修改kernel.modules_disabled=1
会导致Docker不可用。建议您事先在测试环境上验证自定义镜像的有效性。
操作步骤
使用ACK-image-builder项目创建Kubernetes集群自定义节点镜像的步骤如下:
- 安装Packer。
- 从官方下载页面选择操作系统对应的软件版本,并按照安装说明文档安装和验证Packer。
- 执行以下命令,查看Packer版本信息。
packer version
输出如下版本信息,说明Packer已安装成功:
Packer v1.4.1
- 定义Packer模板。使用Packer创建自定义镜像时,需要创建一个JSON格式的模板文件。在该模板文件中,您需要指定创建自定义镜像的Alicloud Image Builder(生成器)和Provisioners(配置器)。更多信息,请参见Alicloud Image Builder(生成器)和Provisioners(配置器)。
{ "variables": { "region": "cn-hangzhou", "image_name": "test_image{{timestamp}}", "source_image": "centos_7_06_64_20G_alibase_20190711.vhd", "instance_type": "ecs.n1.large", "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": "{{user `instance_type`}}", "io_optimized": "true" } ], "provisioners": [ { "type": "shell", "scripts": [ "scripts/updateKernel.sh", "scripts/reboot.sh", "scripts/cleanUpKerneles.sh", "config/default.sh", "scripts/updateDNS.sh", "scripts/verify.sh" ], "expect_disconnect": true } ] }
参数 描述 access_key 您的AccessKey ID。 secret_key 您的AccessKey Secret。 region 创建自定义镜像时使用临时资源的地域。 image_name 自定义镜像的名称。 source_image 基础镜像的名称,可以从阿里云公共镜像列表获得。 instance_type 创建自定义镜像时生成的临时实例的类型。 provisioners 创建自定义镜像时使用的Packer配置器类型。 - 创建RAM用户(子账号)并生成AccessKey。具体操作,请参见创建RAM用户和获取AccessKey。说明 制作自定义镜像的权限要求较大,建议您创建RAM用户(子账号)时授权Packer需要的对应RAM Policy,关于RAM Policy的具体信息,请参见RAM Policy。
- 导入AccessKey信息并制作自定义镜像。
- 执行以下命令,导入AccessKey信息。
export ALICLOUD_ACCESS_KEY=XXXXXX export ALICLOUD_SECRET_KEY=XXXXXX
- 执行以下命令,制作自定义镜像。
packer build alicloud.json
预期输出:
alicloud-ecs output will be in this color. ==> alicloud-ecs: Prevalidating source region and copied regions... ==> alicloud-ecs: Prevalidating image name... alicloud-ecs: Found image ID: centos_7_06_64_20G_alibase_20190711.vhd ==> alicloud-ecs: Creating temporary keypair: xxxxxx ==> alicloud-ecs: Creating vpc... alicloud-ecs: Created vpc: xxxxxx ==> alicloud-ecs: Creating vswitch... alicloud-ecs: Created vswitch: xxxxxx ==> alicloud-ecs: Creating security group... alicloud-ecs: Created security group: xxxxxx ==> alicloud-ecs: Creating instance... alicloud-ecs: Created instance: xxxxxx ==> alicloud-ecs: Allocating eip... alicloud-ecs: Allocated eip: xxxxxx alicloud-ecs: Attach keypair xxxxxx to instance: xxxxxx ==> alicloud-ecs: Starting instance: xxxxxx ==> alicloud-ecs: Using ssh communicator to connect: 47.111.127.54 ==> alicloud-ecs: Waiting for SSH to become available... ==> alicloud-ecs: Connected to SSH! ==> alicloud-ecs: Provisioning with shell script: scripts/verify.sh alicloud-ecs: [20190726 11:04:10]: Check if kernel version >= 3.10. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if systemd version >= 219. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if sshd is running and listen on port 22. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if cloud-init is installed. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if wget is installed. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if curl is installed. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if kubeadm is cleaned up. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if kubelet is cleaned up. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if kubectl is cleaned up. Verify Passed! alicloud-ecs: [20190726 11:04:10]: Check if kubernetes-cni is cleaned up. Verify Passed! ==> alicloud-ecs: Stopping instance: xxxxxx ==> alicloud-ecs: Waiting instance stopped: xxxxxx ==> alicloud-ecs: Creating image: test_image1564110199 alicloud-ecs: Detach keypair xxxxxx from instance: xxxxxxx ==> alicloud-ecs: Cleaning up 'EIP' ==> alicloud-ecs: Cleaning up 'instance' ==> alicloud-ecs: Cleaning up 'security group' ==> alicloud-ecs: Cleaning up 'vSwitch' ==> alicloud-ecs: Cleaning up 'VPC' ==> alicloud-ecs: Deleting temporary keypair... Build 'alicloud-ecs' finished. ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs: Alicloud images were created: cn-hangzhou: m-bp1aifbnupnaktj00q7s
其中scripts/verify.sh为对检查项的校验部分。
- 执行以下命令,导入AccessKey信息。
- 使用自定义镜像创建Kubernetes集群。本文以创建ACK Pro版集群为例。
- 登录容器服务管理控制台。
- 在控制台左侧导航栏,单击集群。
- 在集群列表页面,单击页面右上角的创建集群。
- 在ACK托管版页签,配置使用自定义镜像创建集群的参数。关于创建集群的参数说明,请参见创建ACK Pro版集群。
- 完成集群配置后,单击下一步节点配置。
- 在节点池配置向导页面,单击自定义镜像的选择。
- 在选择自定义镜像对话框,选择目标镜像,然后单击使用。
- 完成集群的其他配置。
- 配置完成后,单击创建集群。待集群创建完成后,该集群就是使用了自定义镜像,后续的扩容等均会使用该镜像。
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/170725.html