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

标签 docker kubernetes flannel

我正在尝试创建一个 Kubernetes用于学习目的的集群。因此,我创建了 3 个虚拟机 Vagrant其中主站的 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并且还使用虚拟机中的专用网络接口(interface),我添加了 --ip-masq --iface=enp0s8FLANNEL_OPTIONS/etc/sysconfig/flannel文件。

为了使Docker使用Flannel网络,我添加了--bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}'OPTIONS变量 /etc/sysconfig/docker文件。请注意 FLANNEL_SUBNET 的值和FLANNEL_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/16KUBELET_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" 的 pod并使用 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 ,但它根本没有在节点上运行。如Docker已更改FORWARD链式政策至DROPIptables版本1.13之后我将其改回ACCEPT但这也没有帮助。我最终尝试更改 CIDR并使用不同的IP/子网但没有运气。

有谁知道我哪里出了问题或者如何找出我无法连接到创建的服务的问题是什么?

最佳答案

我发现您唯一有冲突的是 PodCidr 与您用于服务的 Cidr。

Flannel 网络:'{"Network": "10.33.0.0/16"}'。然后在 kube-apiserver --service-cluster-ip-range=10.33.0.0/16 上。这是相同的范围,但应该有所不同,因此您的 kube-proxy 为 10.33.0.0/16 设置服务,然后您的覆盖层认为它需要路由到 上运行的 Pod >10.33.0.0/16。我首先会为您的 Pod 和服务选择一个完全不重叠的 Cidrs。

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

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

关于docker - 尝试连接 Kubernetes 中的服务时连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53621937/

相关文章:

docker - 我自己对 boot2docker 的自定义没有反射(reflect)到 iso 镜像中

docker - 如何使用docker-compose将环境变量设置到docker容器中

kubernetes - EKS 工作节点可以设置在不同的区域吗

kubernetes - 如何在没有云提供商或 LB 的情况下获取 pod 内的客户端 ip

戈兰错误: reference to undefined identifier ‘syscall.TUNSETIFF’

docker - 缩放: Docker containers vs Vms

bash - 无法启动服务应用程序:oci运行时错误-在$ PATH中找不到可执行文件

kubernetes - Kube 集群通信

kubernetes - 我在集群中运行哪个版本的 Operator Lifecycle Manager (OLM)?

docker - 在同一个 kubernetes 集群中使用 flannel 和 calico 会导致任何问题吗?