高级调度策略:Kubernetes亲和性与污点容忍详解

高级调度策略:亲和性与污点容忍

节点亲和性

requiredDuringSchedulingIgnoredDuringExecution(硬性要求)


apiVersion: apps/v1
kind: Deployment
metadata:
  name: prod-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: prod
  template:
    metadata:
      labels:
        app: prod
    spec:
      containers:
      - name: app
        image: myapp:v1
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-type
                operator: In
                values:
                - compute-optimized
              - key: disktype
                operator: In
                values:
                - ssd

preferredDuringSchedulingIgnoredDuringExecution(软性偏好)


spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        preference:
          matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - zone-a
            - zone-b

Pod亲和性与反亲和性

Pod反亲和性(分散Pod)


apiVersion: apps/v1
kind: Deployment
metadata:
  name: cache-cluster
spec:
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7.0
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - redis
            topologyKey: kubernetes.io/hostname

Pod亲和性( colocate相关Pod)


apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 2
  template:
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - cache
            topologyKey: kubernetes.io/hostname

污点与容忍

添加污点到节点


# 标记节点有污点(不可调度普通Pod)
kubectl taint nodes node1 key=value:NoSchedule

# 标记节点有污点(尽量不调度,可被驱逐)
kubectl taint nodes node1 key=value:NoExecute

# 标记节点有污点(仅控制平面)
kubectl taint nodes node1 node-role.kubernetes.io/control-plane:NoSchedule

在Pod上添加容忍


apiVersion: apps/v1
kind: Deployment
metadata:
  name: critical-app
spec:
  template:
    spec:
      tolerations:
      # 容忍指定污点
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule"
      # 容忍所有NoExecute污点
      - key: ""
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 3600
      # 容忍控制平面污点
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"

常见污点示例


# 专用节点(只运行特定应用)
tolerations:
- key: "dedicated"
  operator: "Equal"
  value: "database"
  effect: "NoSchedule"

# GPU节点
tolerations:
- key: "nvidia.com/gpu"
  operator: "Exists"
  effect: "NoSchedule"

综合示例


apiVersion: apps/v1
kind: Deployment
metadata:
  name: production-db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: production-db
  template:
    metadata:
      labels:
        app: production-db
    spec:
      containers:
      - name: postgres
        image: postgres:15
        resources:
          requests:
            memory: "4Gi"
            cpu: "2"
          limits:
            memory: "8Gi"
            cpu: "4"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-type
                operator: In
                values:
                - storage-optimized
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - production-db
            topologyKey: kubernetes.io/hostname
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "database"
        effect: "NoSchedule"

发表回复

后才能评论