利用Packer自定义镜像创建容器集群

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 利用Packer自定义镜像创建容器集群

阿里云容器服务Kubernetes集群支持CentOS操作系统,在绝大多数情况下可以满足客户的要求。但是有些客户由于业务系统对操作系统依赖比较高,希望定制化一些操作系统参数,则可以用自定义镜像来创建Kubernetes集群。

创建自定义操作系统镜像有两种方式,一是在控制台上通过为一台ECS创建快照的方式创建镜像,注意一定要基于阿里云CentOS作为基础镜像,把对操作系统的定制化更新完打成镜像即可。但这种方式的不便之处在于,如果每次对操作系统镜像有更新,则都要手动操作一遍,很难自动化。而且如果是从已有的Kubernetes节点制作镜像,还需要把Docker,Kubelet等清理干净才能制作镜像,步骤繁琐且容易遗漏。

另外一种方式就是本文介绍的用Packer构建镜像。相关的参考文档:使用Packer创建自定义镜像。采用Packer构建镜像的好处是可以把构建方式自动化,构建所需的参数文件中包含了对干净的基础镜像所做的修改,一目了然,并且可以把配置进行版本化管理。后期需要构建新的镜像,只需改变配置重新执行一下Packer构建即可,非常方便,是在生产环境中使用自定义镜像的推荐方式。

那么有没有一个针对容器服务集群的Packer配置模版呢?容器服务团队开源的ack-image-builder就是一个这样的示例项目。下面我们就来一起动手实践一下。

安装Packer

可以根据官方文档安装Packer https://www.packer.io/intro/getting-started/install.html

创建自定义镜像

克隆ack-image-builder项目到本地,可以看到config和scripts目录下是一些示例定制化脚本,读者可以根据自己的需求更新改。

$ git clone https://github.com/AliyunContainerService/ack-image-builder.git
$ cd ack-image-builder
ack-image-builder $ tree
.
├── LICENSE.txt
├── README.md
├── ack-centos.json
├── config
│   └── default.sh
└── scripts
    ├── cleanUpKerneles.sh
    ├── reboot.sh
    ├── updateKernel.sh
    └── verify.sh

2 directories, 8 files

ack-centos.json 可以配置在把生成好的自定义镜像存在哪个区(示例中为cn-hangzhou)。

{
  "variables": {
    "region": "cn-hangzhou",
    "image_name": "ack_test_image{{timestamp}}",
    "source_image": "centos_7_06_64_20G_alibase_20190218.vhd",
    ...
  },

配置好阿里云账号的AK,然后执行构建命令。

export ALICLOUD_ACCESS_KEY=XXX
export ALICLOUD_SECRET_KEY=XXX
packer build ack-centos.json

大约7-8分钟一个新的自定义镜像就构建成功了。可以进入ECS控制台查看新生成的镜像。

利用自定义镜像创建容器集群

开通自定义镜像白名单

读者如果需要尝试自定义镜像能力,需要先开工单,申请在容器服务控制台上开通自定义镜像的白名单。

创建容器集群

白名单开通后进入容器服务控制台 https://cs.console.aliyun.com/#/k8s/cluster/list,创建Kubernetes集群。选择自定义镜像所在的区,在示例中是cn-hangzhou。

在创建集群的页面中点击"显示高级选项",会出现"自定义镜像"的选择界面:

customized_image

如果在选择中找不到刚创建的镜像,请检查一下集群和自定义镜像是否在同一个Region。

选择了自定义镜像后点击创建集群即可完成一个自定义镜像集群的创建。

集群扩容与自动伸缩

使用自定义镜像创建集群后,集群的扩容与自动伸缩中所用的都是自定义镜像。

scale

Terraform 中自定义镜像支持

利用Terraform创建容器集群也可以使用自定义镜像,具体参数是:

image_id - The ID of node image.

相关链接如下:

专有集群:https://www.terraform.io/docs/providers/alicloud/r/cs_kubernetes.html

托管集群:https://www.terraform.io/docs/providers/alicloud/r/cs_managed_kubernetes.html

讨论

自定义镜像创建集群为很多有对操作系统有定制化要求的客户带来了很大的便利性,在使用自定义镜像的过程中几个比较好的做法是:根据阿里云的提供的最新的CentOS镜像来定制化,利用自定义创建集群后要充分测试,防止对操作系统的更改引发冲突。在实践中也建议基于Packer示例项目来构建镜像。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 容器
要获取ACK(阿里云容器服务)集群中的Deployment
要获取ACK(阿里云容器服务)集群中的Deployment【1月更文挑战第8天】【1月更文挑战第40篇】
64 4
|
4月前
|
Docker 容器
docker容器查看所有没使用的镜像,并删除
docker容器查看所有没使用的镜像,并删除
215 0
|
12天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
15 0
|
24天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
103 1
|
算法 程序员 C语言
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
47 0
|
1月前
|
存储 C++ 容器
set容器一自定义数据类型指定排序规则讲解
set容器一自定义数据类型指定排序规则讲解
15 1
|
2月前
|
关系型数据库 MySQL Linux
docker镜像与容器的迁移
docker迁移镜像步骤 docker迁移容器步骤 docker迁移mysql容器步骤
|
2月前
|
Kubernetes Cloud Native 网络协议
一文搞懂“镜像“和“容器“
一文搞懂“镜像“和“容器“
32 1
|
2月前
|
Kubernetes Linux Docker
如何保存 / 同步多架构容器 Docker 镜像
如何保存 / 同步多架构容器 Docker 镜像
|
2月前
|
消息中间件 运维 应用服务中间件
容器化运维:构建高可用RabbitMQ集群的Docker Compose指南
容器化运维:构建高可用RabbitMQ集群的Docker Compose指南
160 0