大模型(LLM)基础Kubernetes环境 构建

一、背景

大语言模型(LLMs)如DeepSeek R1,Qwen2.5,Chat-GPT和 Gemini 2.5 Pro,Claude等,正以前所未有的速度渗透到各行各业,展现出惊人的能力和潜力。然而,这股浪潮之下,是巨大的技术挑战:LLM 的训练动辄需要数周甚至数月,消耗海量的 GPU/TPU 资源;模型的推理服务则要求低延迟、高并发和极致的弹性。如何高效、可靠、可扩展地管理这整个复杂流程?云原生 Kubenretes 相关技术正在应对这些挑战。

二、Kubernetes 与 LLM

2.1 云原生与大模型的天然契合

Kubernetes 已成为容器编排领域的事实标准。它提供的不仅仅是容器运行环境,更是一套构建、部署和管理可扩展、高弹性应用的范式——这正是云原生理念的核心。而大模型的需求,恰好与 Kubernetes 的核心优势高度匹配:

资源抽象与异构管理:

        LLM 依赖 GPU/TPU 等昂贵加速器。K8s 通过 Device Plugins 等机制,能将这些异构硬件资源纳入统一的资源池进行调度和管理,提高利用率。

极致的弹性伸缩:

         训练: 分布式训练任务需要动态增减节点;K8s 可按需调度计算资源。

         推理: 推理服务的负载波动极大,K8s 的 HPA (Horizontal Pod Autoscaler) 能根据实时负载(CPU/GPU 利用率、QPS 等)自动调整服务实例数量,从容应对峰值,并在低谷时节省成本。

高可用与自愈能力:

        LLM 训练是长时间任务,推理服务要求 7x24 可用。K8s 能自动检测并替换失败的 Pod/节点,保证任务的连续性和服务的稳定性(需配合训练框架的 checkpointing)。

环境一致性与可移植性:

        容器化(Docker/OCI)封装了所有依赖,确保了从开发、测试到训练、推理环境的一致性。K8s 则让这套环境可以轻松部署在任何主流云厂商或本地数据中心。

自动化与声明式配置:

        通过 YAML 文件定义资源需求、部署策略和服务依赖,K8s 自动化地完成部署和管理,极大降低运维复杂度,并为 GitOps 实践奠定基础。

服务发现与负载均衡:

        内建的服务机制简化了模型服务、数据处理服务等内部组件的通信和流量管理。

简而言之,Kubernetes 将管理大规模分布式系统的复杂性进行了抽象和自动化,使得 AI 团队能更专注于模型本身,而非底层基础设施的繁琐细节。云原生提供的弹性、敏捷和自动化能力,让 LLM 研发流程更加便捷 高效。

2.2 大模型研发流程中的Kubernetes

从数据准备到最终的模型服务,Kubernetes 在 LLM 工作流的每个阶段都扮演着关键角色:

1) 数据准备与处理:

  利用 K8s JobCronJob 运行数据清洗、标注、特征工程等批处理任务。

  结合 Kubeflow Pipelines、Argo Workflows 等工作流引擎,编排复杂的数据处理流程。

  通过 K8s 部署 Spark、Dask 等分布式计算框架,加速海量数据处理。

  Persistent Volumes (PV) 和 Persistent Volume Claims (PVC) 提供了对数据集的持久化存储管理。

2) 模型训练 (尤其是分布式训练):

  GPU 调度: NVIDIA Device Plugin 等让 K8s Pod 能请求并使用 GPU 资源。

  简化分布式任务:

    Kubeflow Training Operators (TFJob, PyTorchJob, MPIJob 等): 这些 CRD (Custom Resource Definitions) 极大地简化了在 K8s 上部署 TensorFlow、PyTorch、Horovod、DeepSpeed 等分布式训练任务的复杂度。开发者只需定义角色(如 worker, parameter server)、副本数和资源需求,Operator 会自动创建、管理对应的 Pod 和服务,处理 Pod 间通信设置。

    Ray on K8s (KubeRay): Ray 是一个强大的分布式计算框架,KubeRay 项目使其能无缝运行在 K8s 上,为复杂的训练模式(如混合并行)和超参数优化提供了便利。

  资源管理: K8s 的 Namespace、Resource Quotas 和 Priority Classes 可用于隔离团队资源、限制消耗,并确保关键训练任务的优先级。

3) 模型微调与评估:

  与训练类似,K8s 能快速启动和管理多个并行的微调实验,每个实验环境隔离。

  使用 K8s Job 运行模型评估脚本,产出性能指标。

  结合 MLOps 平台(如 MLflow,通常也部署在 K8s 上)追踪实验参数、指标和产出的模型文件。

