Docker 尝试连接到Kubernetes中的服务时,连接被拒绝

Docker 尝试连接到Kubernetes中的服务时,连接被拒绝,docker,kubernetes,flannel,Docker,Kubernetes,Flannel,我正在尝试创建一个Kubernetes集群,用于学习目的。因此,我用Vagrant创建了3个虚拟机,其中主机的IP地址为172.17.8.101,另外两个是172.17.8.102和172.17.8.103 很明显,我们需要法兰绒,以便不同机器中的容器可以相互连接,而无需端口映射。为了Flannel工作,我们需要Etcd,因为Flannel使用这个数据存储来放置和获取数据 我在主节点上安装了Etcd,并使用命令etcdctl set/coreos.com/network/config'{“net

我正在尝试创建一个
Kubernetes
集群,用于学习目的。因此,我用
Vagrant
创建了3个虚拟机,其中主机的IP地址为
172.17.8.101
,另外两个是
172.17.8.102
172.17.8.103

很明显,我们需要
法兰绒
,以便不同机器中的容器可以相互连接,而无需端口映射。为了
Flannel
工作,我们需要
Etcd
,因为Flannel使用这个
数据存储
来放置和获取数据

我在主节点上安装了
Etcd
,并使用命令
etcdctl set/coreos.com/network/config'{“network”:“10.33.0.0/16”}将
Flannel
网络地址放在主节点上

为了启用
ip伪装
并在虚拟机中使用专用网络接口,我在
/etc/sysconfig/FLANNEL
文件中将
--ip masq--iface=enp0s8
添加到
FLANNEL\u选项

为了使
Docker
使用
Flannel
网络,我在
/etc/sysconfig/Docker
文件中添加了
-bip=${Flannel\u SUBNET}--mtu=${Flannel\u mtu}'
选项
变量。请注意,
FLANNEL\u SUBNET
FLANNEL\u MTU
变量的值是由
/run/FLANNEL/SUBNET.env
文件中的
FLANNEL
设置的值

在所有这些设置之后,我在主节点上安装了
kubernetes主节点
kubernetes客户端
,并在所有节点上安装了
kubernetes节点
。对于最终的配置,我将
/etc/kubernetes/apiserver
文件中的
KUBE\u服务\u地址
值更改为
--服务集群ip范围=10.33.0.0/16
以及
/etc/kubernetes/KUBELET
文件中的
KUBELET\u API\u服务器
值到
--API服务器=http://172.17.8.101:8080

这是指向包含完整文件的存储库的链接

在所有这些努力之后,所有服务都成功启动并正常工作。很明显,当我使用命令
kubectl get nodes
时,有3个节点正在运行。我可以使用命令
kubectl运行nginx pod--image=nginx--port=80--labels=“app=nginx”
成功创建一个
nginx
pod,并使用
kubectl expose pod nginx pod--port=8000--target port=80--name=“service pod”
命令创建一个服务

命令
kubectl description service-service-pod
输出以下结果:

Name:           service-pod
Namespace:      default
Labels:         app=nginx
Selector:       app=nginx
Type:           ClusterIP
IP:             10.33.39.222
Port:           <unset> 8000/TCP
Endpoints:      10.33.72.2:80
Session Affinity:   None
No events.
名称:服务舱
名称空间:默认值
标签:app=nginx
选择器:app=nginx
类型:集群
IP:10.33.39.222
端口:8000/TCP
终点:10.33.72.2:80
会话关联:无
没有事件。
挑战在于,当我尝试使用
curl 10.33.79.222:8000连接到创建的服务时,我得到
curl:(7)连接到10.33.72.2:8000失败;连接被拒绝
但是如果我尝试
curl 10.33.72.2:80
我会得到默认的
nginx
页面。此外,我无法ping到
10.33.79.222
,所有数据包都丢失了

一些人建议停止并禁用
防火墙,但它根本没有在节点上运行。由于
Docker
Iptables
版本1.13后将
转发
链策略更改为
DROP
,我将其更改回
ACCEPT
,但也没有帮助。我最终尝试更改
CIDR
,并使用不同的IP/子网,但没有成功


有人知道我哪里出错了,或者如何找出我无法连接到创建的服务的问题吗?

您的服务属于ClusterIP类型,这意味着它只能由其他Kubernetes吊舱访问。为了实现您正在尝试做的事情,考虑切换到类型NoDePoT的服务。然后可以使用命令
curl:


有关使用NodePort的示例,请参见。

我能看到的唯一冲突是您用于服务的PodCidr与Cidr

法兰绒网络:
'{“网络”:“10.33.0.0/16”}'
。然后在kube apiserver上--service cluster ip range=10.33.0.0/16
。这是相同的范围,应该有所不同,因此您可以让kube代理为
10.33.0.0/16
设置服务,然后让覆盖层认为它需要路由到运行在
10.33.0.0/16
上的吊舱。首先,我会为您的豆荚和服务选择一种完全不重叠的苹果酒

例如,在我的集群上(我使用的是印花布),我的podCidr为
192.168.0.0/16
,服务Cidr为
10.96.0.0/12


注意:您将无法ping
10.33.79.222
,因为在这种情况下不允许ICMP。

我相信他是从主机连接的,因为他可以连接到:
10.33.72.2:80
非常感谢@Rico您是对的。将
--服务群集ip范围
更改为
10.34.0.0/16
后,问题得到解决,现在我可以从群集中的所有节点向创建的服务发送请求。但是,如果服务的ip不在
Flannel
网络中,我无法理解如何将请求路由到服务。因为我认为是法兰绒覆盖网络使得这种连接成为可能。