配置调度

高层级 Valkey API 提供标准的 Kubernetes 调度控制。

亲和性策略

高层级 schema 接受以下 spec.affinityPolicy 值,但所检查的 Cluster builder 并未实现每一项 schema 描述:

行为
SoftAntiAffinity优先将同一 shard 的成员分散到不同节点上;但不强制要求分离。
AntiAffinityInShard要求同一 shard 的成员运行在不同节点上。这是 Cluster builder 默认应用的策略。
AntiAffinity该实现使用与 AntiAffinityInShard 相同的 shard 局部选择器;它不会对所有 shard 强制执行分离。
CustomAffinityAPI 字面量与 Cluster builder 选择的内部常量不匹配,因此无法可靠地激活此分支。在此基线中,请将其视为不受 Cluster 支持。

必需反亲和性在集群可用节点过少时可能会使 Pod 处于 Pending 状态。例如,一个 shard 中的两个成员,无论采用哪种必需策略,都需要两个可用节点。不同的 shard 仍然可以共享这些节点。

对于现有的 Cluster 实例,在更新期间,reconcile 路径会保留每个 StatefulSet 当前的 Pod 亲和性。因此,已更改的 affinityPolicycustomAffinity 只会应用于之后创建的 StatefulSet,例如新添加 shard 的工作负载。请在创建时设置预期的策略。

节点选择器和容忍度

kubectl -n default patch valkey valkey-cluster --type=merge -p '
{
  "spec": {
    "nodeSelector": {
      "workload.alauda.io/type": "memory-optimized"
    },
    "tolerations": [
      {
        "key": "middleware",
        "operator": "Equal",
        "value": "valkey",
        "effect": "NoSchedule"
      }
    ]
  }
}'

operator 会将这些设置传播到数据工作负载。对于 operator 创建的 Sentinel 部署,未指定的 Sentinel 节点选择器和容忍度将继承高层级实例值。

Failover 和 Replica 亲和性

Failover 和 Replica 不使用高层级 affinityPolicy 开关。当 spec.customAffinity 不存在时,它们的数据 StatefulSet 会获得跨数据组的必需反亲和性。当 spec.customAffinity 存在时,builder 会直接复制该 Kubernetes Affinity 对象。例如:

spec:
  customAffinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            topologyKey: topology.kubernetes.io/zone
            labelSelector:
              matchLabels:
                buf.red/name: valkey-failover

请将标签值替换为所属实例名称。仅在测试命名空间中,先针对 Failover 或 Replica 工作负载验证该字段,并检查生成的 StatefulSet 后,再应用此字段。operator 创建的 Sentinel 会继承高层级节点选择器和容忍度,但不会继承此自定义亲和性。

验证调度

kubectl -n default get pods -l buf.red/name=valkey-cluster -o wide
kubectl -n default get events --sort-by=.lastTimestamp
kubectl -n default describe pod <pending-pod>

等待 Valkey 资源恢复为 Ready。如果 Pod 仍然处于 Pending,请在放宽策略之前检查节点标签、污点、可分配资源、卷拓扑以及必需反亲和性。