Kubernetes服务中是否有故障转移功能?

时间:2019-11-29 14:49:44

标签: kubernetes load-balancing

我有一个kubernetes集群和2个复制的数据库。我希望能够在集群内部连接该数据库。数据库将是有状态集,并且具有无头服务器。 可以说,吊舱名称是D-1和D-2。 D-1将为主,D-2将为副本。我想将所有流量重定向到主服务器(D-1),但是如果主服务器Pod失败,则应该重定向 副本(D-2)的流量。我不能在客户端这样做,所以我必须在kubernetes中找到一种方法。我如何建立这种结构? 所以,如果我curl缩到

  

database-service.default.svc.cluster.local

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

2 个答案:

答案 0 :(得分:0)

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

通常,Service只是将运行在一组Pods上的应用程序公开为网络服务的抽象方法。

$  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

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

如您所知,K8s会自动逐出故障的Pod,这就是为什么流量不会路由到故障的Pod。但是,

  • 当两个数据库都联机时,K8s通过服务对流量进行负载平衡;
  • 从Pod崩溃到被撤出之间有一个延迟(因此流量没有路由到它)。

这就是为什么要实现故障转移,原因如下:

  

我想将我的所有流量重定向到主服务器(D-1),但是如果主Pod失败,它应该将流量重定向到副本(D-2)

看起来“操作员”正是这里所需要的。运算符不是K8附带的东西,而是通常由DBVendor提供。

Oracle MySQL Operator for Kubernetes是一个很好的例子。

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

功能丰富,可让您管理集群,执行备份/还原,提供指标等。

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

希望有帮助。

答案 1 :(得分:0)

我认为我可以用这种方式处理(未经测试): 考虑2个节点上的2个数据库容器。如果D-2具有就绪探测器取决于D-1是否启动(如果D1-1具有启动状态,则D-2具有就绪探测器情况并且服务将该容器标记为不正常)所有流量将被重定向到D-1(master)。如果我从主机端口复制该数据库,我认为可以做到。这是真的吗?

还有云原生存储解决方案。