【问题标题】:Kubernetes PODs not accessible within the cluster集群内无法访问 Kubernetes POD
【发布时间】:2020-09-10 15:39:21
【问题描述】:

我尝试在笔记本电脑上安装Kuberneteskubeadm 的3 台虚拟机上安装Debian 操作系统,一台作为主节点,另外两台作为工作节点。我完全按照kubernetes.io 上的教程建议的那样做。我使用命令kubeadm init --pod-network-cidr=10.244.0.0/16 初始化集群,并使用相应的kube join 命令加入工作人员。我使用命令kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 安装了Flannel 作为网络覆盖。

命令kubectl get nodes 的响应看起来不错:

NAME        STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE
k8smaster   Ready    master   20h   v1.18.3   192.168.1.100   <none>        Debian GNU/Linux 10 (buster)   4.19.0-9-amd64   docker://19.3.9
k8snode1    Ready    <none>   20h   v1.18.3   192.168.1.101   <none>        Debian GNU/Linux 10 (buster)   4.19.0-9-amd64   docker://19.3.9
k8snode2    Ready    <none>   20h   v1.18.3   192.168.1.102   <none>        Debian GNU/Linux 10 (buster)   4.19.0-9-amd64   docker://19.3.9

命令kubectl get pods --all-namespaces的响应没有显示任何错误:

NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
kube-system   coredns-66bff467f8-7hlnp             1/1     Running   9          20h    10.244.0.22     k8smaster   <none>           <none>
kube-system   coredns-66bff467f8-wmvx4             1/1     Running   11         20h    10.244.0.23     k8smaster   <none>           <none>
kube-system   etcd-k8smaster                      1/1     Running   11         20h    192.168.1.100   k8smaster   <none>           <none>
kube-system   kube-apiserver-k8smaster            1/1     Running   9          20h    192.168.1.100   k8smaster   <none>           <none>
kube-system   kube-controller-manager-k8smaster   1/1     Running   11         20h    192.168.1.100   k8smaster   <none>           <none>
kube-system   kube-flannel-ds-amd64-9c5rr          1/1     Running   17         20h    192.168.1.102   k8snode2    <none>           <none>
kube-system   kube-flannel-ds-amd64-klw2p          1/1     Running   21         20h    192.168.1.101   k8snode1    <none>           <none>
kube-system   kube-flannel-ds-amd64-x7vm7          1/1     Running   11         20h    192.168.1.100   k8smaster   <none>           <none>
kube-system   kube-proxy-jdfzg                    1/1     Running   11         19h    192.168.1.101   k8snode1    <none>           <none>
kube-system   kube-proxy-lcdvb                    1/1     Running   6          19h    192.168.1.102   k8snode2    <none>           <none>
kube-system   kube-proxy-w6jmf                    1/1     Running   11         20h    192.168.1.100   k8smaster   <none>           <none>
kube-system   kube-scheduler-k8smaster            1/1     Running   10         20h    192.168.1.100   k8smaster   <none>           <none>

然后我尝试使用命令kubectl apply -f podexample.yml 创建一个POD,其内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: example 
spec:
  containers:
  - name: nginx 
    image: nginx

命令kubectl get pods -o wide显示POD是在worker node1上创建的,处于Running状态。

NAME      READY   STATUS    RESTARTS   AGE    IP            NODE       NOMINATED NODE   READINESS GATES
example   1/1     Running   0          135m   10.244.1.14   k8snode1   <none>           <none>

问题是,当我尝试使用curl -I 10.244.1.14 命令连接到 pod 时,我在主节点中得到以下响应:

curl: (7) Failed to connect to 10.244.1.14 port 80: Connection timed out

但工作节点 1 上的相同命令成功响应:

HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Sat, 23 May 2020 19:45:05 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes

我想这可能是因为 kube-proxy 没有在主节点上运行,但命令 ps aux | grep kube-proxy 显示它正在运行。

root     16747  0.0  1.6 140412 33024 ?        Ssl  13:18   0:04 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=k8smaster

然后我使用命令 ip route 检查内核路由表,它显示发往 10.244.1.0/244 的数据包被路由到 flannel。

default via 192.168.1.1 dev enp0s3 onlink 
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1 
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 
169.254.0.0/16 dev enp0s3 scope link metric 1000 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.100 

对我来说一切都很好,我不知道我还应该检查什么以查看问题所在。我错过了什么吗?

更新1:

如果我在工作节点 1 上启动一个 NGINX 容器并将其 80 端口映射到工作节点 1 主机的端口 80,那么我可以从主节点通过命令 curl -I 192.168.1.101 连接到它。另外,我没有添加任何 iptable 规则,并且机器上没有安装像 UFW 这样的防火墙守护进程。所以,我认为这不是防火墙问题。

更新2:

我重新创建了集群并使用canal而不是flannel,仍然没有运气。

更新3:

我使用以下命令查看了运河和法兰绒日志,一切似乎都很好:

