You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EKS启动模板引导脚本中正确安装额外软件包

问题根因

三个脚本均存在逻辑/格式错误,导致Apache安装命令从未被实际执行,核心问题如下:

  • 多余的sudo su命令完全无效:EC2启动模板的用户数据引导脚本默认以root身份运行,根本不需要额外提权。在非交互式脚本中执行sudo su会启动一个新的交互式root shell,后续所有命令必须等这个交互式shell退出后才会执行,而脚本运行时没有人工输入,进程会直接阻塞在这一行,后续命令永远不会触发。
  • EKS自带的/etc/eks/bootstrap.sh执行到末尾时会触发kubelet启动、节点加入集群的流程,部分版本的脚本最后会直接调用exit终止当前shell进程,把自定义命令写在bootstrap命令之后的话,这些命令根本没有执行机会,这是变体1的核心问题。
  • 变体3的MIME格式完全不符合规范:multipart格式的用户数据中,每一个独立脚本块都必须被边界符包裹、标注对应的Content-Type头,你把Apache安装的脚本块写在了结束边界--==MYBOUNDARY==--外面,cloud-init服务完全不会识别、执行这部分内容。
  • 变体2虽然把安装命令放在了bootstrap前面,但被开头的sudo su直接阻塞,所有后续命令包括bootstrap本身都没有正常执行。
修复方案

按照以下规则重写引导脚本即可:

  1. 删除所有sudo、sudo su这类多余提权命令,用户数据本身就是root权限运行
  2. 把自定义的服务安装、配置命令放在EKS bootstrap命令之前执行,避免被bootstrap的退出逻辑截断
  3. 安装httpd后补充开机自启配置,避免节点重启后服务失效
  4. 严格遵守MIME multipart的格式规范

可用的引导脚本示例

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
set -ex
# 先执行自定义安装操作
yum update -y
yum install -y httpd
systemctl enable httpd
systemctl start httpd

# 最后执行EKS节点引导逻辑
/etc/eks/bootstrap.sh ${cluster_name} \
  --container-runtime containerd

--==MYBOUNDARY==--
排查方法

后续如果再遇到用户数据脚本执行异常的问题,SSH登录节点后直接查看/var/log/cloud-init-output.log日志即可,这个日志会完整记录用户数据脚本每一行的执行情况、报错信息,不需要盲猜问题点。

内容的提问来源于stack exchange,提问作者user19457124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:45:33