0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

网络不通问题分析和解决方法

OSC开源社区 来源:阿里云云原生 2023-08-21 16:22 次阅读

为啥争吵,吵什么?

Cloud Native

"你到底在说什么啊,我K8s的ecs节点要访问clb的地址不通和本地网卡有什么关系..." 气愤语气都从电话那头传了过来,这时电话两端都沉默了。过了好一会传来地铁小姐姐甜美的播报声打断了刚刚的沉寂「乘坐地铁必须全程佩戴口罩,下一站西湖文化广场...」。

pod需要访问clb的443的监听, 但是如果是集群内(集群内后面都指的K8s的节点或者POD)访问就会出现如下报错Connection refused:

76d456fc-3dbb-11ee-ac96-dac502259ad0.png

所以就捋了一下客户链路如下:

76f1d024-3dbb-11ee-ac96-dac502259ad0.png  

具体现象是什么

无论是节点node还是pod里访问192.168.1.200:443都是不通的,但是访问192.168.1.200:80却是正常的。同时集群外的ECS192.168.3.100访问192.168.1.200:443和192.168.1.200:80都是正常的。

进一步分析看看

CLB1的IP192.168.1.200被绑定到了K8s的node节点的kube-ipvs0网卡上,这个是一张dummy 网卡,参考dummy interface。由于 SVC1 是LoadBalancer类型的,同时复用了这个CLB1,关联endpoint是POD1192.168.1.101:80,那么就可以解释为何访问192.168.1.200:80是正常,是由于kube-proxy根据SVC1的配置创建ipvs规则同时挂载了可被访问的后端服务。而集群里访问192.168.1.200:443都是不通的,因为IP被绑定到dummy网卡后,就不会再出节点去访问到CLB1,同时没有443对应ipvs规则,所以直接是拒绝的。

这个时候如果节点里没有ipvs规则(ipvs优先于监听)但是又能访问通的话, 可以检查一下是否本地有监听0.0.0.0:443的服务,那么这个时候所有网卡IP+443都能通,但是访问的是本地服务,而不是真正的CLB后端的服务。

7714403c-3dbb-11ee-ac96-dac502259ad0.png

是否有办法解决呢

Cloud Native

最建议的方式

最好的方式拆分, 集群内和集群外的服务分开两个CLB使用。

阿里云svc注解的方式

SVC1使用这个注解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname,进行占位,这样就不会绑定CLB的IP到kube-ipvs0的网卡上,集群内访问CLB的IP就会出集群访问CLB,但是需要注意如果监听协议为TCP或UDP,集群内访问CLB IP时将会存在回环访问问题。详细信息,请参见客户端无法访问负载均衡CLB[1]

需要CCM版本在 v2.3.0及以上版本才支持这个注解, 具体参考:通过Annotation配置传统型负载均衡CLB[2]

772dd5b0-3dbb-11ee-ac96-dac502259ad0.png

demo:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname: "${your_service_hostname}"
  name: nginx-svc
  namespace: default
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

集群内访问ExternalTrafficPolicy

策略有影响吗?

Cloud Native

我们都知道K8s的nodeport和loadbalancer模式是可以调整外部流量策略的,那么图中的「外部策略为Local/Cluster,所有集群节点创建IPVS规则是有区别的」该如何解释呢, 以及集群内访问nodePort/CLBIP的时候会发生什么。

77572488-3dbb-11ee-ac96-dac502259ad0.png

以下都是针对svc的internalTrafficPolicy都是Cluster或者缺省的情况,这个ServiceInternalTrafficPolicy特性在1.22的K8s中默认开启,具体参考service-traffic-policy[3]

具体到阿里云容器在不同网络CNI情况下的数据链路,可以参考下面的文章。

此处我们只讨论ipvs TrafficPolicy Local在Kubernetes 从1.22升级到1.24的行为变化。

Kubernetes 1.24 IPVS的变化

以下均以kube-proxy的IPVS模式为例:

