aws eks 使用packer构建自定义ami

2023-11-02 10:31

本文主要是介绍aws eks 使用packer构建自定义ami,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资料

  • 如何创建用于 Amazon EKS 的自定义 Amazon Linux AMI?

  • 构建预置容器镜像的EKS自定义AMI解决方案

  • https://github.com/awslabs/amazon-eks-ami

  • https://github.com/awslabs/amazon-eks-ami/blob/master/doc/USER_GUIDE.md

  • https://developer.hashicorp.com/packer/tutorials

使用aws eks需要依赖与aws的其他服务对基础设施进行配置和维护,例如节点组需要创建autoscaling group对节点的生命周期进行管理。我们能够通过以下方式对节点进行一定的配置

  • 启动启动模板支持
  • 通过bootstrap启动脚本指定kubelet参数

以上方式虽然能够提供一定的灵活性,但是对于需要在节点预装程序以及预加载image等需求,就需要通过在启动模板中指定自定义ami来实现。本文参考官方blog使用packer进行eks的自定义ami的构建

Packer 在工作时需要利用 AWS CloudFormation 堆栈。该堆栈运行一个 m4.large 或 a1.large Amazon Elastic Compute Cloud (Amazon EC2) 实例(具体取决于目标 AMI 架构)。该实例由 Packer 预置。在使用程序包和二进制文件对实例进行预置后,Packer 会从正在运行的实例中创建 AMI。

img

aws-labs之eks-ami

安装和配置packer

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install packer
packer --version

clone官方仓库

git clone https://github.com/awslabs/amazon-eks-ami

在根目录可以看到Makefile文件,该makefile文件提供了对packer命令的封装,查看帮助如下

A Makefile is provided to build the Amazon EKS Worker AMI, but it is just a small wrapper around invoking Packer directly

$ make help
Usage:make <target>all              Build all versions of EKS Optimized AL2 AMIfmt              Format the source fileslint             Check the source files for syntax and format issuestest             run the test-harnessvalidate         Validate packer configk8s              Build default K8s version of EKS Optimized AL2 AMI1.20             Build EKS Optimized AL2 AMI - K8s 1.201.21             Build EKS Optimized AL2 AMI - K8s 1.211.22             Build EKS Optimized AL2 AMI - K8s 1.221.23             Build EKS Optimized AL2 AMI - K8s 1.231.24             Build EKS Optimized AL2 AMI - K8s 1.24help             Display help

每个入口对应一个配置项,可以按需构建所需版本。能够自定义的配置很明确

  1. AMI template variables
  2. Building against other versions of Kubernetes binaries
  3. Providing your own Kubernetes binaries
  4. Container image caching
  5. IAM permissions
  6. Customizing kubelet config
  7. AL2 and Linux kernel information
  8. Updating known instance types

总结如下

  • 有两个配置文件比较重要,eks-worker-al2-variables.json是构建的默认变量,eks-worker-al2.json是packer涉及到的全部变量(可以修改并覆盖)

  • 默认使用AL2作为源ami,在构建中提供自定义ami,需要修改配置文件eks-worker-al2.json

在 Packer 配置文件 eks-worker-al2.json 中设置变量 source_ami_idsource_ami_ownersaws_region

  • 可以在构建过程中提供自定义的二进制文件,可以看到有5个组件是必须的

默认情况下,会从 us-west-2 中的 Amazon EKS 公有 Amazon Simple Storage Service(Amazon S3)存储桶 amazon-eks 下载二进制文件

$ aws s3 ls s3://amazon-eks/1.24.7/2022-10-31/bin/linux/amd64/ | grep -v "\."
2022-11-09 21:21:23   47403008 aws-iam-authenticator
2022-11-09 21:21:57   15351808 ecr-credential-provider
2022-11-09 21:22:05   41828352 kube-proxy
2022-11-09 21:22:20   45735936 kubectl
2022-11-09 21:22:38  119789048 kubelet
  • 在构建过程中可以指定二进制文件的版本,官方的s3桶已经按照版本和构建日期提供了许多文件

  • 由于节点启动过程中需要拉取image完成配置到达ready状态,可以将这些image打包到ami中加速节点启动。以下命令开启image缓存功能

cache_container_images=true make 1.23
  • 使用eks优化的ami支持在bootstrap脚本中加入--kubelet-extra-args参数对kubelet进行修改。和kubelet相关的任何额外参数,在节点启动的过程中都能够在journalctl -u kubelet中找到

    有一个比较快捷的方式(开启apiserver代理访问)能够获取特定节点的kubelet配置文件

    $ kubectl proxy
    $ curl -sSL "http://localhost:8001/api/v1/nodes/ip-192-168-92-220.us-east-2.compute.internal/proxy/configz" | jq
    
  • 默认在构建过程中,使用source_ami_filter对ami进行筛选,选择的是最新的AL2作为底包。构建ami的好处在于能够选择内核版本,例如想要使用cilium全部功能内核可能要很新才行

    When building an AMI, you can set the kernel_version to 4.14 or 5.4 to customize the kernel version. The upgrade_kernel.sh script contains the logic for updating and upgrading the kernel. For Kubernetes versions 1.18 and below, it uses the 4.14 kernel if not set, and it will install the latest patches. For Kubernetes version 1.19 and above, it uses the 5.4 kernel if not set.

  • 此外,一些实例类型在启动时会出现问题,原因是bootstrap.sh通过查找eni-max-pods.txt文件中实例类型对应的最大pod数量,如果没有查到会报错。因此需要将此实例类型的pod数量更新到文件中。这个在节点启动逻辑那篇blog中也有提及。

