ansible-devops/scripts/k8s-base-setup.sh

349 lines
11 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"