随笔 - 308  文章 - 0  评论 - 5  阅读 - 4319

k8s中在指定位置部署pod

Kubernetes节点调度终极指南:精准掌控Pod的落脚点


一、为什么需要指定节点?5大典型场景

  1. 硬件依赖型服务:GPU机器学习训练、FPGA加速
  2. 本地存储优化:SSD加速数据库、NVMe磁盘队列
  3. 合规性要求:敏感数据必须留在特定区域节点
  4. 成本控制:优先使用廉价计算节点
  5. 故障隔离:关键服务分散在不同物理机

二、四大调度方法深度解析

1. 直通车模式:nodeName(适合紧急调试)
apiVersion: v1
kind: Pod
metadata:
  name: direct-pod
spec:
  nodeName: gpu-node-01 # 精确到具体节点
  containers:
  - name: tensorflow
    image: tf-gpu:2.8

特点

  • 🚨 绕过调度器直接指定
  • ⚠️ 节点故障时不会自动迁移
  • 🔧 适用场景:临时调试、单节点测试
2. 标签选择模式:nodeSelector(生产推荐)
# 为节点打标签
kubectl label nodes gpu-node-01 accelerator=nvidia-a100
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      nodeSelector:
        accelerator: nvidia-a100
      containers:
      - name: cuda-app
        image: nvidia/cuda:11.6

最佳实践

  • 标签命名规范:<领域>/<属性>storage/ssd
  • 多标签组合:gpu-vendor: nvidia + gpu-memory: 24GB
3. 智能调度模式:Affinity/Anti-Affinity(高级策略)
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: topology.kubernetes.io/zone
          operator: In
          values:
          - ap-southeast-1a
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
      preference:
        matchExpressions:
        - key: storage-class
          operator: In
          values:
          - nvme

策略组合拳

  • 必须部署在A区(硬性要求)
  • 优先选择配备NVMe磁盘的节点(软性偏好)
4. 隔离防护模式:Taint & Toleration(节点隔离)
# 给节点打污点
kubectl taint nodes spot-node-01 instance-type=spot:NoSchedule
# Pod添加容忍
tolerations:
- key: "instance-type"
  operator: "Equal"
  value: "spot"
  effect: "NoSchedule"

典型应用

  • 保护专用节点:dedicated=ml-team:NoSchedule
  • 标记廉价资源:spot-instance=true:PreferNoSchedule

三、生产环境调度策略五步法

  1. 节点分类标记
# 批量标记GPU节点
kubectl label node \
  $(kubectl get nodes -l gpu-model=tesla-t4 -o name) \
  accelerator=nvidia
  1. 部署规范制定
# 在Helm values.yaml中定义
nodeSelector:
  environment: production
  storage-class: ssd
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: [critical-app]
      topologyKey: kubernetes.io/hostname
  1. 调度策略验证
# 模拟调度测试
kubectl apply --dry-run=server -f deploy.yaml

# 查看调度事件
kubectl get events --field-selector involvedObject.name=critical-app-pod
  1. 实时监控看板
# Grafana PromQL查询
sum(kube_pod_info{node=~"$node"}) by (node)
> 结合Node Exporter监控节点负载
  1. 自动修复机制
# 使用Operator实现自动迁移
apiVersion: k8s.aliyun.com/v1
kind: NodeFailureDetector
spec:
  checkInterval: 30s
  autoEvictPod: true
  nodeSelector:
    role: critical

四、五大常见问题解决方案

问题1:Pod卡在Pending状态

# 诊断三部曲
kubectl describe pod <name> | grep Events -A 10
kubectl get nodes --show-labels | grep <label>
kubectl get nodes -o json | jq '.items[].status.conditions'

问题2:节点标签被误删

# 通过审计日志追踪
kubectl logs -n kube-system kube-apiserver-kind-control-plane | grep -B 5 'label.*deleted'

问题3:多团队标签冲突

  • 制定全局标签规范:
    team/<team-name>: exists
    env/(prod|staging|dev): exists
    hardware/(gpu|highmem): exists
    

问题4:亲和性策略失效

  • 检查权重设置是否合理
  • 验证topologyKey是否有效
  • 使用反亲和性避免Pod扎堆

问题5:污点容忍安全隐患

  • 定期扫描高权限容忍设置
    kubectl get pods -o json | jq '.items[].spec.tolerations'
    
  • 使用OPA策略禁止危险容忍

五、调度优化进阶技巧

  1. 优先级抢占配置
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: mission-critical
value: 1000000
preemptionPolicy: Always
  1. 自定义调度器集成
// 示例调度插件
func Filter(ctx context.Context, cycleState *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status {
    if nodeInfo.Node().Labels["special"] != pod.Labels["needs-special"] {
        return framework.NewStatus(framework.Unschedulable)
    }
    return nil
}
  1. 弹性资源调度
# 使用Katalyst实现混部
resources:
  requests:
    cpu: "1"
    memory: 2Gi
    kat/ebs_bandwidth: "500"

六、调度策略决策树

是否需要精确指定节点
使用nodeName
是否需要硬件特性
使用nodeSelector
是否需要复杂策略
使用Affinity
默认调度
是否需要容灾
PodAntiAffinity
完成

结语
节点调度就像下棋,既要让每个棋子(Pod)落在最佳位置,又要统筹全局保证棋局(集群)稳定。掌握这些方法,你将:

  • 🎯 精准控制工作负载位置
  • ⚡ 提升资源利用率
  • 🛡️ 增强系统容灾能力
  • 📊 实现精细化成本管理
posted on   Leo-Yide  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示