kubernetes服务IP无法访问

时间:2017-03-09 21:08:26

标签: kubernetes coreos

所以我使用Kubernetes on CoreOS Manual Installation Guide启动并运行了kubernets集群。

$ 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最终无法正常工作。

从curl pod中,我可以重现这个问题:

[ root@curl-2421989462-h0dr7:/ ]$ curl https://10.3.0.1
curl: (7) Failed to connect to 10.3.0.1 port 443: No route to host

[ root@curl-2421989462-h0dr7:/ ]$ 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。 / p>

网桥/ netfilter sysctl设置似乎存在一个常见问题,但在我的设置中似乎没问题:

core@coreos-worker-1 ~ $ sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1

我真的很难排除故障,因为我不了解服务IP的用途,服务网络应如何在流量方面工作以及如何最好地调试。

所以这就是我的问题:

  • 服务网络的第一个IP(本例中为10.3.0.1)用于什么?
  • 以上对交通流量的描述是否正确?如果没有,容器到达服务IP需要采取哪些步骤?
  • 调试流量中每个步骤的最佳方法是什么? (我不知道日志中有什么问题)

谢谢!

3 个答案:

答案 0 :(得分:6)

服务网络为服务提供固定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。在您的设置中,它被部署为由/etc/kubernetes/manifests/kube-proxy.yaml
  • 自己创建的kubelet创建的静态Pod
  • 找到kube-proxy的日志并找到线索(你可以发帖吗?)
  • 将kube-proxy更改为userspace模式。同样,细节取决于您的设置。对你来说,它在我上面提到的文件中。在每个节点
  • 上附加--proxy-mode=userspace作为参数
  • 覆盖(pod)网络是否正常运行?

如果你发表评论,我会回复你。

答案 1 :(得分:2)

我有同样的问题,结果是kube-proxy.yaml中的配置问题对于&#34; master&#34;参数我的IP地址为 - --master = 192.168.3.240,但实际上它必须是一个网址 - --master = https://192.168.3.240

仅供参考我的kube-proxy成功使用--proxy-mode = iptables(v1.6.x)

答案 2 :(得分:2)

我遇到了同样的问题,对我有用的最终解决方案是在群集中的所有节点上启用IP转发,这是我忽略的。

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

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