一、重置kubeadm init
bash
sudo kubeadm reset --force
# 删除 Calico 相关资源
sudo rm -rf /etc/cni/net.d/calico-*
sudo rm -rf /var/lib/calico/
# 删除其他 CNI 插件(如 Flannel)
sudo rm -rf /etc/cni/net.d/*
二、加入集群出问题,可以用一下命令还原
bash
# 首先执行kubeadm重置
sudo kubeadm reset -f
# 删除残留文件
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kubelet/
sudo rm -rf /var/lib/etcd/
sudo rm -rf $HOME/.kube
三、提供一个一键部署k8s-1.33版本的脚本
里面的calico可能安装不上,在下面的脚本执行完后单独执行以下命令:
bash
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
sudo kubectl apply -f calico.yaml
bash
#!/bin/bash
# ==============================================================================
# CentOS 自动化部署 Kubernetes v1.33 集群脚本
# 适用于单 master 多 node 架构,需在 root 权限下执行
# ==============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
# 检查是否为 root 用户
if [ "$(id -u)" -ne 0 ]; then
log_error "请使用 root 权限执行此脚本"
fi
# 检查系统版本
OS_VERSION=$(cat /etc/redhat-release | awk '{print $7}' | cut -d. -f1)
if [ "$OS_VERSION" -ne 7 ] && [ "$OS_VERSION" -ne 8 ]; then
log_warn "当前系统版本为 CentOS $OS_VERSION,建议使用 CentOS 7 或 8"
fi
# 从IP地址生成默认的主机名后缀
generate_hostname_suffix() {
local IP=$1
# 提取IP地址的最后一段
local SUFFIX=$(echo $IP | cut -d. -f4)
echo $SUFFIX
}
# 1. 设置主机名称
set_hostname() {
log_info "设置主机名称..."
local NODE_TYPE=$1
local IP_ADDR=$2
local CUSTOM_NAME=$3
# 如果提供了自定义名称,则使用自定义名称
if [ ! -z "$CUSTOM_NAME" ]; then
hostnamectl set-hostname "$CUSTOM_NAME"
log_info "主机名已设置为 $CUSTOM_NAME"
else
# 生成默认的主机名后缀
local HOSTNAME_SUFFIX=$(generate_hostname_suffix $IP_ADDR)
if [ "$NODE_TYPE" == "master" ]; then
hostnamectl set-hostname "mast$HOSTNAME_SUFFIX"
log_info "主机名已设置为 mast$HOSTNAME_SUFFIX"
elif [ "$NODE_TYPE" == "node" ]; then
hostnamectl set-hostname "node$HOSTNAME_SUFFIX"
log_info "主机名已设置为 node$HOSTNAME_SUFFIX"
else
log_error "节点类型参数错误,应为 'master' 或 'node'"
fi
fi
# 添加主机名解析
echo "$IP_ADDR $(hostname)" >> /etc/hosts
log_info "已更新 /etc/hosts 文件"
}
# 2. 环境设置
setup_environment() {
log_info "开始环境设置..."
# 关闭防火墙
log_info "关闭防火墙..."
systemctl stop firewalld
systemctl disable firewalld
log_info "防火墙已关闭"
# 关闭 SELinux
log_info "关闭 SELinux..."
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
log_info "SELinux 已关闭"
# 关闭 swap
log_info "关闭 swap..."
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
log_info "swap 已关闭"
# 加载内核模块
log_info "加载内核模块..."
modprobe br_netfilter
modprobe overlay
echo "overlay" >> /etc/modules-load.d/overlay.conf
echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
log_info "内核模块已加载"
# 优化内核参数
log_info "优化内核参数..."
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system
log_info "内核参数已优化"
}
# 3. 安装容器运行时 (containerd)
install_container_runtime() {
log_info "安装容器运行时..."
# 安装依赖包
log_info "安装依赖包..."
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置 Docker 仓库
log_info "配置 Docker 仓库..."
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 containerd
log_info "安装 containerd..."
yum install -y containerd.io
# 配置 containerd
log_info "配置 containerd..."
containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's@sandbox_image = "k8s.gcr.io/pause.*"@sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10"@g' /etc/containerd/config.toml
# 启动 containerd
log_info "启动 containerd..."
systemctl enable --now containerd
log_info "容器运行时安装完成"
}
# 4. 安装 Kubernetes 组件
install_kubernetes_components() {
log_info "安装 Kubernetes 组件..."
# 配置 Kubernetes 仓库
log_info "配置 Kubernetes 仓库..."
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF
# 清理并重建缓存
log_info "清理并重建 yum 缓存..."
yum clean all
yum makecache
# 安装指定版本的 kubelet、kubeadm、kubectl
log_info "安装 kubelet、kubeadm、kubectl..."
yum install -y kubelet-1.33.1 kubeadm-1.33.1 kubectl-1.33.1
# 启动 kubelet
log_info "启动 kubelet..."
systemctl enable --now kubelet
log_info "Kubernetes 组件安装完成"
}
# 5. 初始化 master 节点
init_master_node() {
log_info "初始化 master 节点..."
local IP_ADDR=$1
# 执行 kubeadm init
log_info "执行 kubeadm init 命令..."
kubeadm init \
--apiserver-advertise-address=$IP_ADDR \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.33.1 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/containerd/containerd.sock
if [ $? -ne 0 ]; then
log_error "kubeadm init 失败,请检查日志"
fi
log_info "master 节点初始化成功"
# 配置 kubectl
log_info "配置 kubectl..."
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 设置 kubectl 别名
echo "alias k='kubectl'" >> ~/.bashrc
source ~/.bashrc
log_info "kubectl 配置完成"
}
# 6. 安装网络插件 (Calico)
install_calico() {
log_info "安装 Calico 网络插件..."
# 下载 Calico 配置文件
log_info "下载 Calico 配置文件..."
if ! command -v wget &> /dev/null; then
yum install -y wget
fi
# 由于国内网络问题,使用国内镜像
log_info "下载 Calico 镜像..."
if ! command -v ctr &> /dev/null; then
yum install -y cri-tools
fi
# 这里使用预先下载的镜像,实际使用时请确保镜像已下载
log_warn "请确保已下载 calico.tar.gz 镜像文件"
ctr -n=k8s.io images import calico.tar.gz
# 应用 Calico 配置
log_info "应用 Calico 配置..."
if [ -f "calico.yaml" ]; then
kubectl apply -f calico.yaml
else
log_warn "未找到 calico.yaml,请到官网下载最新版本"
log_warn "下载地址: https://docs.projectcalico.org/manifests/calico.yaml"
fi
log_info "Calico 安装完成"
# 等待网络插件就绪
log_info "等待网络插件就绪..."
sleep 30
}
# 7. 加入 node 节点
join_node_to_cluster() {
log_info "将节点加入集群..."
local MASTER_IP=$1
local TOKEN=$2
local CERT_HASH=$3
# 执行 join 命令
log_info "执行 kubeadm join 命令..."
kubeadm join $MASTER_IP:6443 \
--token $TOKEN \
--discovery-token-ca-cert-hash sha256:$CERT_HASH
if [ $? -ne 0 ]; then
log_error "节点加入集群失败,请检查日志"
fi
log_info "节点已成功加入集群"
}
# 8. 验证集群状态
verify_cluster() {
log_info "验证集群状态..."
# 等待节点就绪
log_info "等待节点就绪..."
sleep 60
# 查看节点状态
log_info "集群节点状态:"
kubectl get nodes
# 查看 pod 状态
log_info "系统 Pod 状态:"
kubectl get pods -A
log_info "集群验证完成,Kubernetes 集群已成功部署"
}
# 主函数
main() {
log_info "开始 Kubernetes v1.33 集群部署..."
local NODE_TYPE=$1
local IP_ADDR=$2
local CUSTOM_NAME=$3
local MASTER_IP=$4
local TOKEN=$5
local CERT_HASH=$6
# 根据节点类型执行不同操作
if [ "$NODE_TYPE" == "master" ]; then
log_info "部署 master 节点..."
set_hostname "master" "$IP_ADDR" "$CUSTOM_NAME"
setup_environment
install_container_runtime
install_kubernetes_components
init_master_node "$IP_ADDR"
install_calico
verify_cluster
# 输出 node 节点加入命令
log_info "以下是 node 节点加入集群的命令:"
kubeadm token create --print-join-command
elif [ "$NODE_TYPE" == "node" ]; then
log_info "部署 node 节点..."
if [ -z "$MASTER_IP" ] || [ -z "$TOKEN" ] || [ -z "$CERT_HASH" ]; then
log_error "node 节点部署需要提供 master IP、token 和证书哈希"
fi
set_hostname "node" "$IP_ADDR" "$CUSTOM_NAME"
setup_environment
install_container_runtime
install_kubernetes_components
join_node_to_cluster "$MASTER_IP" "$TOKEN" "$CERT_HASH"
verify_cluster
else
log_error "节点类型参数错误,应为 'master' 或 'node'"
fi
log_info "Kubernetes v1.33 集群部署完成!"
}
# 检查参数
if [ $# -lt 2 ]; then
echo "用法: $0 [master|node] [IP地址] [自定义名称] [master_IP] [token] [cert_hash]"
echo " master 模式: $0 master [本机IP] [自定义名称]"
echo " node 模式: $0 node [本机IP] [自定义名称] [master_IP] [token] [cert_hash]"
exit 1
fi
# 执行主函数
main $@
使用chmod +x k8s.sh赋予执行权限
具体用法:IP和各种配置按照自己的环境来!!!
部署 master 节点并指定名称
bash
# 使用自定义名称部署 master 节点
./k8s_deploy.sh master 192.168.74.180 k8s-master
部署 node 节点并指定名称
bash
# 使用自定义名称部署 node 节点
./k8s_deploy.sh node 192.168.74.181 k8s-node-01 192.168.74.180 1fik86.bmm71kteysd8g7up 98a92989b7377d06135786b1ca2
master节点执行完后会打印日志信息,里面有加入集群需要的token和hash值:
bash
[INFO] 集群验证完成,Kubernetes 集群已成功部署
[INFO] 以下是 node 节点加入集群的命令:
kubeadm join 10.1.2.22:6443 --token d96479.0bdqfa3vrplyt9gq --discovery-token-ca-cert-hash sha256:8600c99694c2decf84cd9030ac9f7861c6a53dd40d0b9d8e13bb031c438cd8d7
[INFO] Kubernetes v1.33 集群部署完成!