手把手教程: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/fstab

1.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 --system

1.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 kubectl

1.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/kubeadm

1.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.yaml

2.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/config

2.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 -A

  2. 查看集群节点状态,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 集群

  1. Ansible 通过 playbook 脚本统一推送所有节点环境配置(关闭 swap、sysctl 网桥参数、安装 kube 工具、cri-docker);
  2. 自动分发 kubeadm 初始化模板,一键执行 Master 初始化;
  3. 自动生成 join 命令,批量让所有 Worker 节点接入集群;
  4. 自动部署 Calico、监控、存储类插件,统一标准化集群环境;
  5. 支持集群扩容、版本升级、清理环境等一键操作。

本文仅讲解手动 kubeadm 部署流程,下一篇 CSDN 博客将完整分享 Ansible 自动化一键搭建 K8s 集群完整 Playbook 脚本,实现三行命令完成整套集群部署,敬请关注。

结尾

本篇覆盖 kubeadm 搭建集群全流程踩坑点,国内阿里云镜像完美解决谷歌镜像无法访问问题,cri-docker 适配新版 K8s 兼容 Docker,Calico 网络插件保证 Pod 跨节点通信。动手操作一遍可以彻底吃透 K8s 集群启动前置条件与核心组件运行逻辑。