8.4. 配置 IP 故障转移
本节论述了为 OpenShift Container Platform 集群上的 pod 和服务配置 IP 故障转移。
IP 故障转移使用 Keepalived 在一组主机上托管一组外部访问的虚拟 IP (VIP) 地址。每个 VIP 地址仅由单个主机提供服务。Keepalived 使用虚拟路由器冗余协议(VRRP)决定在主机集合中使用哪个主机提供 VIP 服务。如果主机不可用,或者 Keepalived 正在监视的服务没有响应,则 VIP 会切换到主机集中的另外一个主机。这意味着只要主机可用,便始终可以提供 VIP 服务。
集合中的每个 VIP 都由从集合中选择的节点提供服务。如果单个节点可用,则会提供 VIP。无法将 VIP 显式分发到节点上,因此可能存在没有 VIP 的节点和其他具有多个 VIP 的节点。如果只有一个节点,则所有 VIP 都在其中。
管理员必须确保所有 VIP 地址都满足以下要求:
- 可在集群外部配置的主机上访问。
- 不用于集群中的任何其他目的。
每个节点上的 keepalived 确定所需服务是否在运行。如果是,则支持 VIP,Keepalived 参与协商来确定哪个节点服务 VIP。对于要参与的节点,服务必须侦听 VIP 上的观察端口,或者必须禁用检查。
集合中的每个 VIP 都可以由不同的节点提供。
IP 故障转移会监控每个 VIP 上的端口,以确定该端口能否在节点上访问。如果端口无法访问,则不会向节点分配 VIP。如果端口设为 0
,则会禁止此检查。检查脚本执行所需的测试。
当运行 Keepalived 的节点通过检查脚本时,该节点上的 VIP 可以根据其优先级和当前 master 的优先级以及抢占策略决定进入 master
状态。
集群管理员可以通过 OPENSHIFT_HA_NOTIFY_SCRIPT
变量提供一个脚本,每当节点上的 VIP 的状态发生变化时会调用此脚本。keepalived 在为 VIP 提供服务时为 master
状态;当另一个节点提供 VIP 服务时,状态为 backup
;当检查脚本失败时,状态为 fault
。每当状态更改时,notify 脚本都会被调用,并显示新的状态。
您可以在 OpenShift Container Platform 上创建 IP 故障转移部署配置。IP 故障转移部署配置指定 VIP 地址的集合,以及服务它们的一组节点。一个集群可以具有多个 IP 故障转移部署配置,各自管理自己的一组唯一的 VIP 地址。IP 故障转移配置中的每个节点运行 IP 故障转移 pod,此 pod 运行 Keepalived。
使用 VIP 访问带有主机网络的 pod 时,应用程序 pod 在运行 IP 故障转移 pod 的所有节点上运行。这可让任何 IP 故障转移节点成为主节点,并在需要时为 VIP 服务。如果应用程序 pod 没有在所有具有 IP 故障转移功能的节点上运行,有些 IP 故障转移节点不会为 VIP 服务,或者某些应用 pod 都不会接收任何流量。对 IP 故障转移和应用容器集使用相同的选择器和复制数,以避免这种不匹配。
在使用 VIP 访问服务时,任何节点都可以位于节点的 IP 故障转移集中,因为无论应用容器集在哪里运行,该服务都可以在所有节点上访问。任何 IP 故障转移节点可以随时变成主节点。服务可以使用外部 IP 和服务端口,或者可以使用 NodePort
。设置 NodePort
是一个特权操作。
在服务定义中使用外部 IP 时,VIP 被设置为外部 IP,IP 故障转移监控端口则设为服务端口。在使用节点端口时,该端口在集群的每个节点上打开,服务则从当前服务于 VIP 的任何节点对流量进行负载平衡。在这种情况下,IP 故障转移监控端口在服务定义中设置为 NodePort
。
即使一个服务 VIP 具有高可用性,但性能仍会受到影响。keepalived 确保每个 VIP 都由配置中的某个节点提供服务,即使其他节点没有,也可以在同一节点上出现多个 VIP。当 IP 故障转移在同一节点上放置多个 VIP 时,在一组 VIP 间进行外部负载平衡的策略可能会被破解。
当使用 ExternalIP
时,您可以将 IP 故障转移设置为与 ExternalIP
范围相同的 VIP 范围。您还可以禁用监控端口。在这种情况下,所有 VIP 都出现在集群中的同一节点上。任何用户都可以使用 ExternalIP
设置服务并使其高度可用。
集群中最多有 254 个 VIP。
8.4.1. IP 故障转移环境变量 复制链接链接已复制到粘贴板!
下表包含用于配置 IP 故障转移的变量。
变量名称 | default | 描述 |
---|---|---|
|
|
IP 故障转移 pod 会尝试在每个虚拟 IP(VIP)上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为 |
|
IP 故障转移用于发送虚拟路由器冗余协议 (VRRP) 流量的接口名称。默认值为
如果您的集群使用 OVN-Kubernetes 网络插件,请将此值设置为 | |
|
|
要创建的副本数。这必须与 IP 故障转移部署配置中的 |
|
要复制的 IP 地址范围列表。必须提供.例如, | |
|
|
用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为 |
|
为 VRRP 创建的组数量。如果没有设置,则会为通过 | |
| 输入 |
iptables 链的名称,用于自动添加允许 VRRP 流量的 |
| 定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用是否正在运行。 | |
|
| 检查脚本运行的期间(以秒为单位)。 |
| 当状态发生变化时运行的脚本的 pod 文件系统的完整路径名称。 | |
|
|
处理新的具有更高优先级主机的策略。 |
8.4.2. 在集群中配置 IP 故障切换 复制链接链接已复制到粘贴板!
作为集群管理员,您可以在整个集群中或在其中的一部分节点(由标签选项器定义)中配置 IP 故障转移。您还可以在集群中配置多个 IP 故障转移部署,每个 IP 故障转移部署相互独立。
IP 故障转移部署确保故障转移 pod 在符合限制或使用的标签的每个节点上运行。
此 pod 运行 Keepalived,它可以监控端点,并在第一个节点无法访问服务或端点时使用 Virtual Router Redundancy Protocol(VRRP)从一个节点切换到另一个节点的虚拟 IP(VIP)。
对于生产环境,设置一个选择器(selector)
,用于选择至少两个节点,并设置与所选节点数量相等的副本
。
前提条件
-
以具有
cluster-admin
权限的用户身份登录集群。 - 已创建一个 pull secret。
仅限 Red Hat OpenStack Platform (RHOSP):
- 您在目标环境中安装了 RHOSP 客户端 (RHCOS 文档)。
-
您还下载了 RHOSP
openrc.sh
rc 文件 (RHCOS 文档)。
流程
创建 IP 故障转移服务帐户:
oc create sa ipfailover
$ oc create sa ipfailover
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
hostNetwork
更新安全性上下文约束(SCC):oc adm policy add-scc-to-user privileged -z ipfailover
$ oc adm policy add-scc-to-user privileged -z ipfailover
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm policy add-scc-to-user hostnetwork -z ipfailover
$ oc adm policy add-scc-to-user hostnetwork -z ipfailover
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅限 Red Hat OpenStack Platform (RHOSP):完成以下步骤,使在 RHOSP 端口上可以访问故障转移 VIP 地址。
使用 RHOSP CLI 在 RHOSP 集群的
allowed_address_pairs
参数中显示默认的 RHOSP API 和 VIP 地址:openstack port show <cluster_name> -c allowed_address_pairs
$ openstack port show <cluster_name> -c allowed_address_pairs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
*Field* *Value* allowed_address_pairs ip_address='192.168.0.5', mac_address='fa:16:3e:31:f9:cb' ip_address='192.168.0.7', mac_address='fa:16:3e:31:f9:cb'
*Field* *Value* allowed_address_pairs ip_address='192.168.0.5', mac_address='fa:16:3e:31:f9:cb' ip_address='192.168.0.7', mac_address='fa:16:3e:31:f9:cb'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 IP 故障转移部署设置不同的 VIP 地址,并通过在 RHOSP CLI 中输入以下命令使 RHOSP 端口上的地址访问。不要将任何默认的 RHOSP API 和 VIP 地址设置为 IP 故障转移部署的故障转移 VIP 地址。
在 RHOSP 端口中添加
1.1.1.1
故障转移 IP 地址作为允许的地址的示例。openstack port set <cluster_name> --allowed-address ip-address=1.1.1.1,mac-address=fa:fa:16:3e:31:f9:cb
$ openstack port set <cluster_name> --allowed-address ip-address=1.1.1.1,mac-address=fa:fa:16:3e:31:f9:cb
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 创建部署 YAML 文件,为您的部署配置 IP 故障切换。请参阅后续步骤中的"IP 故障转移配置的部署 YAML 示例"。
在 IP 故障转移部署中指定以下规格,以便将故障转移 VIP 地址传递给
OPENSHIFT_HA_VIRTUAL_IPS
环境变量:将
1.1.1.1
VIP 地址添加到OPENSHIFT_HA_VIRTUAL_IPS
的示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建部署 YAML 文件来配置 IP 故障切换。
注意对于 Red Hat OpenStack Platform (RHOSP),您不需要重新创建部署 YAML 文件。您已作为之前说明的一部分创建了此文件。
IP 故障转移配置的部署 YAML 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- IP 故障转移部署的名称。
- 2
- 要复制的 IP 地址范围列表。必须提供.例如,
1.2.3.4-6,1.2.3.9
。 - 3
- 为 VRRP 创建的组数量。如果没有设置,则会为通过
OPENSHIFT_HA_VIP_GROUPS
变量指定的每个虚拟 IP 范围创建一个组。 - 4
- IP 故障切换用于发送 VRRP 流量的接口名称。默认情况下使用
eth0
。 - 5
- IP 故障转移 pod 会尝试在每个 VIP 上打开到此端口的 TCP 连接。如果建立连接,则服务将被视为正在运行。如果此端口设为
0
,则测试会始终通过。默认值为80
。 - 6
- 用于设置虚拟路由器 ID 的偏移值。使用不同的偏移值可以在同一集群中存在多个 IP 故障转移配置。默认偏移值为
10
,允许的范围为0
到255
。 - 7
- 要创建的副本数。这必须与 IP 故障转移部署配置中的
spec.replicas
值匹配。默认值为2
。 - 8
iptables
链的名称,用于自动添加允许 VRRP 流量的iptables
规则。如果没有设置值,则不会添加iptables
规则。如果链不存在,则不会创建链,Keepalived 在单播模式下运行。默认为INPUT
。- 9
- 当状态发生变化时运行的脚本的 pod 文件系统的完整路径名称。
- 10
- 定期运行的脚本的 pod 文件系统中的完整路径名称,以验证应用是否正在运行。
- 11
- 处理新的具有更高优先级主机的策略。默认值为
preempt_delay 300
,这会导致,在有一个较低优先级的 master 提供 VIP 时,Keepalived 实例在 5 分钟后会接管 VIP。 - 12
- 检查脚本运行的期间(以秒为单位)。默认值为
2
。 - 13
- 在创建部署之前创建 pull secret,否则您将在创建部署时收到错误。
8.4.3. 配置检查和通知脚本 复制链接链接已复制到粘贴板!
keepalived 通过定期运行可选用户提供的检查脚本来监控应用程序的健康状况。例如,该脚本可以通过发出请求并验证响应来测试 Web 服务器。作为集群管理员,您可以提供一个可选的 notify 脚本,该脚本会在状态发生变化时调用。
检查和通知在 IP 故障转移容器集中运行的脚本,并使用容器集文件系统,而不是主机文件系统。但是,IP 故障转移 pod 使主机文件系统在 /hosts
挂载路径下可用。在配置检查或通知脚本时,您必须提供脚本的完整路径。提供脚本的建议方法是使用 ConfigMap
对象。
检查和通知脚本的完整路径名称添加到 Keepalived 配置文件 _/etc/keepalived/keepalived.conf
中,该文件会在 Keepalived 每次启动时加载。可以使用 ConfigMap
对象将脚本添加到 pod,如以下方法所述。
检查脚本
不提供检查脚本时,将运行一个简单的默认脚本来测试 TCP 连接。当监控端口为 0
时,禁止此默认测试。
每个 IP 故障转移 pod 管理一个 Keepalived 守护进程,在运行 pod 的节点上管理一个或多个虚拟 IP (VIP)地址。Keepalived 守护进程为该节点保留每个 VIP 的状态。特定节点上的特定 VIP 可能处于 master
、backup
或 fault
状态。
如果检查脚本返回非零,节点会进入 backup
状态,并且它拥有的任何 VIP 被重新分配。
notify 脚本
keepalived 将以下三个参数传递给 notify 脚本:
-
$1
-group
或instance
-
$2
-group
或instance
的名称 -
$3
- 新状态:master
、backup
或fault
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
权限的用户登陆到集群。
流程
创建所需脚本,并创建
ConfigMap
对象来容纳它。脚本没有输入参数,并且必须返回0
(OK
)和1
(fail
)。检查脚本,
mycheckscript.sh
:#!/bin/bash # Whatever tests are needed # E.g., send request and verify response exit 0
#!/bin/bash # Whatever tests are needed # E.g., send request and verify response exit 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
ConfigMap
对象:oc create configmap mycustomcheck --from-file=mycheckscript.sh
$ oc create configmap mycustomcheck --from-file=mycheckscript.sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将脚本添加到容器集。挂载的
ConfigMap
对象的defaultMode
必须能够使用oc
命令或编辑部署配置来运行。值通常为0755
、493
(十进制):oc set env deploy/ipfailover-keepalived \ OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.sh
$ oc set env deploy/ipfailover-keepalived \ OPENSHIFT_HA_CHECK_SCRIPT=/etc/keepalive/mycheckscript.sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc set volume deploy/ipfailover-keepalived --add --overwrite \ --name=config-volume \ --mount-path=/etc/keepalive \ --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'
$ oc set volume deploy/ipfailover-keepalived --add --overwrite \ --name=config-volume \ --mount-path=/etc/keepalive \ --source='{"configMap": { "name": "mycustomcheck", "defaultMode": 493}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意oc set env
命令对空格敏感。=
符号的两侧不能有空格。提示您还可以编辑
ipfailover-keepalived
部署配置:oc edit deploy ipfailover-keepalived
$ oc edit deploy ipfailover-keepalived
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存更改并退出编辑器。这会重启
ipfailover-keepalived
。
8.4.4. 配置 VRRP 抢占 复制链接链接已复制到粘贴板!
当一个节点上的虚拟 IP(VIP)因为通过了检查脚本的检查而脱离 fault
状态时,如果其优先级低于当前处于 master
状态的节点上的 VIP,则节点上的 VIP 将进入 backup
状态。nopreempt
策略不会将 master
从主机上的较低优先级 VIP 移到主机上的优先级更高的 VIP。当使用默认的 preempt_delay 300
时,Keepalived 会等待指定的 300 秒,并将 master
移到主机上的优先级更高的 VIP。
流程
要指定抢占,输入
oc edit deploy ipfailover-keepalived
以编辑路由器部署配置:oc edit deploy ipfailover-keepalived
$ oc edit deploy ipfailover-keepalived
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 设置
OPENSHIFT_HA_PREEMPTION
值:-
preempt_delay 300
:Keepalived 会等待指定的 300 秒,并将master
移到主机上的优先级更高的 VIP。这是默认值。 -
nopreempt
:不会将master
从主机上的较低优先级 VIP 移到主机上的优先级更高的 VIP。
-
8.4.5. 部署多个 IP 故障转移实例 复制链接链接已复制到粘贴板!
每个 IP 转移 pod 由 IP 故障转移部署配置管理,每个节点 1
个 pod,以一个 Keepalived 守护进程运行。配置更多 IP 故障转移部署配置后,会创建更多 pod,更多的守护进程加入常见的虚拟路由器冗余协议(VRRP)协商。此协商由所有 Keepalived 守护进程完成,它决定了哪些节点服务是哪个虚拟 IP(VIP)。
Keepalived 内部为每个 VIP 分配一个唯一的 vrrp-id
。协商使用这一组 vrrp-ids
,在做出决策时,胜出的 vrrp-id
对应的 VIP 将在胜出的节点上服务。
因此,对于 IP 故障转移部署配置中定义的每个 VIP,IP 故障转移 pod 必须分配对应的 vrrp-id
。这可以从 OPENSHIFT_HA_VRRP_ID_OFFSET
开始,并按顺序将 vrrp-ids
分配到 VIP 列表来实现。vrrp-ids
的值可在 1..255
之间。
当存在多个 IP 故障转移部署配置时,您必须指定 OPENSHIFT_HA_VRRP_ID_OFFSET
,以便在部署配置中增加 VIP 的数量,并且没有 vrrp-id
范围重叠。
8.4.6. 为超过 254 地址配置 IP 故障转移 复制链接链接已复制到粘贴板!
IP 故障转移管理有 254 个组虚拟 IP(VIP)地址的限制。默认情况下,OpenShift Container Platform 会为每个组分配一个 IP 地址。您可以使用 OPENSHIFT_HA_VIP_GROUPS
变量进行更改,使得每个组中有多个 IP 地址,并在配置 IP 故障转移时定义每个虚拟路由器冗余协议(VRRP)实例可用的 VIP 组数量。
在 VRRP 故障转移事件中,对 VIP 进行分组会为每个 VRRP 创建更广泛的 VIP 分配范围,并在集群中的所有主机都能够从本地访问服务时很有用。例如,当服务通过 ExternalIP
公开时。
使用故障转移的一个规则是,请勿将路由等服务限制到一个特定的主机。相反,服务应复制到每一主机上,以便在 IP 故障转移时,不必在新主机上重新创建服务。
如果使用 OpenShift Container Platform 健康检查,IP 故障转移和组的性质意味着不会检查组中的所有实例。因此,必须使用 Kubernetes 健康检查来确保服务处于活动状态。
先决条件
-
使用具有
cluster-admin
权限的用户登陆到集群。
流程
要更改分配给每个组的 IP 地址数量,请更改
OPENSHIFT_HA_VIP_GROUPS
变量的值,例如:IP 故障转换配置的
Deployment
YAML 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果在有七个 VIP 的环境中将
OPENSHIFT_HA_VIP_GROUPS
设置为3
,它会创建三个组,将三个 VIP 分配到第一个组,为剩余的两个组各分配两个 VIP。
如果 OPENSHIFT_HA_VIP_GROUPS
设置的组数量少于设置为故障的 IP 地址数量,则组包含多个 IP 地址,且所有地址都作为一个单元移动。
8.4.7. ExternalIP 的高可用性 复制链接链接已复制到粘贴板!
在非云集群中,可以组合使用 IP 故障切换和 ExternalIP
到服务。对于使用 ExternalIP
创建服务的用户,结果是高可用性服务。
方法是指定集群网络配置的 spec.ExternalIP.autoAssignCIDRs
范围,然后在创建 IP 故障转移配置时使用相同的范围。
因为 IP 故障转移最多可支持整个集群的 255 个 VIP,所以 spec.ExternalIP.autoAssignCIDRs
必须为 /24
或更小。
8.4.8. 删除 IP 故障切换 复制链接链接已复制到粘贴板!
在初始配置 IP 故障切换时,集群中的 worker 节点会使用 iptables
规则修改,该规则明确允许 Keepalived 在 224.0.0.18
上多播数据包。由于对节点的更改,移除 IP 故障切换需要运行一个作业来删除 iptables
规则并删除 Keepalived 使用的虚拟 IP 地址。
流程
可选:识别并删除存储为配置映射的任何检查和通知脚本:
确定任何用于 IP 故障切换的 pod 是否使用配置映射作为卷:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Namespace: default Pod: keepalived-worker-59df45db9c-2x9mn Volumes that use config maps: volume: config-volume configMap: mycustomcheck
Namespace: default Pod: keepalived-worker-59df45db9c-2x9mn Volumes that use config maps: volume: config-volume configMap: mycustomcheck
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果上一步提供了用作卷的配置映射的名称,请删除配置映射:
oc delete configmap <configmap_name>
$ oc delete configmap <configmap_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
为 IP 故障切换识别现有部署:
oc get deployment -l ipfailover
$ oc get deployment -l ipfailover
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE default ipfailover 2/2 2 2 105d
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE default ipfailover 2/2 2 2 105d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除部署:
oc delete deployment <ipfailover_deployment_name>
$ oc delete deployment <ipfailover_deployment_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
ipfailover
服务帐户:oc delete sa ipfailover
$ oc delete sa ipfailover
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行一个作业,该作业会删除最初配置 IP 故障切换时添加的 IP 表规则:
创建一个文件,如
remove-ipfailover-job.yaml
,其内容类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行作业:
oc create -f remove-ipfailover-job.yaml
$ oc create -f remove-ipfailover-job.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
job.batch/remove-ipfailover-2h8dm created
job.batch/remove-ipfailover-2h8dm created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认作业删除了 IP 故障切换的初始配置。
oc logs job/remove-ipfailover-2h8dm
$ oc logs job/remove-ipfailover-2h8dm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
remove-failover.sh: OpenShift IP Failover service terminating. - Removing ip_vs module ... - Cleaning up ... - Releasing VIPs (interface eth0) ...
remove-failover.sh: OpenShift IP Failover service terminating. - Removing ip_vs module ... - Cleaning up ... - Releasing VIPs (interface eth0) ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow