Kubernetes IPVS模式下服务间长连接通讯的优化,解决Connection reset by peer问题

栏目: 编程工具 · 发布时间: 7年前

内容简介:前段时间测试将一套Kubernetes环境的经过本地环境测试,当发一起一波请求到客户端服务预热一下,然后停止大约不到二十分钟时间,再请求客户端服务,客户端服务就会返回在切换成ipvs模式后,客户端服务和gRPC服务之间的通信是基于ipvs的:

前段时间测试将一套Kubernetes环境的 kube-proxy 切换成了ipvs模式,参见 Kubernetes kube-proxy开启IPVS模式 。 这套Kubernetes集群上主要运行http restful和gRPC两类服务,切换后这段时间还算稳定,只是最近某些客户端服务在调用gRPC服务时小概率出现 Connection reset by peer 的错误。

经过本地环境测试,当发一起一波请求到客户端服务预热一下,然后停止大约不到二十分钟时间,再请求客户端服务,客户端服务就会返回 Connection reset by peer 的错误,这说明是gRPC服务端将连接主动关闭了。 接下来再发起一波请求到客户端服务,一切又微服务正常。

在切换成ipvs模式后,客户端服务和gRPC服务之间的通信是基于ipvs的:

Kubernetes IPVS模式下服务间长连接通讯的优化,解决Connection reset by peer问题

把上图中client看成是客户端服务Pod,3个Backend Pod(1~3)看成是后端的gRPC服务。 可以看出客户端服务和gRPC服务之间的交互路径:

grpc-client ---> ipvs 
        ---> grpc server pod1
        ---> grpc server pod3
        ---> grpc server pod3

我们知道gRPC是基于HTTP/2协议的,gRPC的client和server在交互时会建立多条连接,为了性能,这些连接都是长连接并且是一直保活的。 这段环境中不管是客户端服务还是gRPC服务都被调度到各个相同配置信息的Kubernetes节点上,这些k8s节点的 keep-alive 是一致的,如果出现连接主动关闭的问题,因为从client到server经历了一层ipvs,所以最大的可能就是ipvs出将连接主动断开,而client端还不知情。

搜索 ipvs timeout 关键字找到了下面相关的链接:

https://github.com/moby/moby/issues/31208 中是关于docker swarm在overlay网络下长连接的问题,这个和k8s kube-proxy应该是类似的,按照这个链接中的描述查看 我们这套环境关于tcp keepalive的内核参数:

sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75

上面这段参数的含义: net.ipv4.tcp_keepalive_time 是连接时长,当超过这个时间后,每个 net.ipv4.tcp_keepalive_intvl 的时间间隔会发送keepalive数据包, net.ipv4.tcp_keepalive_probe 是发送keepalived数据包的频率。

使用 ipvsadm 命令查看k8s节点上ipvs的超时时间:

ipvsadm -l --timeout
Timeout (tcp tcpfin udp): 900 120 300

经过上面的分析可以看出,各个k8s节点上tcp keepalive超时是7200秒(即2小时),ipvs超时是900秒(15分钟),这就出现如果客户端或服务端在15分钟内没有应答时,ipvs会主动将tcp连接终止,而客户端服务还傻傻以为是2个小时呢。 很明显 net.ipv4.tcp_keepalive_time 不能超过ipvs的超时时间。

按照 https://github.com/moby/moby/issues/31208 中描述的,在测试环境中调节k8s节点上的tcp keepalive参数如下:

net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10

再去测试Connection reset by peer问题已经解决。由于我们维护k8s集群的ansible role包含配置内核参数的task,将其完善如下:

- name: copy sysctl k8s.conf
  copy:
    src: k8s.conf
    dest: /etc/sysctl.d

- name: sysctl k8s.conf
  sysctl: 
    name: ""
    value: ""
    sysctl_file: /etc/sysctl.d/k8s.conf
    sysctl_set: yes
  with_items:
    - name: net.bridge.bridge-nf-call-iptables
      value: 1
    - name: net.bridge.bridge-nf-call-ip6tables
      value: 1
    - name: net.ipv4.tcp_keepalive_time
      value: 600
    - name: net.ipv4.tcp_keepalive_intvl
      value: 30
    - name: net.ipv4.tcp_keepalive_probes
      value: 10

参考


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bulletproof Web Design

Bulletproof Web Design

Dan Cederholm / New Riders Press / 28 July, 2005 / $39.99

No matter how visually appealing or packed with content a Web site is, it isn't succeeding if it's not reaching the widest possible audience. Designers who get this guide can be assured their Web site......一起来看看 《Bulletproof Web Design》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换