诊断未就绪的实例

Valkey 保持在 InitializingRebalancingFailed 状态时,或者预期的 Pod 和 Service 不可用时,请使用此操作步骤。

保留当前状态

不要先重启或编辑子资源。请先记录所属资源、子资源、Pod 和 Events:

kubectl -n <namespace> get valkey <name> -o yaml
kubectl -n <namespace> describe valkey <name>
kubectl -n <namespace> get cluster,failover,sentinel -o wide
kubectl -n <namespace> get pods,service,pvc -l buf.red/name=<name> -o wide
kubectl -n <namespace> get events --sort-by=.lastTimestamp

读取 .status.phase.status.message。高级状态是主要摘要;子资源状态提供与拓扑相关的详细信息。

检查准入和规格失败

如果创建或更新被拒绝,请在不修改实际对象的情况下重现校验:

kubectl apply --dry-run=server -f valkey.yaml

常见的校验边界包括:

症状检查
不支持的版本对于 product 2.0.0,仅使用 7.28.19.1
资源校验错误指定 CPU 和内存;保持 requests 和 limits 相等,以避免 webhook 警告。
Cluster 分片错误使用 3–128 个分片,以及每个分片 1–5 个总成员。分片数量超过 128 时,可能通过高级准入校验,但在 Operator 拥有的子资源上稍后失败,导致实例变为 Failed 而不是被拒绝。
Failover Sentinel 错误将数据分片保持为 1,并使用至少 3 个奇数个 Sentinel。
NodePort 拒绝除非交付的构建定义了已校验的格式,否则不要设置 spec.access.ports;检查集群范围内的端口冲突。
TLS 拒绝或停滞验证 certIssuercertIssuerType、issuer 就绪状态以及 cert-manager。
访问控制列表(ACL)用户拒绝验证同命名空间的密码 Secret、password 键、密码长度、用户名以及 ACL 语法。

检查无法调度的 Pod

kubectl -n <namespace> get pods -l buf.red/name=<name> -o wide
kubectl -n <namespace> describe pod <pending-pod>
kubectl get nodes -o wide
kubectl describe node <candidate-node>

检查 CPU 或内存不足、必需的反亲和性、node-selector 不匹配、无法容忍的 taint、persistent volume claim(PVC)拓扑冲突以及命名空间配额。 对于 Cluster,两个必需策略都通过分片本地 selector 实现,因此某个分片中的每个成员都需要不同的符合条件的节点;不同分片可以共享节点。对于没有自定义 affinity 的 Failover 或 Replica,每个数据成员都需要不同的符合条件的节点。

检查存储

kubectl -n <namespace> get pvc -l buf.red/name=<name>
kubectl -n <namespace> describe pvc <pvc-name>
kubectl get storageclass

处于 Pending 的 PVC 会阻止其 Pod。请确认 StorageClass 是否存在、provisioner 是否健康、访问模式、容量、卷拓扑以及存储配额。在了解其数据保留要求和恢复步骤之前,不要删除 PVC。

检查 TLS 资源

kubectl -n <namespace> get certificate,secret
kubectl -n <namespace> describe certificate <name>-cert
kubectl -n <namespace> get secret <name>-tls
kubectl -n <namespace> get issuer
kubectl get clusterissuer

Operator 期望 cert-manager 将 <name>-cert 签发到 <name>-tls 中。检查 issuer 就绪状态、DNS 名称、证书 Events 以及 cert-manager 日志。切勿在支持记录中打印私钥数据。

检查容器和 Operator

kubectl -n <namespace> logs <pod-name> -c valkey --previous --tail=200
# Run only when the exporter sidecar is enabled.
kubectl -n <namespace> logs <pod-name> -c exporter --tail=200
kubectl get deployment -A -l app.kubernetes.io/name=valkey-operator
kubectl -n <operator-namespace> logs deployment/<operator-deployment> \
  --all-containers --since=30m

对于 Failover,还要检查 sentinel 容器。将日志与故障时间对齐,并将其与 Events 关联起来。

检查拓扑健康状态

对于 Cluster:

kubectl -n <namespace> exec <ready-cluster-pod> -c valkey -- \
  valkey-cli CLUSTER INFO
kubectl -n <namespace> exec <ready-cluster-pod> -c valkey -- \
  valkey-cli CLUSTER NODES

对于 Failover 或 Replica:

kubectl -n <namespace> exec <ready-data-pod> -c valkey -- \
  valkey-cli INFO replication

当端点需要 ACL 和 TLS 选项时,请一并添加。不要假设对某个节点成功执行 PING 就能证明整个 Cluster 覆盖完整或复制健康。

升级包

请提供以下内容,并移除 Secret 值:

  • Valkey 及相关子资源 YAML;
  • Events 和 Pod 描述;
  • 指定时间范围内的 Operator、数据节点、Sentinel 和 exporter 日志;
  • PVC、Service、EndpointSlice 和 Certificate 状态;
  • CLUSTER INFOCLUSTER NODES,或 INFO replication
  • 产品版本、Operator 镜像、服务器镜像、确切故障时间,以及最近一次更改。

请参考官方 CLUSTER INFO 参考CLUSTER NODES 参考INFO 参考 来解读服务器命令。