当externalTrafficPolicy为Cluster模式或缺省的时候,ipvs规则里的nodePort/CLBIP后端会挂载所有的Endpoint的IP,这时候集群内访问会丢失源IP,因为节点会做一层SNAT。

当externalTrafficPolicy是Local的时候

当节点上有对应service的Endpoint的时候,ipvs规则里的nodePort/CLBIP后端只挂载自己节点的Endpoint的IP,集群内访问会保留源IP。

当节点上没有对应service的Endpoint的时候

在1.24之前的版本是会挂空的后端的,集群内访问会拒绝。

在1.24之后的K8s集群里,当节点上没有对应service的Endpoint的时候,ipvs规则里的nodePort/CLB IP后端会挂载所有的Endpoint的IP,这时候集群内访问会丢失源IP,因为节点会做一层SNAT。社区调整了Local策略后端服务的规则挂载策略,具体参考社区PR[4]

集群外访问SLB

集群外访问SLB的话,CCM只会挂载Local类型的节点,情况跟1.24 kubernetes前一样,这里不做过多阐述,请见上面连接。

集群外访问NodePort

1.24 Kubernetes之前版本

访问有Endpoint的节点的NodePort,可以通,可以保留源IP

Nginx分布在cn-hongkong.10.0.4.174和cn-hongkong.10.0.2.84节点。

77846b82-3dbb-11ee-ac96-dac502259ad0.png

从外部10.0.3.72节点访问有后端pod所在节点的cn-hongkong.10.0.2.84的30479端口,可以访问。

77aa1cf6-3dbb-11ee-ac96-dac502259ad0.png

cn-hongkong.10.0.0.140节点上是有相关的IPVS的规则的,但是只有该节点上后端Pod IP。

77d31d7c-3dbb-11ee-ac96-dac502259ad0.png

通过conntrack表可以到,这是由于在cn-hongkong.10.0.0.140节点上,相关的链路被dnat,最后是由pod cn-hongkong.10.0.2.84节点上的 的nginx-7d6877d777-tzbf7 10.0.2.87返回源,所有的相关转化都在该节点上,所以TCP四层建连可以成功。

77e7f8be-3dbb-11ee-ac96-dac502259ad0.png

访问没有Endpoint的节点的NodePort,不能通,因为节点上没有相关的ipvs转发规则

从外部10.0.3.72节点访问无后端pod所在节点的cn-hongkong.10.0.0.140的30479端口,不可以访问。

7800f72e-3dbb-11ee-ac96-dac502259ad0.png

查看该cn-hongkong.10.0.0.140节点,并没有相关的ipvs转发规则,所以无法进行dnat,访问会失败。

781dbbf2-3dbb-11ee-ac96-dac502259ad0.png

1.24 Kubernetes版本之后(含)

访问有Endpoint节点的NodePort,可以通,可以保留源IP

访问没有Endpoint节点的NodePort:

terway ENIIP or host网络:不通

Nginx分布在cn-hongkong.10.0.2.77和cn-hongkong.10.0.0.171 节点。

783c6480-3dbb-11ee-ac96-dac502259ad0.png

从外部10.0.3.72节点访问无后端pod所在节点的cn-hongkong.10.0.5.168的30745端口,可以看到,访问失败。

785afb5c-3dbb-11ee-ac96-dac502259ad0.png

cn-hongkong.10.0.5.168节点上是有相关的IPVS的规则的,并且会把所有的后端Pod IP加到IPVS规则中。

78749666-3dbb-11ee-ac96-dac502259ad0.png

通过conntrack表可以到,这是由于在cn-hongkong.10.0.5.168节点上,相关的链路被dnat,最后是由pod cn-hongkong.10.0.2.77节点上的nginx-79fc6bc6d-8vctc 10.0.2.78返回源,源在接受这个链路后,会发现和自己的五元组不匹配,直接丢弃,三次握手必然失败,所以建连失败。