4) 模型服务与推理:

  基础部署: 使用 K8s Deployment 管理推理服务的 Pod 副本,通过 ServiceIngress 暴露 API 并进行负载均衡。

  自动伸缩: HPA 是实现弹性推理的关键,能根据实时指标动态调整服务实例数。

  高级模型服务框架 (构建于 K8s 之上):

    KServe (原 KFServing): 领先的开源模型推理平台,提供标准化的 V2 推理协议、Serverless 推理(可缩容至零)、Canary 部署、特征转换、模型可解释性集成等。支持 TensorFlow, PyTorch, ONNX, TensorRT 等多种框架。

    Seldon Core: 另一个强大的 MLOps 平台,侧重于复杂的部署策略(如 A/B 测试、多臂老虎机)、推理图(Inference Graphs)和高级监控。

    BentoML / Ray Serve: 提供更友好的模型打包和部署体验,并能部署到 K8s 以利用其编排能力。

    NVIDIA Triton Inference Server: 高性能推理服务器,支持模型集成和多种后端优化,可以作为 Pod 高效运行在 K8s 上。

2.3 主流框架与技术栈生态

在 Kubernetes 上构建 LLM 应用,通常会用到以下技术栈组合:

  • 核心平台: Kubernetes (EKS, GKE, AKS, OpenShift, Rancher, 或自建)

  • MLOps/AI 平台 (on K8s): Kubeflow, Ray/KubeRay, Flyte

  • 分布式训练 (Operators/Integrations): Kubeflow Training Operators (TFJob, PyTorchJob, MPIJob), KubeRay

  • 模型服务 (on K8s): KServe, Seldon Core, BentoML, Ray Serve, NVIDIA Triton

  • 工作流编排: Kubeflow Pipelines, Argo Workflows, Airflow (on K8s Executor)

  • 硬件加速: NVIDIA Device Plugin (及其他厂商插件)

  • 监控与日志: Prometheus, Grafana, ELK/Loki Stack

这个生态仍在快速发展,但核心是利用 K8s 作为统一的资源管理和应用编排层。

三、实战Kubernetes 基础环境搭建

3.1 服务器资源准备

测试用两台 ECS 带 A10 显卡即可,极限一点一台也成,两台主要是为了验证多节点情况。

请参考:

qwen2.5 7B 极简微调训练_qwen2.5 trainer微调demo-CSDN博客文章浏览阅读243次,点赞3次,收藏6次。实现 qwen 2.5 7b 模型微调实验,并打包好模型最后发布到 huggingface_qwen2.5 trainer微调demo https://blog.csdn.net/weixin_39403185/article/details/147115232?spm=1001.2014.3001.5501

3.2 基础配置

1) Ubuntu 系统环境配置

# 更新系统并安装基础工具
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

sudo hostnamectl set-hostname --static "te1" 
ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d/ -f1 | head -n 1
echo $ip "te1" >> /etc/hosts

#########################################
sudo apt-get update
sudo apt-get install -y curl gpg

# 禁用交换分区(Kubernetes 要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab  # 永久禁用

# 配置内核参数,允许iptables检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_tables
iptable_nat
nf_nat
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
sudo modprobe ip_tables
sudo modprobe iptable_nat
sudo modprobe nf_nat

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

sudo sysctl --system

2) 容器环境配置(containerd)

### 安装容器运行时(Containerd) 安装依赖项
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加 containerd 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 containerd 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 containerd
sudo apt-get update
#sudo apt-get install -y docker-ce docker-ce-cli containerd.io

sudo apt-get install -y docker-ce-cli containerd.io

### 配置 Containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl enable containerd
sudo systemctl restart containerd

# 添加 NVIDIA 仓库
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd

# 验证 GPU 支持
# docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

配置检查项(确保的容器runtime 运行在 nvidia):

cat /etc/containerd/config.toml | grep default_runtime_name
cat /etc/containerd/config.toml | grep -A 1 'containerd.runtimes.nvidia.options'

docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

3) Kubernetes基础环境配置

sudo mkdir -p /etc/apt/keyrings
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/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.31/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
sudo systemctl enable --now kubelet

3.3 Kubernetes 部署(单机版)

1) 基础组件安装

## 如果网络不同可以换成阿里云的镜像地址
sudo kubeadm init --kubernetes-version=1.31.7 \
--pod-network-cidr=10.244.64.0/20

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

## 由于是测试,要放开主节点也要允许调度
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

3.4 Calico 网络CNI 插件安装

# # 安装 Calico 网络插件
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

cat <<EOF | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  calicoNetwork:
    ipPools:
    - blockSize: 26
      cidr: 10.244.64.0/20
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
---
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}
EOF

3.5 nvidia-device-plugin 插件安装

1) containerd 默认配置 runtime : nvidia

直接安装就行了

kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.17.1/deployments/static/nvidia-device-plugin.yml

