无法访问 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 的用途、服务网络在流量方面应该如何工作以及如何最好地调试它。
所以这是我的问题:
- 服务网络(本例中为 10.3.0.1)的第一个 IP 是做什么用的?
- 以上交通流的描述是否正确?如果不是,容器到达服务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 随后立即开始工作。
所以我已经建立了一个 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 的用途、服务网络在流量方面应该如何工作以及如何最好地调试它。
所以这是我的问题:
- 服务网络(本例中为 10.3.0.1)的第一个 IP 是做什么用的?
- 以上交通流的描述是否正确?如果不是,容器到达服务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 随后立即开始工作。