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

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

内容简介:前段时间测试将一套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

参考


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

查看所有标签

猜你喜欢:

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

大学的终结

大学的终结

[美] 凯文·凯里(Kevin Carey) / 朱志勇、韩倩 / 人民邮电出版社 / 2017-2-28 / 59.00

你了解目前全球高等教育的现状吗?你知道高等教育的未来是什么样的吗?你听说过泛在大学吗?翻开本书,了解大学的过去、现在与未来。 《大学的终结:泛在大学与高等教育革命》一书由美国著名教育作家凯文? 凯里倾情打造。作者在书中详细论述了美国大学的历史变迁、大学的本质、大学的未来、信息技术与教育的关系、泛在大学的定义、传统大学在大趋势下的挣扎,以及未来高等教育的学历认证与呈现形式。本书作者用缜密的逻辑......一起来看看 《大学的终结》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具