如何为 Amazon EKS 创建自定义 Amazon Linux AMI?

2 分钟阅读
0

我想创建一个自定义 Amazon Linux 亚马逊机器镜像(AMI),用 Amazon Elastic Kubernetes Service(Amazon EKS)集群进行部署。

解决方案

先决条件

  • 在本地计算机上或 Amazon Linux Amazon Elastic Compute Cloud(EC2)实例上安装 Packer。有关说明,请参阅 Hashicorp 网站上的 Install Packer
  • 然后,安装 Amazon 插件以便与 Hashicorp Packer 一起使用在 AWS 上创建自定义映像。有关说明,请参阅 Hashicorp 网站上的 Installation
  • 确保安装了 makegit
    sudo yum install make -y
    sudo yum install git -y

为 Amazon EKS 创建自定义 Amazon Linux AMI

完成下面的步骤:

  1. 要克隆 amazon-eks-ami AWS Labs 存储库,请运行下面的命令:

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

    有关更多信息,请参阅 GitHub 网站上的 amazon-eks-ami

  2. 要在 amazon-eks-ami 目录中创建名为 variables-custom.json 的新文件,请运行下面的命令:

    sudo vi variables-custom.json

    **注意:**variables-custom.json 覆盖的默认变量文件位于 GitHub 网站上的 variables-default.json 文件中。如果使用 Amazon Linux 2(AL2),则 variables-default.json 的文件路径是 /amazon-eks-ami/templates/al2/variables-default.json。如果使用 Amazon Linux 2023(AL2023),则文件路径为 /amazon-eks-ami/templates/al2023/variables-default.json

  3. variables-custom.json 文件中,添加您的值:

    {
        "aws_region": "AWS_Region",
    
        "source_ami_filter_name": "AMI_Name",
        "source_ami_id": "Source_AMI_ID",
        "source_ami_owners": "AMI_Owner_Account_ID",
    
        "temporary_security_group_source_cidrs": "Source_Machine_IP", #example: local_machine_IP /32 or NAT_GW_IP /32 or EC2_PublicIP /32
    
        "launch_block_device_mappings_volume_size": "Integer", #Root volume size of the instance to be launched by packer
    
        "iam_instance_profile": "IAM_Instance_Profile_Name" #Optional
    }

    当使用现有 AMI 作为源为 EKS 创建自定义 AMI 时,请设置 launch_block_device_mappings_volume_size 值。该值必须等于或大于 AMI 快照卷大小。variables-default.json 文件中的默认值为“4”。
    如果在 Packer 中使用 iam_instance_profile 选项,则必须提供要附加的 IAM 角色的实例配置文件名称。不要提供 IAM 角色 ARN 或实例配置文件 ARN。
    如果未提供 temporary_security_group_source_cidrs 参数,则 Packer 会向所有 IP 地址(0.0.0.0/0)开放 SSH 端口。为了防止安全风险,最佳做法是在 temporary_security_group_source_cidrs 参数中指定源计算机的 IP 地址。

  4. 要启动自定义 AMI 创建过程,请运行下面的命令:

    sudo make PACKER_OPTIONAL_K8S_VARIABLE_FILE=variables-custom.json k8s=1.29 os_distro=al2 arch=x86_64 -d

    或者,要启用 packer 日志记录,请运行下面的命令:

    sudo PACKER_LOG_PATH=packer_logs.txt`TZ=":Asia/Kolkata" date +%Y-%m-%d_%H%M` PACKER_LOG=1 make PACKER_OPTIONAL_K8S_VARIABLE_FILE=variables-custom.json k8s=1.29 os_distro=al2 arch=x86_64 -d

    **注意:**要设置系统的时区,请将 ":Asia/Kolkata" 替换为您的时区。生成的 Packer 日志文件位于运行 Packer 命令的同一目录中。

  5. 检查用于运行 make 命令的 IAM 用户凭证或 IAM 角色是否具有所需的 IAM 权限。有关详细信息,请参阅 Hashicorp 网站上的 IAM task or instance roleAttaching IAM policies to roles。此外,权限必须允许访问默认 Amazon Simple Storage Service(Amazon S3)存储桶。您必须附加 AmazonS3ReadOnlyAccess 策略。如果没有访问 S3 存储桶的权限,则可能会收到以下错误:

    “required variable not set: kubernetes_build_date
    required variable not set: kubernetes_version”

    **注意:**这些权限允许 Packer 对 AWS 进行 API 调用。或者,您可以配置静态凭证,例如密钥和秘密访问密钥、环境变量或共享凭证文件。

  6. 验证您的自定义 AMI 是否存在于源 AMI 的 AWS 区域中。

当 Packer 预置实例时,将从 us-west-2 中的 Amazon EKS 公共 S3 存储桶 amazon-eks 下载默认二进制文件。有关更多信息,请参阅 GitHub 网站上的 install-worker.sh 文件。

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

完成下面的步骤:

  1. 要检查默认存储桶中提供的可用二进制文件,请运行下面的命令:
    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 替换为您的值。
  2. 要将自己的二进制文件按预置方式下载到 Worker 节点,请镜像 install-worker.sh 脚本中使用的 amazon-eks 存储桶文件夹结构。
  3. 准备好二进制文件后,使用 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 存储桶中列出的所有二进制文件。
  4. 要开始构建过程,请使用在目录 al2variables-default.json 中配置的源 AMI,路径为 /amazon-eks-ami/templates/al2/variables-default.json。要使用参数调用 make,请运行类似于以下内容的命令:
    make k8s  binary_bucket_name=Custom_Bucket_Name  binary_bucket_region=Region  kubernetes_version=Version  kubernetes_build_date=Build_Date -d
    **注意:**确认 binary_bucket_namebinary_bucket_regionkubernetes_versionkubernetes_build_date 参数与 Amazon S3 中二进制文件的路径匹配。
AWS 官方
AWS 官方已更新 6 个月前