本文介绍如何修复 Flannel 网络模型的集群中大并发流量场景下,镜像推送失败的问题。
在 Flannel 网络的集群中,大并发流量下可能出现镜像推送失败的问题。过大的并发流量可能导致 TCP ack
包超过窗口上限,使 ECS 协议栈返回 reset
包,导致推送流中断,进而镜像推送失败。例如,在 Flannel 网络的集群中,使用 Kaniko 作为流水线推送镜像失败。
通过调整物理节点内核参数的方法可以解决这个问题。在客户端 ECS 中,将 /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
参数设置为 1,允许大并发流量下 TCP ack
包超过窗口上限,避免 ECS 协议栈返回 reset
包所导致的推送流中断。调整 /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
参数不会对业务产生影响。
sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1
修改目标内核参数。说明
VPC-CNI 网络模型自身可以有效避免大并发导致的镜像推送失败问题。选用 VPC-CNI 网络模型需要 重新创建 容器集群,在 容器网络模型 选择 VPC-CNI
。创建集群操作参见 创建集群。
说明
该方案一次性修改集群中所有节点的内核参数,适合频繁扩缩容的大规模集群。后续节点池扩缩容后,无需手动运维。
通过 Daemonset 守护进程,创建具有特权的 Pod 部署到目标集群上,修改集群中所有节点的内核参数。
登录 容器服务控制台。
在目标集群中,选择 工作负载 > 守护进程。
通过 YAML 创建守护进程。示例代码如下。
apiVersion: apps/v1 kind: DaemonSet metadata: name: sysctl-conf namespace: kube-system spec: selector: matchLabels: name: sysctl-conf template: metadata: labels: name: sysctl-conf spec: hostPID: true hostIPC: true hostNetwork: true containers: - name: sysctl image: busybox securityContext: privileged: true command: ["/bin/sh"] args: ["-c", "sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1 && sleep 86400"]
检查 ECS 中 /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
是否成功切换为 1
。
cat /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
说明
sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1
修改目标内核参数。通过控制台管理节点池执行脚本,调整新增节点的目标内核参数。
登录 容器服务控制台。
在目标集群中,选择 节点管理 > 节点池。
单击目标节点池 操作 列下的 编辑。
在高级配置中设置部署执行脚本,示例如下。
sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1
单击 确认 完成配置。
通过容器服务的自定义镜像,在节点或者节点池部署 /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
参数值为 1
的自定义操作系统。