Kubernetes服务无法从EC2上的主节点访问

时间:2018-04-03 14:06:36

标签: amazon-ec2 kubernetes kubeadm

我使用kubeadm在AWS上创建了一个k8s群集,其中1个主人和1个工作人员遵循可用指南here

然后,我启动了1个ElasticSearch容器:

kubectl run elastic --image=elasticsearch:2 --replicas=1

它已在工作人员上成功部署。然后,我尝试将其作为集群上的服务公开:

kubectl expose deploy/elastic --port 9200

它成功曝光:

NAMESPACE     NAME                                                     READY     STATUS    RESTARTS   AGE
default       elastic-664569cb68-flrrz                                 1/1       Running   0          16m
kube-system   etcd-ip-172-31-140-179.ec2.internal                      1/1       Running   0          16m
kube-system   kube-apiserver-ip-172-31-140-179.ec2.internal            1/1       Running   0          16m
kube-system   kube-controller-manager-ip-172-31-140-179.ec2.internal   1/1       Running   0          16m
kube-system   kube-dns-86f4d74b45-mc24s                                3/3       Running   0          17m
kube-system   kube-flannel-ds-fjkkc                                    1/1       Running   0          16m
kube-system   kube-flannel-ds-zw4pq                                    1/1       Running   0          17m
kube-system   kube-proxy-4c8lh                                         1/1       Running   0          17m
kube-system   kube-proxy-zkfwn                                         1/1       Running   0          16m
kube-system   kube-scheduler-ip-172-31-140-179.ec2.internal            1/1       Running   0          16m

NAMESPACE     NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default       elastic      ClusterIP   10.96.141.188   <none>        9200/TCP        16m
default       kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP         17m
kube-system   kube-dns     ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP   17m

NAMESPACE     NAME              DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR                   AGE
kube-system   kube-flannel-ds   2         2         2         2            2           beta.kubernetes.io/arch=amd64   17m
kube-system   kube-proxy        2         2         2         2            2           <none>                          17m

NAMESPACE     NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
default       elastic    1         1         1            1           16m
kube-system   kube-dns   1         1         1            1           17m

NAMESPACE     NAME                  DESIRED   CURRENT   READY     AGE
default       elastic-664569cb68    1         1         1         16m
kube-system   kube-dns-86f4d74b45   1         1         1         17m

但是,当我尝试执行curl到http://10.96.141.188:9200(来自主节点)时,我得到超时,并且所有内容都表明无法从主节点访问生成的群集IP。它只在工作节点上工作。

我尝试了所有我能找到的东西:

向iptables添加一堆规则

iptables -P FORWARD ACCEPT
iptables -I FORWARD 1 -i cni0 -j ACCEPT -m comment --comment "flannel subnet"
iptables -I FORWARD 1 -o cni0 -j ACCEPT -m comment --comment "flannel subnet"
iptables -t nat -A POSTROUTING -s 10.244.0.0/16 ! -d 10.244.0.0/16 -j MASQUERADE
  • 禁用firewalld
  • 启用ec2安全策略上的所有端口(来自任何地方)
  • 使用不同的泊坞窗版本(1.13.1,17.03,17.06,17.12)
  • 不同的k8s版本(1.9.0~1.9.6)
  • 不同的CNI(法兰绒和编织)
  • 向kubeadm init命令添加一些参数( - 带有FQDN的--node-name和带有公共主IP的--apiserver-advertise-address)

但这一切都没有奏效。它似乎是AWS上的一个特定问题,因为教程指南在Linux Academy Cloud Server上运行良好。

还有什么我可以尝试的吗?

观测值: 目前,我在Centos7上使用docker 1.13和k8s 1.9.6(带法兰绒0.9.1)。

2 个答案:

答案 0 :(得分:1)

我终于找到了问题。根据{{​​3}},Flannel需要在Master和Worker节点上打开UDP 8285和8472端口。有趣的是,官方的kubeadm文档中没有提到这一点。

答案 1 :(得分:0)

  

kubectl run elastic --image=elasticsearch:2 --replicas=1

我可以告诉你,你没有通知kubernetes elasticsearch:2图像监听任何端口,它不会自己推断。如果您只是在docker下运行该图片而没有同样指定--publish--publish-all选项,则会遇到同样的问题。

因此,当ClusterIP尝试将流量从端口9200转发到匹配其选择器的Pod时,这些数据包会落入/dev/null,因为容器没有监听它们。 / p>

  

向iptables添加一堆规则

绝对不要那样做;如果你观察到,已经有大量由kube-proxy管理的iptables规则:事实上,它的主要工作就是拥有运行它的Node上的iptables规则。您的规则只会混淆kube-proxy以及跟在您后面的任何人,试图找出这些随机规则的来源。如果您尚未将它们永久化,则可以撤消它们,也可以重新启动计算机以刷新这些表。保留您的临时规则将使您的故障排除过程变得更加轻松。