2) containerd 未配置默认runtime : nvidia

可以在k8s里面配置,安装RuntimeClass:

这一步很关键 安装k8s 插件无法识别 GPU 资源

cat <<EOF | kubectl apply -f -
apiVersion: node.k8s.io/v1
handler: nvidia
kind: RuntimeClass
metadata:
  name: nvidia
EOF

识别不到资源是这样的

日志显示 无论如何也识别不到 GPU 资源

修改runtimeClassName: "nvidia"

正确识别到资源的情况是这样的:

kubectl logs -f -n kube-system nvidia-device-plugin-daemonset-qxndp

能识别到资源独占单卡模式 1 张GPU 显卡

3.6 添加 worker 节点

## 在不同的节点执行
kubeadm join 172.18.81.122:6443 --token 2601mp.73ib79v3o9bmdui2\
--discovery-token-ca-cert-hash sha256:7abcad5ce1957cd1aa75ed97b2e46ad1028c6cc3d5bbfdf828a46ea843751b73 \
--node-name te2

## 在不同的节点执行
kubeadm join 172.18.81.122:6443 --token 2601mp.73ib79v3o9bmdui2\
--discovery-token-ca-cert-hash sha256:7abcad5ce1957cd1aa75ed97b2e46ad1028c6cc3d5bbfdf828a46ea843751b73 \
--node-name te3

## 在不同的节点执行
kubeadm join 172.18.81.122:6443 --token 2601mp.73ib79v3o9bmdui2\
--discovery-token-ca-cert-hash sha256:7abcad5ce1957cd1aa75ed97b2e46ad1028c6cc3d5bbfdf828a46ea843751b73 \
--node-name te4

整体 Pod 和 Node 运行情况:

3.7 Dashboard 安装


kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
    nodePort: 31000
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort
EOF

#kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
### token 密钥登录要用到
kubectl -n kubernetes-dashboard create token admin-user --duration=24h

kubectl get svc,po -n kubernetes-dashboard

采用 NodePort 方式暴露服务,需要阿里云打开 ECS 的安全组才能正常访问。

## 获取密钥
kubectl -n kubernetes-dashboard create token admin-user --duration=24h

## 获取公网IP
curl cip.cc

打开安全组31000:

四、测试 验证

4.1 Pod GPU 调度

        当前 GPU 资源采用单卡形式提供,还可以分时复用感兴趣的话可以多尝试尝试 不同的 GPU 资源调度使用策略

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: gpu-test1
spec:
  restartPolicy: Never
  containers:
    - name: cuda-container
      image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
      command: ["/bin/sh", "-c"]
      args: ["echo '----- 等待 ----'; while true; do sleep 3600; done"]
      resources:
        limits:
          nvidia.com/gpu: 1
  tolerations:
  - key: nvidia.com/gpu
    operator: Exists
    effect: NoSchedule
EOF

创建了四个 Pod 每个 Pod 需要一个单卡 GPU 资源,观察下来已经全部都调度完毕了。

五、小结

        终于回归主线了笔者是云原生方向的。本篇实验基本没难度了就,老本行了。艰难肝大模型基础架构,大体上有了一些基本的了解。后续更多的会采用云原生方式去训练,推理模型。探索更多大模型在云原生上的应用。比如: Kubeflow,MLFlow,Volcano,Rook / Ceph,argo-workflows等等吧。

参考:

Kubernetes生产级别的容器编排系统https://kubernetes.io/zh-cn/https://github.com/NVIDIA/k8s-device-pluginhttps://github.com/NVIDIA/k8s-device-pluginhttps://github.com/kubernetes/kuberneteshttps://github.com/kubernetes/kuberneteshttps://github.com/containerd/containerdhttps://github.com/containerd/containerdcontainerd – An industry-standard container runtime with an emphasis on simplicity, robustness and portabilityAn industry-standard container runtime with an emphasis on simplicity, robustness, and portabilityhttps://containerd.io/https://github.com/NVIDIA/nvidia-container-toolkithttps://github.com/NVIDIA/nvidia-container-toolkitInstalling the NVIDIA Container Toolkit — NVIDIA Container Toolkithttps://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.htmlKubeflowKubeflow makes deployment of ML Workflows on Kubernetes straightforward and automatedhttps://www.kubeflow.org/https://github.com/projectcalico/calicohttps://github.com/projectcalico/calicoUnified network security & observability for KubernetesA single platform for any Kubernetes distribution in the cloud or on premises. Eliminate tool sprawl, fragmented control, and multi-cluster limitations.https://www.tigera.io/Cloud Native Computing FoundationCNCF is the vendor-neutral hub of cloud native computing, dedicated to making cloud native ubiquitous.https://www.cncf.io/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云逸001~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值