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

Amazon ec2 无法从EC2上的主节点访问Kubernetes服务,amazon-ec2,kubernetes,kubeadm,Amazon Ec2,Kubernetes,Kubeadm,我使用kubeadm在AWS上创建了一个k8s集群,其中一个主集群和一个工作集群遵循可用的指南 然后,我启动了1个ElasticSearch容器: kubectl run elastic --image=elasticsearch:2 --replicas=1 并在worker上成功部署。然后,我尝试将其作为集群上的服务公开: kubectl expose deploy/elastic --port 9200 并成功曝光: NAMESPACE NAME

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

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

kubectl run elastic --image=elasticsearch:2 --replicas=1
并在worker上成功部署。然后,我尝试将其作为集群上的服务公开:

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
  • 禁用防火墙
  • 启用ec2安全策略上的所有端口(从任何地方)
  • 使用不同的docker版本(1.13.1、17.03、17.06、17.12)
  • 不同的k8s版本(1.9.0~1.9.6)
  • 不同CNI(法兰绒和编织)
  • 向kubeadm init命令中添加一些参数(--FQDN为节点名,公用主IP为--apiserver播发地址)
但这些都不起作用。这似乎是AWS上的一个特定问题,因为教程指南在LinuxAcademy云服务器上运行良好

还有什么我可以试试的吗

Obs: 目前,我在Centos7上使用docker 1.13和k8s 1.9.6(带有法兰绒0.9.1)

kubectl运行弹性--image=elasticsearch:2--副本=1

据我所知,您没有通知kubernetes,
elasticsearch:2
图像侦听任何端口,它不会自行推断。如果您只是在
docker
下运行该图像,而没有类似地指定
--publish
--publish all
选项,则会遇到相同的问题

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

向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

绝对不要那样做;如果您观察到,已经有大量iptables规则由
kube proxy
管理:事实上,它的主要任务是在运行它的节点上拥有iptables规则。你的规则只会让kube代理和任何跟在你后面试图找出这些随机规则来源的人感到困惑。如果您还没有将它们永久化,那么可以撤消它们,或者只是重新启动计算机以刷新这些表。保留特定规则将100%不会使故障排除过程变得更简单。

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

在第二步(服务创建)中分配端口。它正在工作,我可以从worker节点成功地卷曲到10.96.141.188:9200。但是关于iptables,你是绝对正确的!在第二步(服务创建)分配端口是的,我知道服务端口已分配,但
服务
端口是
集群
的合同,集装箱端口是
Pod
与其集装箱之间的合同。它们可以,而且在我的集群中绝对不同,因为它们代表着对集群中其他成员的不同程度的长期承诺。