zoukankan      html  css  js  c++  java
  • calico node status显示为分别显示为Passive和Active Socket: Host is unreachable

    搭建kubernetes集群时,三个节点,一个master,两个woker。

    1592913185(1)

    加入集群后,在woker节点通过calicoctl node status查询节点之间状态如下两图:

    88bf282e582718d12a99124769337ba

    cec54f07bd9a847b3e3545ee19bcc34

    之所以不在master节点执行该查询命令,是因为执行时总报错。

    从查询结果中可以看出,两个worker节点都与master节点成功建立连接,但它们俩之间却是不同的,并且显示的错误信息还不同。

    这个存在了好长时间,一直解决不了,整个人都快被整郁闷了。

    还好再快翻遍calico原理的情况,终于给解决了,现在记录下破案过程。

    这个过程中一直重复了多遍节点的删除、初始化、加入集群、删除calico-node的过程,但都没有效果。

    于是怀疑是IP-IN-IP模式的原因,把它禁掉后,除了多出好多路由外错误依旧。

    9c79b46533a5eb42eaca309ed0d65fa

    此时终于明白IP-IN-IP的好处,通过它的封装,各个节点只需要其它节点就可以了,如果没有它,各个节点需要知道其它节点上的所有pod。

    如果存在10个节点,每个节点上存在10个pod,采用IP-IN-IP模式,每个节点只需要建立10条到其它节点的路由即可,整个集群新增100条路由,但如果禁用IP-IN-IP模式,那每个节点都需要建立到其它所有pod的1000条路由,整个集群新增10000条路由。

    继续来说破案。

    Passive是被动的意思,那为什么节点会处于Passive?

    通过dashboard进入报Passive错误节点的calico-node中,执行【cat /etc/calico/confd/config/bird.cfg】,显示出了下图内容:

    e50e06133347d61ea7b49082569f8f6

    对于master节点(31.151),它不是Passive,而对于另一个worker节点(31.153)它却是【Passive on】。

    这可能就是原因,但为什么这么区分?难道对于master类型特殊处理?

    通过这个文件的注解行可知,这个配置文件是通过模板生成的。那生成的时候为什么要区别对待呢?

    上源码!

    29e84b140084ad1d4299c44c460eebf

    模板文件的注解说的就比较清楚了,为了避免节点间同时向对方连接导致的路由抖动,采用一方被动一方主动方式。

    那谁主动谁被动呢?

    规则:【{{if gt $onode_ip $node_ip}}】。

    也就是说谁ip地址小谁被动,谁ip地址大谁主动。

    这也解释了在master节点的calico-node中,它的配置文件bird.cfg里,它相对于其它节点都是【Passive on】的,不是因为它的master身份,仅仅是因为它的ip地址最小。

    23090368f7d3e0abeba7c5c65b00219

    这同时也明晰了一件事,那就是在calico-node启动时,根据配置文件,主动方会向【Passive on】方发起连接。

    那去产生错误的主动方节点上看看有没有等待建立的连接?

    81515cc334e694b3bd3aa1b38b3ae0c

    咦?竟然没有向被动方(192.168.31.152)发起的连接请求?难道又搞错了?

    再重启calico-node试试。

    还是没用。

    那是怎么回事?

    既然已经和master(31.151)建立了连接,那看看都建立了那些连接?

    bded50b82cad0173704e48b241cb70e

    179?好熟悉的端口。

    记得在看calico配置的时候见过这个端口,并且在master节点的防火墙上放行了这个端口。

    难道152没开这个端口?赶紧去查查!

    果然!开了防火墙,没放行这个端口。

    抓紧加上,重启防火墙!

    哈哈!果然是它!

    b2f394be554edad245127f88843d055

    开了179端口,连重启calico-node都不用,直接就连上了,一切正常。

    抓紧看看官方文档咋说的。

    5374750ddd3bd599f9ac9fb183eae8f

    果然需要放行,并且不同模式需要放行的端口还不一样。

    终于弄清楚并解决了!!!

    回顾整个破案过程,一直没解决的原因有两个。头一次弄,没经验,需要趟坑,这不算。

    第一个是文档里说的,需要所有的host都放行179端口。不只是通过命令【kubectl apply –f calico.yaml】部署calico的主节点,还有所有的加入集群的worker都需要这样。除了ip地址最大的那个节点不用连别人,其它的都至少需要主动连接一个其它的节点。

    第二个就是calico-node连接的问题。它在连接失败后就不再多次或重复尝试连接了,这样就无法通过命令【netstat –nt】很快确定问题在哪了。

  • 相关阅读:
    Zabbix监控系统详解:系统功能介绍
    Zabbix监控系统详解:ubuntu系统下软件的安装
    计算机数学基础:第二章 极限
    计算机数学基础:第一章 函数
    net 架构师-数据库-sql server-003-T-SQL 基本语句
    net 架构师-数据库-sql server-002-工具
    net 架构师-数据库-sql server-001-SQL Server中的对象
    net 架构师-数据库-sql server-触发器
    c# 设计模式
    CSS盒模型(1)——基本概念
  • 原文地址:https://www.cnblogs.com/StarkBrothers/p/13184138.html
Copyright © 2011-2022 走看看