一、问题背景:镜像加载与 Pod 调度的冲突

在 Kubernetes 集群中,经常会遇到这样的场景:

  • 我们提前在某个节点(如 worker-node-1)手动加载了特定镜像(如 nginx:latest
  • 但由于 Kubernetes 调度器的默认策略是「均衡分配」,新创建的 Pod 可能被随机调度到其他未加载该镜像的节点
  • 这会导致 Pod 启动时因拉取不到镜像而失败,增加不必要的网络开销和启动延迟

二、解决方案:nodeSelector 定向调度

nodeSelector 是 Kubernetes 提供的基础节点亲和性配置,通过匹配节点标签(Node Label),可以强制将 Pod 调度到指定节点。

核心工作原理:

  1. 节点打标:为目标节点添加自定义标签(如 kubernetes.io/hostname: worker-node-1
  2. Pod配置:在 Pod 配置中声明 nodeSelector,匹配目标节点标签
  3. 调度过程:调度器只会将 Pod 分配到标签匹配的节点

三、实战配置示例

以下是一个完整的 Deployment 配置示例,通过 nodeSelector 将 Pod 固定调度到 worker-node-1 节点:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment  # 部署名称
  namespace: default        # 命名空间,可根据需求修改
spec:
  replicas: 1               # 副本数
  selector:
    matchLabels:
      app: example-app      # Pod 标签选择器
  template:
    metadata:
      labels:
        app: example-app    # Pod 元数据标签
    spec:
      nodeSelector:
        kubernetes.io/hostname: worker-node-1  # 关键配置:绑定到指定节点
      containers:
      - name: main-container  # 容器名称
        image: nginx:latest   # 镜像名称
        ports:
        - containerPort: 80   # 容器端口
        resources:            # 资源限制(可选)
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 200m
            memory: 256Mi

四、节点标签查看与管理

# 1. 查看所有节点标签
kubectl get nodes --show-labels

# 2. 为节点添加标签
kubectl label nodes worker-node-1 kubernetes.io/hostname=worker-node-1

# 3. 删除节点标签
kubectl label nodes worker-node-1 kubernetes.io/hostname-

五、注意事项

1、确保标签值在集群中唯一,避免多个节点匹配导致调度冲突

2、生产环境建议配合节点亲和性(nodeAffinity)使用更灵活

3、过度使用可能导致集群负载不均衡

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