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

上次更新日期:2020 年 11 月 20 日

我想创建一个自定义 Amazon Linux Amazon 系统映像 (AMI),以与 Amazon Elastic Kubernetes Service (Amazon EKS) 集群一起部署。

简短描述

要创建用于 Amazon EKS 的自定义 Amazon Linux AMI,您必须使用以下内容:

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

分辨率

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

安装和配置 Packer

1.    从 Hashicorp 网站安装 Packer

2.    配置您的 AWS 账户凭证,以便 Packer 代表您调用 AWS API 操作。您可以使用静态凭证(密钥和秘密访问密钥)、环境变量,共享凭证文件或 Amazon EC2 角色。

注意:有关为 Packer 配置 AWS 凭证的更多信息,请参阅 HashiCorp 网站上的身份验证IAM 任务或实例角色

克隆 Amazon EKS AMI 存储库

要将 Amazon EKS AMI 存储库克隆到您的工作站,请运行以下命令:

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

注意:Packer 是通过一系列带有 eks-worker-al2.json 作为构建规范的生成文件目标执行的。构建流程会使用 amazon-ebs Packer 生成器(源自 HashiCorp 网站)并启动一个实例。Packer shell provisioner(源自 HashiCorp 网站)在实例上运行 install-worker.sh 脚本,以安装软件并执行其他配置任务。然后,Packer 从实例中创建一个 AMI,并在创建 AMI 后终止该实例。

提供自定义源 AMI

要配置自定义源 AMI,请在 Packer 配置文件 eks-worker-al2.json 中设置变量 source_ami_idsource_ami_owners 和 aws_region。例如:

"source_ami_id": "SOURCE_AMI_ID",      # Enter the ID of your source image
"source_ami_owners": "AWS_ACCOUNT_ID", # Enter the account where this image is stored
"aws_region": "AWS_DEFAULT_REGION",    # Enter the AWS Region of the source AMI

要提供自定义工作线程二进制文件,请完成(可选)提供您自己的 Kubernetes 二进制文件部分中的步骤。

要使用 AWS 中的默认 Kubernetes 二进制文件构建镜像,请完成使用默认二进制文件构建 Amazon EKS 工作线程 AMI 部分中的步骤。

(可选)提供您自己的 Kubernetes 二进制文件

当 Packer 预置实例时,默认情况下,会从 us-west-2 中的 Amazon EKS 公有 Amazon Simple Storage Service (Amazon S3) 存储桶 amazon-eks 下载二进制文件。有关更多信息,请参阅 install-worker.sh 文件

1.    要检查默认存储桶中提供的可用二进制文件,请运行以下 AWS CLI 命令

$ aws s3 ls s3://amazon-eks 
$ aws s3 ls s3://amazon-eks/kubernetes_version/kubernetes_build_date/bin/linux/arch/

注意:amazon-ekskubernetes_versionkubernetes_build_datearch 替换为您自己的值。

重要提示:要在预置期间将您自己的二进制文件下载到工作线程节点,您必须复制 install-worker.sh 脚本中使用的 amazon-eks 存储桶文件夹结构。

2.    在通过您自己的构建流程准备好二进制文件之后,使用 AWS CLI 将二进制文件复制到您自己的 S3 存储桶中。

下面是一个使用自定义 kubelet 二进制文件的示例:

$ aws s3 cp kubelet s3://my-custom-bucket/kubernetes_version/kubernetes_build_date/bin/linux/arch/kubelet

注意:my-custom-bucketamazon-ekskubernetes_versionkubernetes_build_datearch 替换为您自己的值。

重要提示:您必须提供默认 amazon-eks 存储桶中列出的所有二进制文件,以用于特定的 kubernetes_versionkubernetes_build_datearch 组合。这些二进制文件必须能够通过在安装和配置 HashiCorp Packer 部分中配置的 AWS Identity and Access Management (IAM) 凭证进行访问。

使用自定义二进制文件构建 Amazon EKS 工作线程 AMI

要开始构建流程,请使用在 eks-worker-al2.json 中配置的源 AMI 调用带有参数的 make 命令。例如:

$ make k8s \
    binary_bucket_name=my-custom-bucket \
    binary_bucket_region=eu-west-1 \
    kubernetes_version=1.14.9 \
    kubernetes_build_date=2020-01-22

注意:请确认 binary_bucket_namebinary_bucket_regionkubernetes_versionkubernetes_build_date 参数与您在 Amazon S3 中的二进制文件的路径匹配。

使用默认二进制文件构建 Amazon EKS 工作线程 AMI

1.    要使用自定义基础 AMI 和默认(最新)的 Kubernetes 二进制文件构建 Amazon EKS 工作线程 AMI,请确认 eks-worker-al2.json 文件已使用正确的基础 AMI 进行更新。

2.    要通过提供 Kubernetes 版本作为参数来触发构建流程,请运行以下命令:

$ make 1.14  # Build a Amazon EKS Worker AMI for k8s 1.14

注意:对于更高级的配置,您必须在触发构建流程之前修改 amazon-eks-ami AWS GitHub 存储库中的配置文件。

提示:请查看 AWS GitHub,了解使用 Packer 配置构建自定义 AMI 的常见问题。</p


这篇文章对您有帮助吗?


您是否需要账单或技术支持?