手把手教程:Ubuntu 使用 kubeadm 从零搭建 Kubernetes v1.33 集群(含 Calico 网络、cri-docker)
前言
Kubernetes(简称 K8s)是当下主流容器编排开源平台,自动完成容器应用部署、扩缩容、运维管理。对于初学者、CKA 备考人员,使用kubeadm手动搭建集群是吃透 K8s 底层组件、网络前置条件、集群初始化流程的最佳方式。
本文基于 Ubuntu 系统,完整覆盖主机环境初始化、容器运行时 cri-docker 部署、kubeadm 工具安装、Master 控制平面初始化、Worker 节点加入、Calico 网络插件部署、集群状态校验全流程,所有命令均可直接复制执行,采用阿里云镜像加速解决国内拉取镜像慢问题。
环境说明: 系统:Ubuntu 22.04 K8s 版本:v1.33.0 容器运行时:cri-docker 网络插件:Calico 集群规划:1 台 Master 节点 cka-master (192.168.30.130),2 台 Worker 节点 cka-worker1、cka-worker2
一、所有节点统一前置环境配置(Master、Worker 全部执行)
1.1 永久关闭 swap 交换分区
K8s 强制要求关闭 swap,swap 会影响调度与内存管控性能,两条命令分别实现临时关闭、永久注释配置:
# 临时关闭swap swapoff -a # 永久注释fstab内swap配置,重启不失效 sed -i 's/.*swap.*/#&/' /etc/fstab1.2 开启网桥 iptables 转发(K8s 网络必备)
开启br_netfilter内核模块,开启 ip 转发、网桥流量 iptables/ip6tables 转发,否则 Pod 跨节点通信异常:
# 加载网桥过滤模块并写入开机自启 # 写入/etc/modules-load.d/实现永久开机自启 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF # 临时加载,重启失效 modprobe br_netfilter # 写入sysctl网络参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF # 生效配置 sudo sysctl --system1.3 安装 kubeadm、kubelet、kubectl 工具集
采用阿里云 K8s 国内镜像源,锁定 v1.33.0 版本,避免自动更新导致集群版本错乱:
# 安装依赖 apt-get update && apt-get install -y apt-transport-https curl # 写入阿里云k8s源 cat > /etc/apt/sources.list.d/k8s.list <<EOF deb https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb / EOF # 导入阿里云密钥 curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/deb/Release.key | apt-key add - # 更新源并指定版本安装工具 apt-get update apt-get install -y kubelet=1.33.0-1.1 kubeadm=1.33.0-1.1 kubectl=1.33.0-1.1 # 锁定版本,防止apt自动升级 apt-mark hold kubelet kubeadm kubectl1.4 配置 kubectl、kubeadm 命令自动补全
日常操作 kubectl 频繁,开启 bash 自动补全大幅提升效率:
# 生成补全文件 kubectl completion bash > /etc/bash_completion.d/kubectl kubeadm completion bash > /etc/bash_completion.d/kubeadm # 生效补全 source /etc/bash_completion.d/kubectl source /etc/bash_completion.d/kubeadm1.5 部署 cri-docker 容器运行时
新版 K8s 弃用 dockershim,必须使用 cri-docker 适配 Docker 作为 CRI 运行时:
# 指定cri端点为docker sock crictl config runtime-endpoint unix:///run/cri-dockerd.sock # 验证镜像拉取功能 crictl images二、仅 Master 节点执行:初始化控制平面
2.1 生成并修改 kubeadm 初始化配置模板
通过 yaml 自定义集群广告地址、主机名、阿里云镜像仓库、CRI 套接字,规避国外镜像拉取失败问题:
# 导出默认初始化配置 kubeadm config print init-defaults > kubeadm.yaml # 修改广告地址为本机MasterIP sed -i 's/.*advert.*/ advertiseAddress: 192.168.30.130/g' kubeadm.yaml # 修改集群名称 sed -i 's/.*name.*/ name: cka-master/g' kubeadm.yaml # 替换镜像仓库为阿里云容器镜像 sed -i 's/imageRepo.*/imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers/g' kubeadm.yaml # 指定cri-docker套接字路径 sed -i 's/criSocket.*/criSocket: unix:\/\/\/run\/cri-dockerd.sock/' kubeadm.yaml # 加载网桥模块,执行集群初始化 modprobe br_netfilter kubeadm init --config kubeadm.yaml2.2 保存 Worker 节点加入命令
初始化完成后控制台会输出 join 命令,示例如下(务必保存,Worker 节点加入集群使用):
kubeadm join 192.168.30.130:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:01f63cdf01927c5aee9c7488f62b9778f1758032dc12d48b72aa2a9a950f2aaa若 token 过期,Master 节点执行
kubeadm token create --print-join-command重新生成
2.3 普通用户 kubectl 权限授权
默认仅 root 能操作集群,复制管理员证书至普通用户家目录,免 sudo 执行 kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config2.4 部署 Calico 网络插件
K8s 集群初始化完成后节点状态为 NotReady,必须部署网络插件实现 Pod 互通:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml三、Worker 节点操作:加入集群
3.1 Worker 前置操作
所有 Worker 节点先完整执行第一章节全部环境初始化命令:关闭 swap、网桥转发、安装 kube 工具、部署 cri-docker。
3.2 执行 join 命令接入集群
复制 Master 初始化输出的 join 指令,追加 cri 套接字参数:
kubeadm join 192.168.30.130:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:01f63cdf01927c5aee9c7488f62b9778f1758032dc12d48b72aa2a9a950f2aaa \ --cri-socket=unix:///var/run/cri-dockerd.sock四、Master 节点校验集群、标记 Worker 角色
4.1 给 Worker 节点打角色标签
区分节点角色,便于运维识别:
kubectl label nodes cka-worker1 cka-worker2 node-role.kubernetes.io/worker=4.2 完整集群状态检查
1. 查看集群全部系统 Pod,全部 Running 代表组件正常
kubectl pod -A2. 查看集群节点状态,STATUS 为 Ready 即部署完成
kubectl get nodes正常输出示例:
NAME STATUS ROLES AGE VERSION cka-master Ready control-plane 7m47s v1.33.0 cka-worker1 Ready worker 3m27s v1.33.0 cka-worker2 Ready worker 3m5s v1.33.0五、手动 kubeadm 搭建总结与企业落地方案说明
手动搭建优缺点
优点:完整熟悉集群初始化、前置依赖、CRI、网络插件底层逻辑,适合学习、CKA 考证、测试环境。 缺点:多节点重复执行大量命令,手动操作易出错,节点扩容、环境标准化效率极低,完全不适合生产批量部署。
企业真实落地标准方案
在生产环境、大规模 K8s 集群建设中,几乎没有运维人员手动逐台执行 kubeadm 命令搭建集群。企业统一使用Ansible 自动化批量部署 K8s 集群:
- Ansible 通过 playbook 脚本统一推送所有节点环境配置(关闭 swap、sysctl 网桥参数、安装 kube 工具、cri-docker);
- 自动分发 kubeadm 初始化模板,一键执行 Master 初始化;
- 自动生成 join 命令,批量让所有 Worker 节点接入集群;
- 自动部署 Calico、监控、存储类插件,统一标准化集群环境;
- 支持集群扩容、版本升级、清理环境等一键操作。
本文仅讲解手动 kubeadm 部署流程,下一篇 CSDN 博客将完整分享 Ansible 自动化一键搭建 K8s 集群完整 Playbook 脚本,实现三行命令完成整套集群部署,敬请关注。
结尾
本篇覆盖 kubeadm 搭建集群全流程踩坑点,国内阿里云镜像完美解决谷歌镜像无法访问问题,cri-docker 适配新版 K8s 兼容 Docker,Calico 网络插件保证 Pod 跨节点通信。动手操作一遍可以彻底吃透 K8s 集群启动前置条件与核心组件运行逻辑。
