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