2017-03-09 174 views
2

所以我有一个kubernets集群启动并运行使用Kubernetes on CoreOS Manual Installation Guidekubernetes服务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需要采取哪些步骤?
  • 调试流量中每一步的最佳方法是什么? (我不明白日志里有什么不对)

谢谢!

回答

4

服务网络为服务提供固定IP。它不是一个可路由的网络(因此不要指望ip ro显示任何内容,也不会ping工作),而是在每个节点上由kube-proxy管理的集合iptables规则(请参阅节点上的iptables -L; iptables -t nat -L,而不是Pods)。这些virtual IPs(请参阅图片!)充当端点(kubectl get ep)的负载均衡代理,它们通常是Pod(但不总是)端口的端口,并带有服务中定义的特定标签集。

服务网络上的第一个IP用于到达kube-apiserver本身。它正在监听端口443(kubectl describe svc kubernetes)。

故障排除在每个网络/群集设置上有所不同。我通常会检查:

  • kube-proxy是否在每个节点上运行?在某些设置中,它通过systemd运行,在其他设备上有一个DeamonSet,用于在每个节点上调度Pod。在你的设置上,它被部署为由kubelets自己创建的静态荚从/etc/kubernetes/manifests/kube-proxy.yaml
  • 找到kube-proxy的日志并找到线索(你可以发布一些?)
  • 将kube-proxy更改为userspace模式。同样,细节取决于您的设置。对你来说,它在我上面提到的文件中。在每个节点上追加--proxy-mode=userspace作为参数
  • 覆盖(pod)网络是否正常工作?

如果你留言我会尽快给你..

+0

感谢您的描述,它帮助我调试和解决问题!如前所述,日志显示没有什么特别的(基本上它报告了添加的iptables规则)。所以我检查了iptabels -j LOG语句,如果DNAT正在工作,并且如果答复也到达了他们所做的,那么我就结束了一个本地的forwading-conatiner问题。看看节点路由表,我看到'docker0'和'cni0'有相同的子网。检查指南,我错过了'docker_opts_cni.env'部分。纠正后,'docker0'有另一个子网,一切都开始运作。谢谢! – grasbueschel

+0

做好调试吧!我的回答有点难以理解..我在手机上编写了它。对不起:) –

1

我有同样的问题,竟然是在KUBE-proxy.yaml配置问题对于“大师”的参数我有ip地址在 - --master = 192.168.3.240,但它实际上需要是一个url像 - --master = https://192.168.3.240

FYI我的kube代理成功地使用--proxy-mode = iptables(v1.6。 x)

1

我有这个相同的问题,最终的解决方案,我工作是在所有节点上启用IP转发我忽略了这一点。

$ sudo sysctl net.ipv4.ip_forward=1 
net.ipv4.ip_forward = 1 

服务IP和DNS在之后立即开始工作。