所以我有一个kubernets集群启动并运行使用Kubernetes on CoreOS Manual Installation Guide。kubernetes服务IP无法访问
$ kubectl get no
NAME STATUS AGE
coreos-master-1 Ready,SchedulingDisabled 1h
coreos-worker-1 Ready 54m
$ kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
etcd-2 Healthy {"health": "true"}
etcd-1 Healthy {"health": "true"}
$ kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default curl-2421989462-h0dr7 1/1 Running 1 53m 10.2.26.4 coreos-worker-1
kube-system busybox 1/1 Running 0 55m 10.2.26.3 coreos-worker-1
kube-system kube-apiserver-coreos-master-1 1/1 Running 0 1h 192.168.0.200 coreos-master-1
kube-system kube-controller-manager-coreos-master-1 1/1 Running 0 1h 192.168.0.200 coreos-master-1
kube-system kube-proxy-coreos-master-1 1/1 Running 0 1h 192.168.0.200 coreos-master-1
kube-system kube-proxy-coreos-worker-1 1/1 Running 0 58m 192.168.0.204 coreos-worker-1
kube-system kube-scheduler-coreos-master-1 1/1 Running 0 1h 192.168.0.200 coreos-master-1
$ kubectl get svc --all-namespaces
NAMESPACE NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes 10.3.0.1 <none> 443/TCP 1h
与指导,我设置一个服务网络10.3.0.0/16
和吊舱网络10.2.0.0/16
。 Pod网络看起来很好,因为busybox和curl容器获得IP。但服务网络存在问题。起初,我在部署kube-dns
时遇到过这种情况:无法访问服务IP 10.3.0.1
,因此kube-dns无法启动所有容器,并且DNS最终无法运行。
来自卷边吊舱内,我可以重现该问题:
[ [email protected]:/ ]$ curl https://10.3.0.1
curl: (7) Failed to connect to 10.3.0.1 port 443: No route to host
[ [email protected]:/ ]$ ip route
default via 10.2.26.1 dev eth0
10.2.0.0/16 via 10.2.26.1 dev eth0
10.2.26.0/24 dev eth0 src 10.2.26.4
这似乎确定,有只有在容器中的缺省路由。据我了解,请求(到默认路由)应该由工作者节点上的kube-proxy
拦截,转发给主节点上的代理,IP通过iptables转换为主节点公共IP。
似乎有与桥/ netfilter的sysctl的设置一个共同的问题,但似乎在我的设置罚款:
[email protected] ~ $ sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1
我有一个真正艰难的时间来解决,因为我缺乏理解服务IP用于什么,服务网络如何按照流量工作以及如何最好地进行调试。
所以我这里还有我有问题:
- 是什么(在这种情况下10.3.0.1)的服务网络的第一个IP用来做什么?
- 以上描述的交通流量是否正确?如果不是,容器要达到服务IP需要采取哪些步骤?
- 调试流量中每一步的最佳方法是什么? (我不明白日志里有什么不对)
谢谢!
感谢您的描述,它帮助我调试和解决问题!如前所述,日志显示没有什么特别的(基本上它报告了添加的iptables规则)。所以我检查了iptabels -j LOG语句,如果DNAT正在工作,并且如果答复也到达了他们所做的,那么我就结束了一个本地的forwading-conatiner问题。看看节点路由表,我看到'docker0'和'cni0'有相同的子网。检查指南,我错过了'docker_opts_cni.env'部分。纠正后,'docker0'有另一个子网,一切都开始运作。谢谢! – grasbueschel
做好调试吧!我的回答有点难以理解..我在手机上编写了它。对不起:) –