packer和aws

镜像即代码:使用 Packer 实现自动化构建镜像

packer是Hashicorp 开发的镜像构建工具,能够提供跨平台的系统镜像构建能力。

img

packer为aws的镜像构建提供了完善的支持,并提供了相当多的插件进行定制,官方示例如下:

创建.pkr.hcl文件,使用插件扩展pakcer打包器的功能(amazon插件)

$ mkdir packer_tutorial
$ cat aws-ubuntu.pkr.hcl
packer {required_plugins {amazon = {version = ">= 0.0.2"source  = "github.com/hashicorp/amazon"}}
}source "amazon-ebs" "ubuntu" {ami_name      = "learn-packer-linux-aws"instance_type = "t2.micro"region        = "cn-north-1"source_ami_filter {filters = {name                = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"root-device-type    = "ebs"virtualization-type = "hvm"}most_recent = trueowners      = ["099720109477"]}ssh_username = "ubuntu"
}build {name    = "learn-packer"sources = ["source.amazon-ebs.ubuntu"]
}

使用pakcer构建aws镜像需要首先配置aws凭证,可以使用aksk获取权限

可以将模板中的变量通过variable的方式进行配置

初始化packer,会下载相关插件

packer init .

构建镜像,pakcer会使用cloudformation启动相关资源使用上述配置执行构建操作,

packer build aws-ubuntu.pkr.hcl

构建eks-ami

通过修改构建脚本,可以在ami构建中指定需要运行的shell命令

cd amazon-eks-ami && vim scripts/install-worker.sh

scripts文件夹中的脚本在eks-worker-al2.json配置中的Provisioners部分配置,在packer中provisioners代表实例启动后需要对ami进行的配置,通常包括:安装包,打补丁,用户管理,下载code等,例如以下install-worker.sh脚本

{"type": "shell","remote_folder": "{{ user `remote_folder`}}","script": "{{template_dir}}/scripts/install-worker.sh","environment_vars": ["KUBERNETES_VERSION={{user `kubernetes_version`}}","KUBERNETES_BUILD_DATE={{user `kubernetes_build_date`}}","BINARY_BUCKET_NAME={{user `binary_bucket_name`}}","BINARY_BUCKET_REGION={{user `binary_bucket_region`}}","DOCKER_VERSION={{user `docker_version`}}","CONTAINERD_VERSION={{user `containerd_version`}}","RUNC_VERSION={{user `runc_version`}}","CNI_PLUGIN_VERSION={{user `cni_plugin_version`}}","PULL_CNI_FROM_GITHUB={{user `pull_cni_from_github`}}","AWS_ACCESS_KEY_ID={{user `aws_access_key_id`}}","AWS_SECRET_ACCESS_KEY={{user `aws_secret_access_key`}}","AWS_SESSION_TOKEN={{user `aws_session_token`}}","SONOBUOY_E2E_REGISTRY={{user `sonobuoy_e2e_registry`}}","PAUSE_CONTAINER_VERSION={{user `pause_container_version`}}","CACHE_CONTAINER_IMAGES={{user `cache_container_images`}}"]
}

S3_PATH="s3://$BINARY_BUCKET_NAME/$KUBERNETES_VERSION/$KUBERNETES_BUILD_DATE/bin/linux/$ARCH"之后添加以下命令

export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')aws --version
aws sts get-caller-identity
aws configure set default.region ${AWS_REGION}
aws configure get default.regionecho "start docker"
sudo systemctl start docker
echo "pull image"
sudo docker pull hello-world
echo "docker stop"
sudo systemctl stop docker

由于需要使用aws命令拉取资源,通过环境变量配置构建ami使用的凭证

export AWS_ACCESS_KEY_ID=xxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxexport ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')

启动新实例构建ami,在cn-north-1区域执行构建需要修改packer变量配置

cd amazon-eks-ami
$ make 1.23

默认类型为m4.large,由于众所周知的原因,去us拉取kubelet等二进制程序非常慢,可以提前下载到s3中,并修改packer变量

在这里插入图片描述

构建完成后只需要在创建集群时指定ami即可

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:name: xxxxversion: "1.23"region: cn-north-1managedNodeGroups:- name: testpakcerami: ami-xxxxxxxxxxxxdesiredCapacity: 1minSize: 0maxSize: 3instanceType: t3.mediumprivateNetworking: falsessh:allow: truepublicKeyName: cluster-keyiam:withAddonPolicies:imageBuilder: truealbIngress: trueebs: true

这篇关于aws eks 使用packer构建自定义ami的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329993

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]