78895128-3dbb-11ee-ac96-dac502259ad0.png

flannel网络:可以通,但是保留不了源IP

Nginx分布在cn-hongkong.10.0.2.86。

78a83d72-3dbb-11ee-ac96-dac502259ad0.png

从外部访问cn-hongkong.10.0.4.176的31218端口,可以访问成功。

78c5a024-3dbb-11ee-ac96-dac502259ad0.png

cn-hongkong.10.0.4.176记录了src是10.0.3.72,并做了dnat为172.16.160.135,期望它返回给10.0.4.176的58825端口。

78ecdc66-3dbb-11ee-ac96-dac502259ad0.png

后端ep所在节点cn-hongkong.10.0.2.86,conntrack表记录了src是10.0.4.176,sport是58825。所以可以看到应用pod是记录的源IP是10.0.4.176,丢失了源IP。

79061000-3dbb-11ee-ac96-dac502259ad0.png

集群内访问SLB或者NodePort

1.24 Kubernetes之前版本

有Endpoint的节点上访问,可以通,可以保留源IP

Nginx分布在ap-southeast-1.192.168.100.209和ap-southeast-1.192.168.100.208节点,ap-southeast-1.192.168.100.210节点没有Nginx pod。

7929d85a-3dbb-11ee-ac96-dac502259ad0.png

从集群任意节点(本例就在209节点)访问有后端pod所在节点的ap-southeast-1.192.168.100.209的NodePort 31565端口,可以访问。

79659d9a-3dbb-11ee-ac96-dac502259ad0.png

从有后端pod所在节点ap-southeast-1.192.168.100.209访问SLB 8.222.252.252 的80端口,可以访问。

79e601b0-3dbb-11ee-ac96-dac502259ad0.png

ap-southeast-1.192.168.100.209节点上是有NodePort 和SLB 的IPVS的规则的,但是只有该节点上后端Pod IP。

7a2b8550-3dbb-11ee-ac96-dac502259ad0.png

通过conntrack表可以到,这是由于在ap-southeast-1.192.168.100.209 节点上,相关的链路被dnat,最后是由pod 在ap-southeast-1.192.168.100.209 节点上的 的nginx-7d6877d777-2wh4s 192.168.100.222返回源,所有的相关转化都在该节点上,所以TCP四层建连可以成功。

7a4dc926-3dbb-11ee-ac96-dac502259ad0.png

没有Endpoint的节点上访问,不能通,因为节点上没有相关的ipvs转发规则

从集群任意节点(本例就在210节点)访问没有后端pod所在节点的ap-southeast-1.192.168.100.210 的NodePort 31565端口或者SLB,不可以访问。

也进一步证实,集群内访问关联svc的SLB不出节点,即使SLB有其他监听端口,访问SLB其他端口也会拒绝。

7a7d49ee-3dbb-11ee-ac96-dac502259ad0.png

查看该ap-southeast-1.192.168.100.210 节点,并没有相关的ipvs转发规则,所以无法进行dnat,访问会失败。

7a9a2230-3dbb-11ee-ac96-dac502259ad0.png

1.24 Kubernetes版本之后(含)

有Endpoint节点上访问,可以通,可以保留源IP

与上文的1.24 Kubernetes之前版本集群内访问一致,可以参考上文描述。

没有Endpoint节点上访问:

Nginx分布在cn-hongkong.10.0.2.77和cn-hongkong.10.0.0.171节点,所以在没有Nginx的cn-hongkong.10.0.4.141节点上测试。

7abe1c4e-3dbb-11ee-ac96-dac502259ad0.png

分别有以下几种情况:

terway或后端为hostNetwork

节点访问的通 NodePort(源 IP 是 ECS IP,不需要做 SNAT),无法保留源IP

可以看到没有Endpoint的节点的NodePort 110.0.4.141:30745 的IPVS 的规则添加的Nginx的所有后端POD nginx-79fc6bc6d-8vctc 10.0.2.78 和 nginx-79fc6bc6d-j587w 10.0.0.172。

