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

上次更新时间:2020 年 2 月 6 日

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

简短描述

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

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

解决方法

安装和配置 Packer

1.    安装 Packer

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

注意:有关为 Packer 配置 AWS 凭证的更多信息,请参阅身份验证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 生成器并启动一个实例。Packer shell provisioner 在实例上运行 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 命令行界面 (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 将二进制文件复制到您自己的 Amazon 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 k8s 1.14  # Build a Amazon EKS Worker AMI for k8s 1.14

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

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


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?