kubernetes - 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。
解决方案
答案取决于您使用的数据库类型。
一般来说, 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之前建议的云原生分布式数据库。
希望有帮助。
推荐阅读
- python - 多个 func.count().filter() 会多次扫描数据库吗?
- c# - 如何修复 taskScheduler OnUnobservedException xamarin 表单?
- ios - 将 UICollectionView 的内容转换为图像
- python - 通过每个框的单个按钮从每个输入框获取值
- redirect - 使用 Websphere Liberty OIDC 提供程序注销重定向
- sql - 在ssis的多个文件夹中解压多个文件
- python - 使用 Python3 在 Google App Engine 中编写应用程序日志?
- ios - 为什么 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?
- elasticsearch - 在 Travis Xenial 构建主机上运行 Elasticsearch-7.0
- java - 口吃摇摆动画