无法访问 kubernetes 服务 IP

kubernetes service IPs not reachable

所以我已经建立了一个 Kubernetes 集群,运行 使用 Kubernetes on CoreOS Manual Installation Guide

$ 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 和一个 pod 网络 10.2.0.0/16。 Pod 网络似乎很好,因为 busybox 和 curl 容器获得了 IP。但服务网络存在问题。原来在部署的时候遇到过kube-dns:服务IP10.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 转换到主节点 public IP.

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

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

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

所以这是我的问题:

谢谢!

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

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

每个 network/cluster 设置的故障排除都不同。我通常会检查:

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

如果你留下评论我会回复你..

我遇到了同样的问题,原来是 kube-proxy.yaml 中的配置问题 对于 "master" 参数,我的 IP 地址与 - --master=192.168.3.240 中的一样,但是它实际上需要是一个 url 像 - --master=https://192.168.3.240

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

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

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

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