如何在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本身都没有正常执行。
修复方案
按照以下规则重写引导脚本即可:
- 删除所有
sudo、sudo su这类多余提权命令,用户数据本身就是root权限运行 - 把自定义的服务安装、配置命令放在EKS bootstrap命令之前执行,避免被bootstrap的退出逻辑截断
- 安装httpd后补充开机自启配置,避免节点重启后服务失效
- 严格遵守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
相关产品推荐
相关产品推荐

