我想创建一个自定义 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_id、source_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-eks、kubernetes_version、kubernetes_build_date 和 arch 替换为您自己的值。
**重要提示:**要在预置期间将您自己的二进制文件下载到工作线程节点,您必须复制 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-bucket、amazon-eks、kubernetes_version、kubernetes_build_date 和 arch 替换为您自己的值。
重要提示:您必须提供默认 amazon-eks 存储桶中列出的所有二进制文件,以用于特定的 kubernetes_version、kubernetes_build_date 和 arch 组合。这些二进制文件必须能够通过在安装和配置 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_name、binary_bucket_region、kubernetes_version 和 kubernetes_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 的常见问题。