K8s 运维系列 | 第 2 天:环境搭建——minikube 与 kubeadm 快速部署集群

在上一篇中,我们建立了对 Kubernetes 整体架构的认知:控制平面负责调度与状态协调,节点上的 kubelet 与容器运行时负责真正跑容器。但「看懂架构」和「上手操作」之间,还隔着一层最容易被新手卡住的东西——环境。很多人不是学不会 K8s,而是连一套能跑的集群都搭不起来,最后在安装报错中放弃了。

这一篇我们就来解决这个问题:用两种主流方式把 Kubernetes 环境搭起来。一种是轻量级的 minikube,适合本地学习与开发;另一种是生产向的 kubeadm,适合搭建真实的、可扩展的集群。掌握这两条路径,后续 28 天所有的实验都有落脚点。

K8s 运维 第2天

一、两种工具的核心定位

1. minikube:一键起一个单节点集群

minikube 会在本机启动一个虚拟机或容器,里面内置了一个单节点的 Kubernetes 集群。它把控制平面和节点「揉」在一起,一条命令就能把整套环境跑起来,非常适合第一次接触 K8s 的人理解概念、做实验。

它的优势是极低的入门成本,缺点是它本质上是单机模拟,无法验证多节点调度、高可用等生产特性。

2. kubeadm:生产级集群的官方引导工具

kubeadm 是 Kubernetes 官方提供的集群初始化工具,负责完成 kubeadm init(初始化控制平面)与 kubeadm join(加入工作节点)两个核心动作。它不帮你管理节点生命周期,只负责把各组件正确装配起来,因此更适合用来搭建多节点、可长期运行的真实集群。

两者的关系可以理解为:minikube 是「练车场」,kubeadm 是「正式上路」。

二、环境准备:容器运行时与系统配置

无论用哪种方式,底层都需要一个容器运行时。Kubernetes 从 1.24 起移除了对 Docker 作为默认运行时的依赖,改用 containerd 作为标准运行时。

在 Ubuntu 系统上,先关闭 swap 并加载必要的内核模块:

# 关闭 swap(Kubernetes 要求)
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

# 加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter

# 配置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system

接着安装 containerd 并生成默认配置:

sudo apt-get update
sudo apt-get install -y containerd.io
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo systemctl restart containerd
sudo systemctl enable containerd

三、方式一:minikube 快速部署

1. 安装 minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

2. 启动集群

minikube 支持多种驱动(docker、kvm2、virtualbox 等)。以最常用的 docker 驱动为例:

minikube start --driver=docker --cpus=2 --memory=4096

启动完成后,验证集群状态:

minikube status
kubectl get nodes

正常情况下会看到一个名为 minikube 的节点处于 Ready 状态,这就说明单节点集群已经就绪。

3. 常用管理命令

minikube dashboard     # 打开 Web 控制台
minikube stop          # 停止集群(保留数据)
minikube delete        # 彻底删除集群
minikube service myapp # 暴露服务

四、方式二:kubeadm 部署多节点集群

1. 安装 kubeadm、kubelet、kubectl

三件套需要同时安装并锁定版本,避免升级导致集群组件不匹配:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

2. 初始化控制平面节点

在 master 节点执行 kubeadm init,指定 pod 网络网段:

sudo kubeadm init 
  --pod-network-cidr=10.244.0.0/16 
  --kubernetes-version=v1.29.0

初始化成功后,终端会输出一串 kubeadm join 命令,务必保存下来,后续工作节点加入时要使用。

为当前用户配置 kubectl 访问权限:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. 部署 Pod 网络插件

集群需要一个 CNI 网络插件才能让 Pod 之间互通,以 Flannel 为例:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

4. 加入工作节点

在每台 worker 节点上执行初始化时保存的 join 命令(形如下面这条,token 与 IP 以实际输出为准):

sudo kubeadm join 192.168.1.100:6443 
  --token abcdef.0123456789abcdef 
  --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

回到 master 节点查看节点状态:

kubectl get nodes -o wide

当所有节点都显示 Ready 时,多节点集群即搭建完成。

五、常见问题与排查

1. 节点一直是 NotReady

多数情况是网络插件未生效,用 kubectl get pods -n kube-system 查看 CNI 组件是否 Running。若 flannel 一直 CrashLoopBackOff,检查 /etc/containerd/config.tomlSystemdCgroup 是否设为 true(与 kubelet 的 cgroup 驱动保持一致)。

2. kubeadm init 卡在等待控制平面

通常是镜像拉取失败。可以提前用下面的命令预拉取镜像,或配置国内镜像源:

sudo kubeadm config images pull

3. swap 未关闭导致 kubelet 启动失败

Kubernetes 默认禁止在开启 swap 的节点上运行,务必执行 swapoff -a 并持久化到 /etc/fstab

六、总结

这一篇我们走通了两条部署路径:minikube 一条命令起集群,适合本地快速体验;kubeadm 完整装配控制平面与工作节点,适合生产与多节点实验。环境就绪之后,下一篇我们将正式进入 Kubernetes 最核心的对象体系——Pod、Label、Selector 与命名空间,理解容器在集群中的真正「最小调度单元」。

下期预告:第 3 天《核心对象——Pod、Label、Selector 与命名空间》,我们将拆解 Pod 的本质,以及 Label 与 Selector 是如何让集群中的资源「对上暗号」的,敬请期待。

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容