2、环境基石:Kubernetes 集群搭建与 Kubeflow 安装部署(含多节点与单节点方案)
说实话,Kubeflow 的学习曲线里,最陡峭的部分往往不是 Kubeflow 本身,而是它脚下的 Kubernetes 集群。我见过太多同学在安装环节卡住,然后怀疑人生。其实别慌,Kubernetes 说白了就是一个「大管家」,负责调度你的容器。而 Kubeflow 就是在这个管家之上,专门为机器学习工作流定制的一套「高级家具」。
这一章,我们就来亲手把这个「管家」请进门,再把「家具」摆好。我会给出两种方案:单节点(适合学习、开发) 和 多节点(适合生产、团队协作)。你根据自己的情况选一个就行。
核心逻辑图:从裸机到 Kubeflow 的完整链路
2.1 环境准备:先把地基打牢
不管你是用单节点还是多节点,有几样东西是必须提前装好的。我个人习惯用 Ubuntu 20.04/22.04 LTS,因为社区支持最好,踩坑最少。
- Docker:容器运行时。Kubernetes 从 1.24 版本开始默认用 containerd,但 Docker 作为上层工具依然好用。
- kubeadm / kubelet / kubectl:Kubernetes 的三件套。kubeadm 负责初始化集群,kubelet 是每个节点上的代理,kubectl 是你和集群对话的命令行工具。
- 硬件要求:单节点至少 2 核 CPU、4GB 内存、20GB 磁盘。多节点的话,Master 节点建议 4 核 8GB,Worker 节点根据你的训练任务来定。
我的小经验: 如果你是在本地 Mac 或 Windows 上学习,直接用 Docker Desktop 自带的 Kubernetes 功能也行,但功能受限。我建议还是用虚拟机或者云服务器,体验更完整。
2.2 方案一:单节点集群搭建(适合个人学习)
单节点方案,说白了就是「一台机器既当爹又当妈」。我推荐用 k3s 或者 minikube。k3s 更轻量,minikube 功能更全。这里我以 k3s 为例,因为它安装起来真的快。
# 安装 k3s(一行命令搞定)
curl -sfL https://get.k3s.io | sh -
# 查看节点状态
sudo kubectl get nodes
# 如果看到 Ready,说明集群已经跑起来了
# 复制 kubeconfig 到默认位置(方便 kubectl 直接使用)
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
export KUBECONFIG=~/.kube/config
嗯,这里要注意:k3s 默认用 containerd 作为运行时,而不是 Docker。如果你习惯用 Docker 命令,可以额外安装 Docker,但 k3s 本身不依赖它。
我曾经踩过的坑: 安装完 k3s 后,直接运行 kubectl get pods -n kube-system 发现 coredns 一直 Pending。后来查了日志,发现是节点有污点(taint),需要手动去除。命令是 sudo kubectl taint nodes --all node-role.kubernetes.io/master-。如果你也遇到类似情况,可以试试。
2.3 方案二:多节点集群搭建(适合团队或生产)
多节点方案,我建议用 kubeadm。它虽然步骤多一点,但胜在可控性强。你想想看,生产环境里你肯定不希望一键脚本帮你做所有决定。
大致流程是这样的:
- 所有节点:安装 Docker、kubeadm、kubelet、kubectl,并关闭 swap(Kubernetes 要求)。
- Master 节点:执行
kubeadm init,初始化控制平面。 - Worker 节点:执行
kubeadm join,加入集群。 - 安装网络插件:比如 Calico 或 Flannel,否则 Pod 之间无法通信。
# 在 Master 节点上初始化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 初始化完成后,会输出一段 join 命令,复制下来备用
# 比如:kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
# 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装 Flannel 网络插件
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 在 Worker 节点上执行 join 命令(上面复制的那段)
sudo kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
验证集群: 在 Master 节点上运行 kubectl get nodes,如果所有节点都是 Ready 状态,恭喜你,集群搭建成功了。
2.4 安装 Kubeflow:终于轮到主角登场
Kubeflow 的安装方式有好几种,我推荐用 Kubeflow Manifests 方式,因为它最透明,也最容易定制。不过要注意,Kubeflow 对 Kubernetes 版本有要求,建议用 1.25 或 1.26 版本。
# 下载 Kubeflow Manifests(以 v1.7.0 为例)
git clone https://github.com/kubeflow/manifests.git
cd manifests
# 安装 Kubeflow(这一步会安装所有核心组件)
while ! kustomize build example | kubectl apply -f -; do
echo "Retrying to apply resources..."
sleep 10
done
# 查看所有 Pod 是否都 Running
kubectl get pods -n kubeflow
# 暴露 Kubeflow 中央 Dashboard(默认是 ClusterIP,改成 NodePort 方便访问)
kubectl patch svc istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
# 获取访问端口
kubectl get svc istio-ingressgateway -n istio-system
安装过程可能会比较慢,因为要拉取很多镜像。我记得有一次在阿里云上安装,等了将近 20 分钟。别急,你可以用 kubectl get pods -n kubeflow -w 实时监控进度。
一个小技巧: 如果你在国内网络环境下安装,建议提前配置 Docker 镜像加速器,或者把 gcr.io 的镜像同步到阿里云镜像仓库。否则你会体验到什么叫「等待的煎熬」。
2.5 验证安装:看看 Kubeflow 能不能用
安装完成后,打开浏览器,输入 http://<你的节点IP>:<NodePort端口>,你应该能看到 Kubeflow 的登录页面。默认用户名和密码是 user@example.com / 12341234。
登录后,你可以做几件事来验证:
- 点击左侧的 Notebooks,创建一个 Jupyter Notebook 实例。
- 点击 Pipelines,看看有没有示例流水线可以运行。
- 点击 Katib,尝试提交一个简单的超参数调优任务。
如果这些都能正常工作,说明你的 Kubeflow 环境已经就绪了。说实话,走到这一步,你已经超越了 80% 的初学者。
我曾经遇到的问题: 安装完成后,Dashboard 一直报 503 错误。后来发现是 Istio 的 Ingress Gateway 没有正确绑定端口。解决办法是重新 patch 一下 Service,或者直接改成 LoadBalancer 类型(如果你在云上)。
2.6 本章小结
这一章我们走完了从零搭建 Kubernetes 集群到安装 Kubeflow 的全过程。单节点方案适合你快速上手、跑通流程;多节点方案则更贴近真实的生产环境。我个人建议:如果你是初学者,先用单节点方案把 Kubeflow 玩熟,再考虑扩展到多节点。
环境搭好了,下一章我们就可以真正开始用 Kubeflow 做点事情了。嗯,到时候见。