首页 > 解决方案 > Kubernetes 服务中是否有故障转移功能?

问题描述

我有一个 kubernetes 集群和 2 个复制的数据库。我希望能够在集群内连接这些数据库。数据库将是有状态的并且有一个无头服务器。假设 pod 名称是 D-1 和 D-2。D-1 将是主,D-2 将是副本。我想将所有流量重定向到主节点(D-1),但如果主 pod 失败,它应该将流量重定向到副本(D-2)。我不能在客户端这样做,所以我必须在 kubernetes 中找到一种方法。我怎样才能建立这个结构?所以如果我卷曲到

数据库服务.default.svc.cluster.local

它必须始终转到 D-1 pod,如果 D-1 pod 不可用,它必须将所有流量重定向到 D-2。

标签: kubernetesload-balancing

解决方案


答案取决于您使用的数据库类型。

一般来说, Service只是将运行在一组Pod上的应用程序公开为网络服务的一种抽象方式。

$  kubectl get svc -o wide
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE    SELECTOR
kubernetes           ClusterIP   10.0.0.1     <none>        443/TCP        6d3h   <none>
db-access            ClusterIP   10.0.5.233   <none>        3306/TCP       3m     app=my_db

该示例中的服务根据选择器将流量路由到Enpoint Sliceapp=my_db

如您所知,K8s 会自动驱逐失败的 Pod,这就是为什么流量不会路由到失败的 Pod。然而,

  • 当两个 DB 都在线时,K8s 负载均衡流量(通过服务);
  • Pod 崩溃和它被驱逐之间存在延迟(因此流量不会被路由到它)。

这就是为什么为了实现您所描述的故障转移:

我想将我的所有流量重定向到主节点(D-1),但如果主 pod 失败,它应该将流量重定向到副本(D-2)

看起来“操作员”正是这里所需要的。Operator 不是 K8s 包含的东西,但通常由 DBVendor 提供。

一个很好的例子是适用于 Kubernetes 的 Oracle MySQL Operator

它是一个 K8s 控制器,可以安装到任何现有的 K8s 集群中。安装后,它将使用户能够使用简单的声明性配置格式创建和管理生产就绪的 MySQL 集群。

它功能丰富,允许您管理集群、执行备份/恢复、提供指标等。

此外,您可以考虑使用@Jonas之前建议的云原生分布式数据库。

希望有帮助。


推荐阅读