kubectl logs -n kube-system canal-c4wtk calico-node
kubectl logs -n kube-system canal-c4wtk kube-flannel
kubectl logs -n kube-system canal-b2fkh calico-node
kubectl logs -n kube-system canal-b2fkh kube-flannel 

更新4:

为了完整起见,here are the logs of mentioned containers

更新5:

我尝试安装特定版本的 kubernetes 组件和 docker,以检查是否存在与以下命令的版本不匹配相关的问题:

sudo apt-get install docker-ce=18.06.1~ce~3-0~debian
sudo apt-get install -y kubelet=1.12.2-00 kubeadm=1.12.2-00 kubectl=1.12.2-00 kubernetes-cni=0.6.0-00
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml

但没有任何改变。

我什至更新了所有节点上的文件 /etc/bash.bashrc 以清除所有代理设置,以确保它与代理无关:

export HTTP_PROXY=
export http_proxy=
export NO_PROXY=127.0.0.0/8,192.168.0.0/16,172.0.0.0/8,10.0.0.0/8

并且还在所有节点上的docker systemd文件/lib/systemd/system/docker.service中添加了以下环境:

Environment="HTTP_PROXY="
Environment="NO_PROXY="

然后重新启动所有节点,当我登录时,仍然得到curl: (7) Failed to connect to 10.244.1.12 port 80: Connection timed out

更新6:

i 事件试图在CentOS 机器中设置集群。认为可能与Debian 有关。我还停止并禁用了firewalld,以确保防火墙没有引起问题,但我又得到了完全相同的结果:Failed to connect to 10.244.1.2 port 80: Connection timed out

现在我唯一怀疑的是,这可能是因为VirtualBox 和虚拟机网络配置?虚拟机连接到连接到我的无线网络接口的Bridge Adapter

更新7:

我进入创建的 POD,发现 POD 内部没有互联网连接。因此,我从 NGINX 图像创建了另一个 POD,该图像具有 curlwgetpingtraceroute 等命令,并尝试 curl https://www.google.com -I 并得到结果:curl: (6) Could not resolve host: www.google.com。我查看了/etc/resolv.conf文件,发现POD里面的DNS服务器地址是10.96.0.10。将 DNS 更改为 8.8.8.8 仍然是 curl https://www.google.com -I 导致 curl: (6) Could not resolve host: www.google.com。尝试 ping 8.8.8.8,结果是 56 packets transmitted, 0 received, 100% packet loss, time 365ms。最后一步我尝试了traceroute 8.8.8.8 并得到以下结果:

 1  10.244.1.1 (10.244.1.1)  0.116 ms  0.056 ms  0.052 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

我不知道 POD 中没有互联网连接这一事实与我无法从部署 POD 的节点以外的节点连接到集群内的 POD 的问题有任何关系。

【问题讨论】:

  • 我记得一年前就遇到过这个问题,我把它从法兰绒改成运河解决了这个问题,也许可以试试
  • 检查工作节点上是否有防火墙,以及它们是否接受来自您节点的流量。
  • @BurakSerdar 如果我通过 docker 在工作节点 1 上启动 nginx 容器并将工作节点 1 的端口 80 映射到创建容器的端口 80,我可以从主节点连接到工作节点 1 上的 nginx curl -I 192.168.1.101。所以,我认为这与防火墙无关。我也没有使用iptables 设置任何防火墙规则,并且机器上没有安装UFW
  • 我在 gcp 上使用 calico CNI 的 kubeadm 集群遇到了完全相同的行为。解决我的问题的方法是将 iptables 设置为 legacy(有时建议用于 Debian):sudo update-alternatives --set iptables /usr/sbin/iptables-legacysudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy。之后我再次部署了 calico 并重新启动了所有服务器。我仍然不知道为什么这解决了这个问题。您可以尝试测试一下吗?同时我会尝试在virtualbox中重现这个错误。
  • @acid_fuji OMG,这个命令sudo update-alternatives --set iptables /usr/sbin/iptables-legacy 解决了这个问题。谢啦。请发布答案,我会将其标记为已接受。

标签: kubernetes


【解决方案1】:

Debian 系统使用nftables 作为iptables 后端,这与 Kubernetes 网络设置不兼容。因此,您必须使用以下命令将其设置为使用 iptables-legacy 而不是 nftables:

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy 
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

【讨论】:

  • 似乎内核中有两组用于包过滤的模块:ip_tablesnf_tables。直到最近iptables 还在使用ip_tables 模块,但在iptables 1.8 中,他们已弃用ip_tables 并在后台使用nf_tables。当 iptables 1.6iptables 1.8 在同一主机上以某种方式被调用时,就会出现此问题。
猜你喜欢
  • 2021-05-03
  • 2021-08-08
  • 2023-03-09
  • 2022-08-12
  • 2022-01-26
  • 2020-06-10
  • 2019-02-24
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多