7add6478-3dbb-11ee-ac96-dac502259ad0.png

集群内节点自身访问没有后端pod所在节点的cn-hongkong.10.0.4.141 的NodePort 30745/TCP端口,可以访问。

7afbca1c-3dbb-11ee-ac96-dac502259ad0.png

通过conntrack表可以到,在cn-hongkong.10.0.4.141节点上,相关的链路被dnat,最后是由后盾Nginx pod nginx-79fc6bc6d-8vctc 10.0.2.78返回源。

7b1970f8-3dbb-11ee-ac96-dac502259ad0.png

而在nginx-79fc6bc6d-8vctc 10.0.2.78 所在的节点cn-hongkong.10.0.2.77上的conntrack表记录的是10.04.141访问10.0.2.78,并期望10.0.2.78直接返回10.0.4.141的的39530端口。

7b299a28-3dbb-11ee-ac96-dac502259ad0.png

集群内有endpoint 节点访问没有后端pod所在节点的ap-southeast-1.192.168.100.131 的NodePort 32292端口,不可以访问,与上文1.24 Kubernetes版本之后(含) 集群外访问一致,可以参考上文描述。

节点访问不通 SLB IP(源 IP 是 SLB IP,没有人做 SNAT)

可以看到没有Endpoint的节点的SLB IP 的IPVS 的规则添加的Nginx的所有后端POD nginx-79fc6bc6d-8vctc 10.0.2.78 和 nginx-79fc6bc6d-j587w 10.0.0.172。

7b439554-3dbb-11ee-ac96-dac502259ad0.png

没有Endpoint的节点上访问 SLB 47.243.247.219,访问确是超时。

7b587618-3dbb-11ee-ac96-dac502259ad0.png

通过conntrack表可以到,在没有ep的节点访问SLB的IP,可以看到期望的是后端pod返回给SLB IP。而SLB IP 在节点上已经被kube-ipvs虚拟占位了,所以没有做snat,造成无法访问。

7b695cbc-3dbb-11ee-ac96-dac502259ad0.png

flannel并且后端为普通pod,可以访问通,但是保留不了源IP

Nginx分布在cn-hongkong.10.0.2.86。

78a83d72-3dbb-11ee-ac96-dac502259ad0.png

在cn-hongkong.10.0.4.176访问SLB 47.242.86.39 是可以访问成功的。

7b9f8c1a-3dbb-11ee-ac96-dac502259ad0.png

cn-hongkong.10.0.4.176节点的conntrack表可以看到是src和dst都是47.242.86.39,但是期望的是 nginx pod172.16.160.135 返回给 10.0.4.176 的54988端口,47.242.86.39 snat成10.0.4.176。

7bfaa870-3dbb-11ee-ac96-dac502259ad0.png

后端ep所在节点cn-hongkong.10.0.2.86,conntrack表记录了src是10.0.4.176,sport是54988。所以可以看到应用pod是记录的源IP是10.0.4.176,丢失了源IP。

7c192f98-3dbb-11ee-ac96-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网卡
    +关注

    关注

    2

    文章

    285

    浏览量

    27090
  • 客户端
    +关注

    关注

    1

    文章

    282

    浏览量

    16340
  • SVC
    SVC
    +关注

    关注

    0

    文章

    33

    浏览量

    11929
  • 阿里云
    +关注

    关注

    3

    文章

    883

    浏览量

    42615
  • kubernetes
    +关注

    关注

    0

    文章

    219

    浏览量

    8568

