为什么需要这个脚本?

如果你跟我一样,经常需要在干净的 Amazon Linux 2(或 CentOS/RHEL 系)机器上部署 Amazon EKS 集群,你一定体会过下面这套“仪式”有多繁琐:

  1. 打开 AWS 文档,找到「安装 AWS CLI」章节,复制 curl 命令;

  2. 再切到 Kubernetes 文档,找到「安装 kubectl」章节,复制另一条 curl 命令;

  3. 再去 eksctl 的 GitHub Release 页面,找到最新版下载链接,再复制一条 tar 命令;

  4. 安装完成后,还要手动把 /usr/local/bin 加到 PATH,顺手再配个自动补全;

  5. 最后发现忘了 chmod +x,或者下载链接过期,又得重来一次……

这一套流程重复 3-5 次之后,我终于忍不了了:“能不能一条命令自动搞定?”

于是就有了今天的主角——aws_k8s_tools_install.sh


脚本能做什么?

一句话总结:

在 Amazon Linux 2 上,一条 sudo ./aws_k8s_tools_install.sh 就能把 AWS CLI v2、kubectl、eksctl 一次装好,并自动配置好环境变量和自动补全。

具体动作包括:

步骤

说明

1

检查是否 root 权限(必须 sudo 运行)

2

yum update -y 更新系统

3

安装常用依赖:unzip curl wget ca-certificates

4

先卸掉老旧的 AWS CLI v1,再装 v2

5

安装最新稳定版 kubectl(自动探测 CPU 架构)

6

安装最新版 eksctl

7

验证三个二进制都能 --version

8

/usr/local/bin 追加到 ~/.bashrc

9

为 AWS CLI 开启自动补全

10

.bashrc 权限还给非 root 用户


使用方法

  1. 复制脚本内容到 aws_k8s_tools_install.sh(内容放在最后了)

  2. 赋权

    chmod +x aws_k8s_tools_install.sh
  3. 运行

    sudo ./aws_k8s_tools_install.sh
  4. 重新登录或

    source ~/.bashrc

踩坑记录 & 优化点

  1. 必须 root 权限
    早期版本没检查 EUID,结果 mv/usr/local/bin 时各种 Permission denied

  2. AWS CLI v1 残留
    有些 AMI 自带旧版 awscli,和新版并存会冲突,所以先 yum remove -y

  3. 自动补全路径要写死
    不同发行版 aws_completer 位置不一样,Amazon Linux 2 装在 /usr/local/bin,所以脚本里写死。

  4. 非 root 用户 .bashrc 权限
    sudo 下创建的文件属于 root,最后一步 chown 把文件还给实际用户,避免 vim ~/.bashrc 时没权限。


后续计划

  • 支持 Ubuntu/Debian 系(apt 包管理)。

  • 支持 macOS(brew 版)。

  • 检测已有版本,跳过重复安装。

  • 用 GitHub Action 跑 CI,每次 eksctl/kubectl 发版自动更新脚本里的下载链接。

代码:

#!/bin/bash

# Exit on error
set -e

echo "Starting installation and configuration of AWS CLI, kubectl, and eksctl..."

# Install AWS CLI
echo "Installing AWS CLI..."
sudo yum remove -y awscli || true
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip -o awscliv2.zip
sudo ./aws/install --update
rm -rf awscliv2.zip aws

# Install kubectl
echo "Installing kubectl..."
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.33.0/2025-05-01/bin/linux/amd64/kubectl
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.33.0/2025-05-01/bin/linux/amd64/kubectl.sha256
sha256sum -c kubectl.sha256
chmod +x ./kubectl
mkdir -p $HOME/bin
cp ./kubectl $HOME/bin/kubectl
rm -f kubectl kubectl.sha256

# Install eksctl
echo "Installing eksctl..."
ARCH=amd64
PLATFORM=$(uname -s)_$ARCH
curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"
curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check || echo "Warning: eksctl checksum verification failed"
tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm -f eksctl_$PLATFORM.tar.gz
sudo install -m 0755 /tmp/eksctl /usr/local/bin

# Configure PATH and shell settings permanently
echo "Configuring PATH and shell settings..."

# Check if .bashrc exists, create if not
touch ~/.bashrc

# Check if .bash_profile exists, create if not
touch ~/.bash_profile

# Add PATH configurations to .bashrc if not already present
if ! grep -q "export PATH=/usr/local/bin:\$PATH" ~/.bashrc; then
    echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
fi

if ! grep -q "export PATH=\$HOME/bin:\$PATH" ~/.bashrc; then
    echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
fi

# Add kubectl autocompletion to .bashrc if not already present
if ! grep -q "source <(kubectl completion bash)" ~/.bashrc; then
    echo 'source <(kubectl completion bash)' >> ~/.bashrc
fi

# Add kubectl alias to .bashrc if not already present
if ! grep -q "alias k=kubectl" ~/.bashrc; then
    echo 'alias k=kubectl' >> ~/.bashrc
    echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc
fi

# Source .bashrc from .bash_profile if not already present
if ! grep -q "source ~/.bashrc" ~/.bash_profile; then
    echo 'if [ -f ~/.bashrc ]; then source ~/.bashrc; fi' >> ~/.bash_profile
fi

# Apply changes to current session
source ~/.bashrc

echo "Installation and configuration completed successfully!"
echo "Your PATH and tools are now permanently configured."
echo "You can verify the installations with:"
echo "  aws --version"
echo "  kubectl version --client"
echo "  eksctl version"