第 29 章 高可用性
29.1. 概述
本节介绍了为 OpenShift Container Platform 集群中的 pod 和服务设置高可用性。
IP 故障转移(IP failover)在一组节点上管理一个虚拟 IP(VIP)地址池。集合中的每个 VIP 都由从集合中选择的节点提供服务。只要单个节点可用,就会提供 VIP。无法将 VIP 显式分发到节点上。因此可能存在没有 VIP 的节点和具有多个 VIP 的节点。如果只有一个节点,则所有 VIP 将位于其中。
VIP 必须可以从集群外部路由。
IP 故障转移会监控每个 VIP 上的端口,以确定该端口能否在节点上访问。如果端口无法访问,则不会向节点分配 VIP。如果端口设为 0
,则会禁止此检查。check脚本执行所需的测试。
IP 故障转移使用 Keepalived 在一组主机上托管一组外部访问的 VIP 地址。在一个时间点上,每个 VIP 仅由一个主机提供服务。 keepalived 使用 VRRP 协议来确定哪个主机(来自主机集合)将为哪个主机提供 VIP 服务。如果主机不可用,或者 Keepalived 正在监视的服务没有响应,则 VIP 会切换到来自集合的另一个主机。因此,只要主机可用,就会始终为 VIP 服务。
当运行 Keepalived 的主机通过 check 脚本时,主机可以根据其优先级和当前 MASTER 的优先级,由 抢占策略决定的 MASTER 状态。
管理员可以通过 --notify-script=
选项提供脚本,该选项会在状态发生变化时调用。keepalived 在为 VIP 提供时处于 MASTER 状态,当另一个节点提供 VIP 服务时,处于 BACKUP 状态,或者在 检查 脚本失败时处于 FAULT' 状态。每当状态更改时,notify 脚本 都会被调用,并显示新的状态。
OpenShift Container Platform 支持通过运行 oc adm ipfailover
命令来创建 IP 故障转移部署配置。IP 故障转移部署配置指定 VIP 地址的集合,以及服务它们的一组节点。一个集群可以具有多个 IP 故障转移部署配置,各自管理自己的一组唯一的 VIP 地址。IP 故障转移配置中的每个节点运行 IP 故障转移 pod,此 pod 运行 Keepalived。
当使用 VIP 访问具有主机网络(如路由器)的 pod 时,应用程序 pod 应该在运行 ipfailover pod 的所有节点上运行。这可让任何 ipfailover 节点成为 master,并在需要时为 VIP 服务。如果应用程序 pod 没有在使用 ipfailover 的节点上运行,某些 ipfailover 节点永远不会为 VIP 服务,或者一些应用程序 pod 不会接收任何流量。对 ipfailover 和应用 pod 都使用相同的选择器和复制数,以避免这种不匹配。
在使用 VIP 访问服务时,任何节点都可以位于一组节点的 ipfailover 部分,因为该服务可在所有节点(无论应用程序 pod 在哪里运行)访问该服务。任何 ipfailover 节点都可以随时变为 master。该服务可以使用外部 IP 和服务端口,或者可以使用 nodePort。
当在服务中使用外部 IP 时,VIP 被设置为外部 IP,ipfailover 监控端口被设置为服务端口。一个 nodePort 在集群的每个节点中打开,该服务将与当前支持 VIP 的任何节点中负载平衡流量。在本例中,ipfailover 监控端口在服务定义中被设置为 nodePort。
设置 nodePort 是一个特权操作。
即使一个服务 VIP 具有高可用性,但性能仍会受到影响。keepalived 确保每个 VIP 都由配置中的某个节点提供服务,即使其他节点没有,也会在同一节点上出现多个 VIP。当 ipfailover 在同一节点上放置多个 VIP 时,在一组 VIP 之间进行外部负载均衡的策略可能会被破解。
当使用 ingressIP 时,您可以将 ipfailover 设置为与 ingressIP 范围相同的 VIP 范围。您还可以禁用监控端口。在这种情况下,所有 VIP 都出现在集群的同一节点上。任何用户都可以使用 ingressIP 设置服务,并使其具有高可用性。
集群中最多有 255 个 VIP。