k8s快速部署-1.33版本

一、重置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 集群部署完成!
相关推荐
阿杆3 分钟前
为什么我建议你把自建 Redis 迁移到云上进行托管
redis·后端
Java水解9 分钟前
go语言教程(全网最全,持续更新补全)
后端·go
bobz96528 分钟前
QEMU 使用 DPDK 时候在 libvirt xml 中设置 sock 的目的
后端
thinktik33 分钟前
AWS EKS 计算资源自动扩缩之按需申请Fargate[AWS 中国宁夏区]
后端·aws
thinktik1 小时前
AWS EKS 实现底层EC2计算资源的自动扩缩[AWS 中国宁夏区]
后端·aws
uhakadotcom1 小时前
什么是OpenTelemetry?
后端·面试·github
知其然亦知其所以然1 小时前
MySQL 社招必考题:如何优化特定类型的查询语句?
后端·mysql·面试
用户4099322502121 小时前
给接口加新字段又不搞崩老客户端?FastAPI的多版本API靠哪三招实现?
后端·ai编程·trae
RoyLin1 小时前
TypeScript设计模式:代理模式
前端·后端·typescript
用户6120414922132 小时前
C语言做的文本词频数量统计功能
c语言·后端·敏捷开发