我正在尝试创建一个 Kubernetes
用于学习目的的集群。因此,我创建了 3 个虚拟机 Vagrant
其中主站的 IP 地址为 172.17.8.101
另外两个是172.17.8.102
和172.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=enp0s8
至FLANNEL_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-master
和kubernetes-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"
的 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
链式政策至DROP
在Iptables
版本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/