3.11. 在 control plane 节点间测量网络抖动
心跳(heartbeat)间隔的值应大约是成员之间平均的往返时间 (RTT) 的最大值,通常大约是往返时间的 1.5 倍。OpenShift Container Platform 的默认心跳间隔为 100 ms,推荐的 control plane 节点之间的 RTT 小于 33 ms,最大小于 66 ms (66 ms x 1.5 = 99 ms)。如需更多信息,请参阅为 etcd 设置调整参数。任何大于这些值的网络延迟都可能会导致服务影响事件和集群不稳定。
网络延迟会受到很多因素的影响,包括但不限于以下因素:
- 传输网络的技术,如 copper、fiber、wireless 或 satellite
- 传输网络中网络设备的数量和质量
好的评估参考是将机构中的网络延迟与电信供应商发布的商业延迟进行比较,如每月 IP 延迟统计。
要进行精确计算,在考虑网络延迟时需要考虑到网络抖动。网络抖动(jitter)是网络延迟的差异,或者更具体地说,是接收的数据包的延迟变化。在理想的网络条件上,抖动应尽可能接近零。网络 jitter 对 etcd 的网络延迟计算有影响,因为在一段时间内实际网络延迟应该是 RTT 加上或减去抖动。例如,一个最大延迟为 80 ms 和抖动为 30 ms 的网络会出现 110 ms 的延迟,这意味着 etcd 缺少心跳,从而导致请求超时和临时领导丢失。在领导丢失和重新选举的过程中,Kubernetes API 无法处理任何请求,并可能出现对集群服务有影响的事件,并造成集群不稳定。
务必要测量所有 control plane 节点之间的网络抖动。为此,您可以在 UDP 模式下使用 iPerf3 工具。
前提条件
您构建自己的 iPerf 镜像。如需更多信息,请参阅以下红帽知识库文章
流程
连接到其中一个 control plane 节点,并在主机网络模式下运行 iPerf 容器作为 iPerf 服务器。当您以服务器模式运行时,工具接受 TCP 和 UDP 测试。输入以下命令,将
<iperf_image>替换为您的 iPerf 镜像:podman run -ti --rm --net host <iperf_image> iperf3 -s
# podman run -ti --rm --net host <iperf_image> iperf3 -sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令连接到另一个 control plane 节点,并在 UDP 客户端模式下运行 iPerf :
podman run -ti --rm --net host <iperf_image> iperf3 -u -c <node_iperf_server> -t 300
# podman run -ti --rm --net host <iperf_image> iperf3 -u -c <node_iperf_server> -t 300Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认测试会运行 10 秒,最后,客户端输出显示了从客户端的角度来看的平均抖动。
输入以下命令运行 debug 节点模式:
oc debug node/m1
# oc debug node/m1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Starting pod/m1-debug ... To use host binaries, run `chroot /host` Pod IP: 198.18.111.13 If you don't see a command prompt, try pressing enter.
Starting pod/m1-debug ... To use host binaries, run `chroot /host` Pod IP: 198.18.111.13 If you don't see a command prompt, try pressing enter.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令:
chroot /host
sh-4.4# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow podman run -ti --rm --net host <iperf_image> iperf3 -u -c m0
sh-4.4# podman run -ti --rm --net host <iperf_image> iperf3 -u -c m0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 iPerf 服务器上,输出显示每秒间隔的抖动。平均值在末尾显示。对于此测试,您要识别测试过程中遇到的最大抖动。忽略第一秒的输出,因为它可能包含无效的测量。输入以下命令:
oc debug node/m0
# oc debug node/m0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Starting pod/m0-debug ... To use host binaries, run `chroot /host` Pod IP: 198.18.111.12 If you don't see a command prompt, try pressing enter.
Starting pod/m0-debug ... To use host binaries, run `chroot /host` Pod IP: 198.18.111.12 If you don't see a command prompt, try pressing enter.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令:
chroot /host
sh-4.4# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow podman run -ti --rm --net host <iperf_image> iperf3 -s
sh-4.4# podman run -ti --rm --net host <iperf_image> iperf3 -sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 将计算的抖动添加为网络延迟的损失。例如,如果网络延迟为 80 ms,抖动为 30 ms,则对 control plane 来说,实际的网络延迟为 110 ms。在本例中,值超过了 100 ms 阈值,系统将丢失心跳。
当您计算 etcd 的网络延迟时,请使用有效的网络延迟,计算公式如下:
RTT + jitter
您可以使用平均 jitter 值来计算 penalty,但如果 etcd heartbeat 计时器低于以下公式的总和,集群可能会丢失心跳:
RTT + max(jitter)
相反,对于更具弹性的部署,请考虑使用 99th percentile 或 max jitter 值:
实际的网络延迟 = RTT + max (jitter)