添加 scripts/k8s-master.sh

aa
This commit is contained in:
joy 2025-10-29 16:51:59 +08:00
parent bd494cd95c
commit fd93265720
1 changed files with 348 additions and 0 deletions

348
scripts/k8s-master.sh Normal file
View File

@ -0,0 +1,348 @@
#!/bin/bash
set -euo pipefail
# 脚本版本
SCRIPT_VERSION="1.7"
# 默认K8s版本
DEFAULT_K8S_VERSION="1.30.5"
# 阿里云K8s镜像基础路径验证有效
ALIBABA_MIRROR_BASE="https://mirrors.aliyun.com/kubernetes-new/core/stable"
# 用户指定的nerdctl内网下载地址
NERDCTL_DOWNLOAD_URL="http://10.102.32.207:5588/k8s/nerdctl-1.5.0-linux-amd64.tar.gz"
# 帮助信息
usage() {
cat << EOF
Kubernetes Master组件 + nerdctl 完整安装脚本适配内网nerdctl下载
功能:安装/卸载K8s组件kubelet/kubeadm/kubectl、nerdctl配置crictl和kubectl补全
前提需预先安装containerd脚本会自动检测确保能访问内网nerdctl下载地址
用法: $0 [选项]
选项:
--install 安装组件及配置
--uninstall 卸载组件及配置保留containerd
--version <ver> 指定K8s版本如1.30.5,仅与--install配合
--help 显示帮助信息
--script-version 显示脚本版本
示例:
安装默认版本:
sudo $0 --install
安装指定版本:
sudo $0 --install --version 1.30.5
卸载:
sudo $0 --uninstall
EOF
exit 1
}
# 检查是否为root用户
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo "错误请使用root权限运行sudo $0 ..."
exit 1
fi
}
# 检查containerd是否已安装并运行
check_containerd() {
if ! command -v containerd &> /dev/null; then
echo "错误未检测到containerd请先执行以下命令安装"
echo "sudo apt-get update && sudo apt-get install -y containerd"
exit 1
fi
# 检查版本
local containerd_ver=$(containerd --version | head -n1 | awk '{print $3}')
echo "检测到已安装containerd版本$containerd_ver"
# 检查运行状态
if ! systemctl is-active --quiet containerd; then
echo "警告containerd未运行尝试启动..."
systemctl start containerd || {
echo "错误启动containerd失败请手动检查状态"
exit 1
}
fi
}
# 校验K8s版本格式x.y.z
validate_version() {
local version=$1
if ! [[ $version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "错误无效的K8s版本格式 '$version',正确格式为 x.y.z如1.30.5"
exit 1
fi
}
# 提取主版本如1.30.5 -> 1.30
get_major_version() {
local version=$1
echo "$version" | cut -d '.' -f 1,2
}
# 配置kubectl命令补全
configure_kubectl_completion() {
echo -e "\n===== 配置kubectl命令补全 ====="
# 安装bash-completion依赖
apt-get install -y -qq bash-completion > /dev/null
# 写入补全配置到全局profile所有用户生效
local bash_profile="/etc/profile.d/kubectl-completion.sh"
if ! grep -q "source <(kubectl completion bash)" "$bash_profile" 2>/dev/null; then
echo "source <(kubectl completion bash)" | tee -a "$bash_profile" > /dev/null
echo "已添加kubectl补全配置到 $bash_profile(所有用户生效)"
else
echo "kubectl补全配置已存在跳过写入"
fi
# 立即生效当前会话
source <(kubectl completion bash)
echo "kubectl命令补全已生效当前会话"
}
# 安装nerdctl使用用户指定的内网下载地址
install_nerdctl() {
echo -e "\n===== 开始安装nerdctl ====="
# 优先通过系统仓库安装(兼容性更好)
if apt-cache show nerdctl &> /dev/null; then
echo "通过系统仓库安装nerdctl..."
apt-get install -y -qq nerdctl > /dev/null
else
# 系统仓库无则使用用户指定的内网地址下载
echo "系统仓库无nerdctl从内网地址下载$NERDCTL_DOWNLOAD_URL"
# 下载二进制包到临时目录
if ! curl -fsSL "$NERDCTL_DOWNLOAD_URL" -o /tmp/nerdctl.tar.gz; then
echo "错误从内网地址下载nerdctl失败请检查"
echo "1. 内网地址是否可访问($NERDCTL_DOWNLOAD_URL"
echo "2. 网络是否连通(可尝试 curl $NERDCTL_DOWNLOAD_URL 测试)"
exit 1
fi
# 解压到/usr/local/bin系统可执行路径
tar -zxf /tmp/nerdctl.tar.gz -C /usr/local/bin nerdctl > /dev/null
# 清理临时文件
rm -f /tmp/nerdctl.tar.gz
echo "nerdctl二进制包已解压到 /usr/local/bin"
fi
# 配置crictl连接containerd
echo -e "\n===== 配置crictl连接containerd ====="
crictl config runtime-endpoint unix:///run/containerd/containerd.sock || {
echo "错误配置crictl失败"
exit 1
}
echo "crictl已配置为连接containerd运行时"
# 验证安装
echo "===== nerdctl安装完成版本信息====="
nerdctl --version
}
# 安装Kubernetes组件核心流程
install_k8s() {
local k8s_version=$1
local major_version=$(get_major_version "$k8s_version")
local deb_version="${k8s_version}-1.1"
# 前置检查containerd
check_containerd
echo "===== 开始安装Kubernetes组件版本: $k8s_version ====="
# 1. 更新系统并安装基础依赖
echo "[1/6] 更新系统包索引并安装依赖..."
apt-get update -qq > /dev/null
apt-get install -y -qq apt-transport-https ca-certificates curl lsb-release bash-completion > /dev/null
mkdir -p /etc/apt/keyrings # 确保密钥目录存在
# 2. 添加阿里云K8s GPG密钥强制覆盖无交互
echo "[2/6] 添加Kubernetes GPG密钥..."
local key_url="${ALIBABA_MIRROR_BASE}/v${major_version}/deb/Release.key"
if ! curl -fsSL "$key_url" | gpg --dearmor > /etc/apt/keyrings/kubernetes-apt-keyring.gpg 2>/dev/null; then
echo "错误获取K8s GPG密钥失败URL: $key_url"
echo "建议手动访问URL检查是否有效或更换网络环境"
exit 1
fi
# 3. 添加K8s软件源
echo "[3/6] 配置Kubernetes软件源..."
local repo_url="${ALIBABA_MIRROR_BASE}/v${major_version}/deb/"
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] $repo_url /" | \
tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
# 4. 刷新软件源
echo "[4/6] 加载新软件源..."
apt-get update -qq > /dev/null || {
echo "错误:刷新软件源失败,请检查网络"
exit 1
}
# 5. 安装指定版本的K8s组件
echo "[5/6] 安装kubelet、kubeadm、kubectl版本: $deb_version..."
if ! apt-get install -y -qq \
kubelet="$deb_version" \
kubeadm="$deb_version" \
kubectl="$deb_version" > /dev/null 2>&1; then
echo "错误安装K8s组件失败可能版本不存在"
echo "建议:执行 'apt-cache madison kubeadm' 查看可用版本"
exit 1
fi
# 6. 配置kubelet锁定版本+自启)
echo "[6/6] 配置kubelet服务..."
apt-mark hold kubelet kubeadm kubectl > /dev/null
systemctl enable kubelet --now || {
echo "错误启动kubelet失败"
exit 1
}
echo "kubelet已设置为开机自启并启动成功"
# 验证K8s组件安装
echo -e "\n===== K8s组件安装完成版本信息====="
kubelet --version
# 安装nerdctl使用内网地址
install_nerdctl
# 配置kubectl补全
configure_kubectl_completion
echo -e "\n===== 所有组件安装及配置完成 ====="
echo "下一步可执行 'kubeadm init' 初始化集群(需根据网络配置参数)"
}
# 卸载组件及配置保留containerd
uninstall_k8s() {
echo "===== 开始卸载组件 ====="
# 1. 停止kubelet服务
echo "[1/5] 停止kubelet服务..."
if systemctl is-active --quiet kubelet; then
systemctl stop kubelet > /dev/null
fi
# 2. 卸载K8s组件
echo "[2/5] 卸载kubelet、kubeadm、kubectl..."
apt-get purge -y -qq kubelet kubeadm kubectl > /dev/null
apt-get autoremove -y -qq > /dev/null
# 3. 卸载nerdctl
echo "[3/5] 卸载nerdctl..."
if command -v nerdctl &> /dev/null; then
# 根据安装方式选择卸载方法(系统仓库或二进制)
if dpkg -l nerdctl &> /dev/null; then
apt-get purge -y -qq nerdctl > /dev/null
else
rm -f /usr/local/bin/nerdctl # 清理内网下载的二进制文件
fi
fi
apt-get autoremove -y -qq > /dev/null
# 4. 解锁版本锁定
echo "[4/5] 解除版本锁定..."
apt-mark unhold kubelet kubeadm kubectl nerdctl > /dev/null 2>&1 || true
# 5. 清理配置文件和数据目录
echo "[5/5] 清理配置文件和数据目录..."
rm -f /etc/apt/sources.list.d/kubernetes.list
rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg
rm -rf /var/lib/kubelet /etc/kubernetes /var/lib/etcd /var/lib/cni /etc/crictl.yaml > /dev/null 2>&1 || true
# 清理kubectl补全配置
local bash_profile="/etc/profile.d/kubectl-completion.sh"
if grep -q "source <(kubectl completion bash)" "$bash_profile" 2>/dev/null; then
sed -i '/source <(kubectl completion bash)/d' "$bash_profile"
echo "已移除kubectl补全配置"
fi
# 刷新软件源
apt-get update -qq > /dev/null
echo "===== 卸载完成已移除K8s组件、nerdctl及相关配置保留containerd ====="
}
# 主逻辑:参数解析与流程控制
main() {
local install=0
local uninstall=0
local k8s_version=""
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
--install)
install=1
shift
;;
--uninstall)
uninstall=1
shift
;;
--version)
if [[ -z "$2" ]]; then
echo "错误:--version需要指定版本如1.30.5"
usage
fi
k8s_version="$2"
shift 2
;;
--help)
usage
;;
--script-version)
echo "脚本版本:$SCRIPT_VERSION"
exit 0
;;
*)
echo "错误:未知参数 '$1'"
usage
;;
esac
done
# 检查参数冲突
if [[ $install -eq 1 && $uninstall -eq 1 ]]; then
echo "错误:不能同时指定--install和--uninstall"
usage
fi
if [[ $install -eq 0 && $uninstall -eq 0 ]]; then
echo "错误:必须指定--install或--uninstall"
usage
fi
# 检查root权限
check_root
# 处理安装逻辑
if [[ $install -eq 1 ]]; then
# 未指定版本则使用默认
if [[ -z "$k8s_version" ]]; then
k8s_version="$DEFAULT_K8S_VERSION"
echo "未指定版本将安装默认K8s版本$k8s_version"
fi
# 校验版本格式
validate_version "$k8s_version"
# 执行安装
install_k8s "$k8s_version"
fi
# 处理卸载逻辑
if [[ $uninstall -eq 1 ]]; then
# 二次确认(防止误操作)
read -p "确认卸载Kubernetes、nerdctl及相关配置保留containerd[y/N] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "取消卸载"
exit 0
fi
# 执行卸载
uninstall_k8s
fi
}
# 启动主逻辑
main "$@"