连接 Failover 和 Replica 实例

Failover 和 Replica 架构会暴露按角色选择的 Service。读写 Service 选择当前主节点,只读 Service 选择从节点。

Failover 还会额外部署或引用 Valkey Sentinel。Replica 架构不会部署 Sentinel;应用程序使用同一个读写 Service,但不能假设存在基于 Sentinel 的自动故障转移。

发现 endpoint

kubectl -n default get valkey valkey-failover -o wide
kubectl -n default get service -l buf.red/name=valkey-failover -o wide
kubectl -n default get endpointslice \
  -l kubernetes.io/service-name=rfr-valkey-failover-readwrite
kubectl -n default get endpointslice \
  -l kubernetes.io/service-name=rfr-valkey-failover-readonly

对于集群内客户端,稳定的 DNS 名称如下:

rfr-valkey-failover-readwrite.default.svc:6379
rfr-valkey-failover-readonly.default.svc:6379

请替换为适用于你环境的实例名称和 namespace。应发现实际的 Service 名称,而不是在生产自动化中自行构造。

测试写入端点

不使用 access control list (ACL) 身份验证:

valkey-cli -h rfr-valkey-failover-readwrite.default.svc -p 6379 PING

使用自定义 ACL 用户时,交互式请求密码:

valkey-cli -h rfr-valkey-failover-readwrite.default.svc -p 6379 \
  --user app --askpass PING

仅使用环境批准的临时 key 测试写入:

valkey-cli -h rfr-valkey-failover-readwrite.default.svc -p 6379 \
  --user app --askpass SET connectivity:test ok EX 60
valkey-cli -h rfr-valkey-failover-readwrite.default.svc -p 6379 \
  --user app --askpass GET connectivity:test

测试只读端点

valkey-cli -h rfr-valkey-failover-readonly.default.svc -p 6379 \
  --user app --askpass GET connectivity:test

当没有可用从节点时,只读 Service 可能没有 endpoint。复制是异步的,因此从节点可能返回较旧的值。在主节点故障和晋升期间,已确认的写入也可能不会出现在已晋升的从节点上。不要将此端点用于写后读一致性。

使用 TLS

spec.access.enableTLS 为 true 时,请通过经批准的证书分发流程获取受信任的客户端身份。生成的 server 默认需要受信任的客户端证书,因此仅有 certificate authority (CA) 还不够:

valkey-cli --tls --cacert <ca-file> \
  --cert <client-certificate-file> --key <client-key-file> \
  -h rfr-valkey-failover-readwrite.default -p 6379 \
  --user app --askpass PING

在此示例中,rfr-valkey-failover-readwrite.default 包含在生成的证书中;.svc 形式不包含在内。请检查 Certificate.spec.dnsNames 并使用其中列出的精确名称。实例 TLS Secret 包含一个供 Operator 内部使用的 server 私钥;不要将该密钥作为通用应用程序客户端身份分发。不要将 --insecure 作为正常连接方式。

外部访问

对于 LoadBalancer,请检查按角色选择的 Service,并等待 ingress 地址:

kubectl -n default get service rfr-valkey-failover-readwrite -w
kubectl -n default get service rfr-valkey-failover-readwrite -o yaml

对于 NodePort,请获取分配的端口和可达的 Kubernetes 节点地址。Firewall 规则和路由必须允许该连接:

kubectl -n default get service rfr-valkey-failover-readwrite \
  -o jsonpath='{.spec.ports[0].nodePort}{"\n"}'
kubectl get nodes -o wide

生成的证书不包含 LoadBalancer ingress 或 Kubernetes 节点地址。因此,外部 TLS 需要一条产品批准的证书路径,其 subject alternative names 覆盖客户端 hostname;高层 2.0.0 API 不暴露任意 subject-alternative-name 字段。

不要为 2.0.0 发布固定的 spec.access.ports 示例:检查到的 custom resource definition (CRD) schema 和运行时解析器使用不兼容的格式。除非交付构建文档中说明了已验证的格式,否则请保持该字段未设置。

客户端行为

  • 写入和对一致性敏感的读取应使用读写端点。
  • 配置有界的连接、命令和重试超时。
  • 在主节点切换后重新解析 DNS 并重新连接。
  • 仅重试对应用程序幂等性模型安全的操作。
  • 在向只读端点发送生产读取请求之前,监控从节点健康状况。

上述一致性和故障转移边界遵循官方 Valkey replicationSentinel 文档。请从 Valkey client catalog 中选择客户端,并在该客户端自身的文档中验证其重试和 TLS 行为。