我是通过建立虚拟局域网将本地虚拟机和服务器连接起来的, 本地虚拟机已经作为节点加入了服务器的集群, 虚拟机上的其他pod都正常唯独calico-node部署不起来,
防火墙都关了, 本地虚拟机ping 10.233.0.1也正常
求dalao解惑, 感激不尽🌹🌹🌹

work节点的calico-node日志如下:

2021-08-17 16:02:07.677 [INFO][8] startup/startup.go 376: Early log level set to info
2021-08-17 16:02:07.677 [INFO][8] startup/startup.go 392: Using NODENAME environment for node name
2021-08-17 16:02:07.678 [INFO][8] startup/startup.go 404: Determined node name: vm-home
2021-08-17 16:02:07.680 [INFO][8] startup/startup.go 436: Checking datastore connection
2021-08-17 16:02:37.681 [INFO][8] startup/startup.go 451: Hit error connecting to datastore - retry error=Get "https://10.233.0.1:443/api/v1/nodes/foo": dial tcp 10.233.0.1:443: i/o timeout

本地虚拟机的路由表:
Kernel IP routing table

ifconfig:

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:82:89:95:14  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.104  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::a00:27ff:fe77:622  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:77:06:22  txqueuelen 1000  (Ethernet)
        RX packets 996222  bytes 1370287379 (1.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 489990  bytes 68509334 (65.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 150320  bytes 17229830 (16.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 150320  bytes 17229830 (16.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

zt7nner2ay: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 2800
        inet 10.147.20.50  netmask 255.255.255.0  broadcast 10.147.20.255
        inet6 fe80::e4fe:e8ff:fe17:448b  prefixlen 64  scopeid 0x20<link>
        ether 82:5f:ee:29:26:84  txqueuelen 1000  (Ethernet)
        RX packets 345250  bytes 894781833 (853.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 290790  bytes 27769964 (26.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • kevendeng 回复了此帖
  • heming
    那或许这个endpoint对象是由另外的参数配置的,kubelet的node-ip参数仅仅是控制hostNetwork模式下pod的ip。

    我能想到的两个地方还有kube-apiserver与kube-controller-manager,你可以先尝试把kube-apiserver中对应的地址改为VPN的IP,该文件位于主节点的/etc/kubernetes/manifests/kube-apiserver.yaml下,可以直接使用搜索与替换,保存后kube-apiserver会自动重启。

    heming
    确定除calico以外的容器能正常运行了?如果calico没有就绪,你的其他Pod应该也是不能跨节点通信的。你可以在Pod内ping 10.233.0.1试试。

      kevendeng 您好,我在它自带的pod叫node-export这个pod可以ping通10.233.0.1因为calico没能部署,我自己的pod也部署不了了

        heming
        calico node跟node-exporter都是使用了hostNetwork,网络栈应该是一样的,你在node-exporter中能curl -k https://10.233.0.1 吗?
        在宿主机中呢?

          heming
          但是从宿主机、各个Pod都能Ping通这个IP是吧?

          那猜测是CNI网络没有问题,但是kube-proxy出现了问题

          可以先简单检查下master所在节点与网络异常节点的kube-proxy pod日志

          先定位具体的Pod:

          kubectl get pod -n kube-system -o wide -l k8s-app=kube-proxy

          比对Node值为master与异常节点名

          分别查看每个Pod的日志,寻找异常信息

          kubectl logs -n kube-system kube-proxy-xxxx

          若日志无明确异常,可以看看kube-proxy运行在哪个模式下,方便进一步Debug:

          kubectl get cm -n kube-system kube-proxy -o yaml | grep mode

          若mode为iptables,则需检查每个节点上的iptables规则,可通过iptables-save全量导出
          若mode为ipvs,则需检查每个节点上的ipvs规则,可通过ipvsadm -ln查看

            kevendeng


            你好,那个异常节点(vm-home)的kubeproxy确实出现问题了,dial tcp 10.147.20.1:6443: connect: no route to host它请求master地址显示没有路由, 但是在异常节点和pod里都可以ping通这个地址 10.147.20.1(master节点vpn的地址)

              heming
              你可尝试在异常节点的宿主机上直接执行curl -k https://10.147.20.1:6443,若能得到响应,则说明是kube-proxy网络命名空间设置错误,若不能得到响应,则说明VPN配置有误,与K8s无关。

                heming
                直接删掉Pod触发其重新创建或许可以解决此问题,但我建议先进入Pod所在网络命名空间做一些测试后再销毁现场。

                执行以下命令获取kube-proxy pod的进程号:

                docker inspect $(docker ps | grep kube-proxy | grep pause | awk '{print $1}') | grep Pid

                进入该网络命名空间:

                nsenter -t 进程号 -n

                查看网络接口信息与路由表

                ip a
                ip r

                除此之外,还可查看节点上对应容器的相关日志,检查是否有异常输出

                获取kube-proxy容器id

                docker inspect $(docker ps | grep kube-proxy | grep pause | awk '{print $1}') | grep Id

                查看相关日志:

                less /var/log/messages

                输入\容器Id查找相关日志

                你好! 这是异常节点的kubeproxy的接口信息:

                @kevendeng#28737 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
                    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
                    inet 127.0.0.1/8 scope host lo
                       valid_lft forever preferred_lft forever
                    inet6 ::1/128 scope host 
                       valid_lft forever preferred_lft forever
                2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
                    link/ether 08:00:27:77:06:22 brd ff:ff:ff:ff:ff:ff
                    inet 192.168.0.104/24 brd 192.168.0.255 scope global dynamic noprefixroute enp0s3
                       valid_lft 172510sec preferred_lft 172510sec
                    inet6 fe80::a00:27ff:fe77:622/64 scope link noprefixroute 
                       valid_lft forever preferred_lft forever
                3: zt7nner2ay: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN group default qlen 1000
                    link/ether 82:5f:ee:29:26:84 brd ff:ff:ff:ff:ff:ff
                    inet 10.147.20.50/24 brd 10.147.20.255 scope global zt7nner2ay
                       valid_lft forever preferred_lft forever
                    inet6 fe80::485a:2bff:feba:277f/64 scope link 
                       valid_lft forever preferred_lft forever
                4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
                    link/ether 02:42:4d:65:a0:f0 brd ff:ff:ff:ff:ff:ff
                    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
                       valid_lft forever preferred_lft forever
                5: nodelocaldns: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default 
                    link/ether be:f1:45:9b:e6:c4 brd ff:ff:ff:ff:ff:ff
                    inet 169.254.25.10/32 brd 169.254.25.10 scope global nodelocaldns
                       valid_lft forever preferred_lft forever
                6: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default 
                    link/ether f2:f9:81:df:62:f1 brd ff:ff:ff:ff:ff:ff
                    inet 10.233.0.3/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.61.65/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.19.231/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.48.17/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.29.149/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.25.27/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.8.25/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.29.2/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.48.209/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.24.220/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.16.230/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever
                    inet 10.233.0.1/32 scope global kube-ipvs0
                       valid_lft forever preferred_lft forever

                它的路由表:

                我重启了异常节点的kubeproxy,也重启了异常节点还是一样的问题,
                这是重启异常节点后的kubeproxy的日志:

                  heming
                  从路由表及kube-proxy的日志来看,它已经处于正常运行状态了,现在还有什么问题?

                  heming
                  现在kube-proxy已经正常运行了,应该检查calico的日志,理论上它应该可以通过10.233.0.1访问到kube-apiserver了。

                    kevendeng 你好, calico 还是无法使用

                    那个异常节点和calico的pod不能访问https://10.233.0.1:443, 但是都能访问https://主节点IP:6443, kube-proxy日志也没有异常信息,甚至日志从启动以来就没变化, 请问是什么原因会造成这种结果呢?

                      heming
                      10.233.0.1是K8s集群的虚拟Service IP,指向主节点的真实IP,而这个映射关系是由kube-proxy通过创建ipvs转发规则实现的。

                      执行命令 ipvsadm -ln | grep 10.233.0.1 检查是否有从 10.233.0.1:443主节点IP:6443 的映射,若没有此规则,说明kube-proxy仍未正常工作,需要再次检查其日志是否有异常。

                        kevendeng 你好! 感谢您的再次帮助,我发现了一个问题, ipvsadm -ln查看异常节点的转发规则:

                        这个是指向master的内网地址的,不是服务器vpn地址, 请问需要如何解决?

                          heming
                          你所建立的VPN是否为整个集群所有节点共享的?
                          如果是,将Service指向Master的VPN地址

                          kubectl edit endpoints kubernetes

                          将其中的内网地址修改为VPN地址

                            heming
                            是的,这应该是Endpoint Controller所控制的。

                            尝试在Master节点上找到kubelet的启动参数配置文件,如果你是使用KubeKey安装的KS,这个文件应该位于/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

                            将其中的node-ip,目前应该是该节点的内网IP,修改为其在VPN中的IP,保存该文件,并重启kubelet与docker:

                            systemctl daemon-reload
                            systemctl restart kubelet
                            systemctl restart docker

                              kevendeng 好奇怪,我改了配置后,master的节点ip也变成VPN地址了, 但是修改kubectl edit endpoints kubernetes还是会变回来, ipvs还是把10.147.20.1 映射到 master内网ip, 我也重启了所有节点,还是这样…