原文标题:一次网络不通"争吵"引发的思考

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STC-ISP下载失败的原因和解决方法

    整理原因和解决方法如下:(仅供参考,欢迎指正,Email:stcisp@163.com)首先成功进行ISP烧写的条件非常简单,只要有串口和单片机接成最小系统(带有RS232电路)就可以了(
    发表于 08-09 08:26

    BIOS错误信息和解决方法

    BIOS错误信息和解决方法 1.CMOS battery failed(CMOS电池失效) 原因:说明CMOS电池的电力已经不
    发表于 03-10 11:49 3000次阅读

    关于开关电源的电磁干扰问题研究和解决方法

    关于开关电源的电磁干扰问题研究和解决方法 开关电源由于本身工作特性使得电磁干扰问题相当突出。从开关电源电磁干扰的模
    发表于 06-30 20:22 1185次阅读
    关于开关电源的电磁干扰问题研究<b class='flag-5'>和解决方法</b>

    光绘胶卷一些常见的冲洗问题和解决方法(图解法)

    光绘胶卷一些常见的冲洗问题和解决方法(图解法)
    发表于 03-15 10:25 1186次阅读

    采用MATLAB对SPWM进行辅助设计与详细分析和解决方法

    采用MATLAB对SPWM进行辅助设计与详细分析和解决方法
    发表于 09-14 14:22 18次下载
    采用MATLAB对SPWM进行辅助设计与详细<b class='flag-5'>分析</b><b class='flag-5'>和解决方法</b>

    一文解读MES系统中选型困惑和解决方法

    本文主要介绍了MES系统中选型困惑和解决方法
    发表于 06-26 08:00 1次下载

    51单片机用到strcmp比较字符串有的问题和解决方法说明

    本文档的主要内容详细介绍的是51单片机用到strcmp比较字符串有的问题和解决方法说明。
    发表于 07-02 17:42 8次下载
    51单片机用到strcmp比较字符串有的问题<b class='flag-5'>和解决方法</b>说明

    假焊的原因和解决方法

    在电子原件焊接过程中,焊点表面上好像焊接成功,但实际上并没有焊住,有时用手一拨,引线就可以从焊接点中拨出,这种现象称为假焊。假焊的原因和解决方法说明如下
    发表于 04-30 15:18 3w次阅读

    三相电机一根线不通的原因及解决方法

    如果三相电机中有一根线不通,通常表现为电机无法启动或启动后运行不正常。以下是可能导致这种情况的原因和解决方法
    发表于 03-03 17:45 4881次阅读

    保护死区的概念和解决方法

    保护死区的概念和解决方法
    的头像 发表于 07-15 11:02 870次阅读
    保护死区的概念<b class='flag-5'>和解决方法</b>

    变频器过热的故障原因和解决方法

    变频器过热的故障原因和解决方法
    的头像 发表于 10-24 10:09 1950次阅读

    DCDC电路过流(输入电压)的原因分析和解决方法

    DCDC电路过流(输入电压)的原因分析和解决方法  DC-DC(直流-直流)电路是将一种直流电压转换成另一种直流电压的电路。因其效率高、可靠性高、动态响应快等特点,广泛应用于电子设备、通讯设备
    的头像 发表于 10-29 16:28 2668次阅读

    GSM系统中干扰问题的分类、定位和解决方法

    电子发烧友网站提供《GSM系统中干扰问题的分类、定位和解决方法.pdf》资料免费下载
    发表于 11-17 16:53 0次下载
    GSM系统中干扰问题的分类、定位<b class='flag-5'>和解决方法</b>

    internet无法连接到网络?这些原因和解决方法要知道

    internet无法连接到网络?这些原因和解决方法要知道  简介: 互联网已经成为现代生活中不可或缺的一部分。然而,有时我们可能会遇到无法连接到网络的问题。这篇文章将详细介绍可能导致互联网连接
    的头像 发表于 12-09 16:15 5613次阅读

    步进电机丢步的原因和解决方法

    步进电机丢步的原因和解决方法 步进电机是一种常见的电动机类型,特点是可以实现精确的位置控制和旋转运动。然而,在实际使用过程中,步进电机有时会出现丢步的现象,即无法按照预定步长准确移动。这种情况可能会
    的头像 发表于 02-01 16:32 1190次阅读