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

时间:2018-12-04 21:48:15

标签: docker kubernetes flannel

我正在尝试创建一个Kubernetes集群以供学习。因此,我用Vagrant创建了3个虚拟机,其中主服务器的IP地址为172.17.8.101,另外两个是172.17.8.102172.17.8.103

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

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

要启用ip masquerading并在虚拟机中也使用专用网络接口,我在--ip-masq --iface=enp0s8文件的FLANNEL_OPTIONS中添加了/etc/sysconfig/flannel

为了使Docker使用Flannel网络,我在--bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}'文件的OPTIONS变量中添加了/etc/sysconfig/docker。请注意,FLANNEL_SUBNETFLANNEL_MTU变量的值是Flannel文件中/run/flannel/subnet.env设置的值。

所有这些设置之后,我在主节点上安装了kubernetes-masterkubernetes-client,在所有节点上安装了kubernetes-node。对于最终配置,我将KUBE_SERVICE_ADDRESSES文件中的/etc/kubernetes/apiserver值更改为--service-cluster-ip-range=10.33.0.0/16  和KUBELET_API_SERVER文件中的/etc/kubernetes/kubelet值复制到--api-servers=http://172.17.8.101:8080

这是带有完整文件的k8s-tutorial project存储库的链接。

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

命令kubectl describe 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.

挑战在于,当我尝试使用curl 10.33.79.222:8000连接到创建的服务时,会得到curl: (7) Failed connect to 10.33.72.2:8000; Connection refused,但是如果尝试curl 10.33.72.2:80,则会得到默认的nginx页面。另外,我无法ping 10.33.79.222,所有数据包都丢失了。

有人建议停止并禁用Firewalld,但是它根本不在节点上运行。在版本1.13之后,DockerFORWARD中将DROP链策略更改为Iptables时,我将其更改回ACCEPT,但也无济于事。我最终尝试更改CIDR并使用其他IP /子网,但没有运气。

有人知道我要去哪里哪里或如何找出我无法连接到所创建服务的问题吗?

2 个答案:

答案 0 :(得分:2)

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

法兰绒网络:'{"Network": "10.33.0.0/16"}'。然后在kube-apiserver --service-cluster-ip-range=10.33.0.0/16上。该范围相同,应该有所不同,因此您需要为10.33.0.0/16设置kube-proxy,然后您的叠加层认为它需要路由到在10.33.0.0/16上运行的Pod。首先,请为您的广告连播和服务选择完全不重叠的Cidrs。

例如,在我的集群上(我正在使用Calico),我的podCidr为192.168.0.0/16,服务的Cidr为10.96.0.0/12

注意:由于在这种情况下不允许使用ICMP,因此您将无法ping 10.33.79.222

答案 1 :(得分:0)

您的服务属于ClusterIP类型,这意味着该服务只能由其他Kubernetes容器访问。要实现您要尝试执行的操作,请考虑切换到NodePort类型的服务。然后,您可以使用命令curl <Kubernetes-IP-address>:<exposedServicePort>

连接到它

有关使用NodePort的示例,请参见https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/