我正在评估 Kubernetes 并按照本教程在 CentOS 7.2 机器和 VMware VM 上安装它。我的环境有一个 Docker Registry、一个 Etcd 服务器、一个 Kube Master 和两个 Kube Nodes。多亏了 Flannel 和优秀的 Kubernetes 文档和论文,每一次交流都像魅力一样。一个例外:一个 Node 与服务的 clusterIP 之间的通信。
关于我的环境的一些信息:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE NODE
nginx-a2klb 1/1 Running 2 1d 10.200.81.54
$ kubectl get pods/nginx-a2klb -o yaml | grep podIP
podIP: 10.252.54.2
$ kubectl get svc/nginx -o yaml | grep clusterIP
clusterIP: 10.254.0.7
尝试来自10.200.81.54
(pod 的节点)的通信:
$ curl http://10.254.0.7
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
从10.200.81.53
(另一个节点):
$ curl http://10.252.54.2 # podIP
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
$ curl http://10.254.0.7 # clusterIP
curl: (7) Failed connect to 10.254.0.7:80; Connection timed out
长话短说:在容器内部,通信始终有效,来自同一个节点或来自其他节点。使用 podIP 通信也始终有效。ExternalIP 或 NodePort 始终有效,即使在集群外部也是如此。使用 clusterIP 通信只能从运行唯一 pod 的同一 VM 进行,其他节点或 Kube Master 失败。这种行为是预期的吗?我能做些什么来分析和解决这个问题?
更新1
- Master 和 Nodes 使用 systemd 仅运行
kubelet
- 其他服务(
proxy
,apiserver
,scheduler
等)通过以下方式在特权容器中运行hyperkube
- 链接到有关我如何配置主节点和每个节点的详细信息
更新2
相关部分iptables
(请注意,自第一篇文章以来,pod 和服务 IP 发生了变化):
-A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 10.252.36.0/24 ! -o docker0 -j MASQUERADE
-A POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4d415351 -j MASQUERADE
-A KUBE-SEP-722QG7UQNTPWDFBY -s 10.200.81.52/32 -m comment --comment "default/kubernetes:" -j MARK --set-xmark 0x4d415351/0xffffffff
-A KUBE-SEP-722QG7UQNTPWDFBY -p tcp -m comment --comment "default/kubernetes:" -m tcp -j DNAT --to-destination 10.200.81.52:443
-A KUBE-SEP-7F6QLYX4EVXMHVGW -s 10.252.45.6/32 -m comment --comment "default/ng:" -j MARK --set-xmark 0x4d415351/0xffffffff
-A KUBE-SEP-7F6QLYX4EVXMHVGW -p tcp -m comment --comment "default/ng:" -m tcp -j DNAT --to-destination 10.252.45.6:80
-A KUBE-SEP-SFIQGU7OZTZRBGQ6 -s 10.252.45.2/32 -m comment --comment "kube-system/kube-dns:dns" -j MARK --set-xmark 0x4d415351/0xffffffff
-A KUBE-SEP-SFIQGU7OZTZRBGQ6 -p udp -m comment --comment "kube-system/kube-dns:dns" -m udp -j DNAT --to-destination 10.252.45.2:53
-A KUBE-SEP-WT6RQUWXRXGAUOJF -s 10.252.45.2/32 -m comment --comment "kube-system/kube-dns:dns-tcp" -j MARK --set-xmark 0x4d415351/0xffffffff
-A KUBE-SEP-WT6RQUWXRXGAUOJF -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp" -m tcp -j DNAT --to-destination 10.252.45.2:53
-A KUBE-SERVICES -d 10.254.0.114/32 -p tcp -m comment --comment "default/ng: cluster IP" -m tcp --dport 80 -j KUBE-SVC-LYRG26ZZO4GOQOI3
-A KUBE-SERVICES -d 10.254.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
-A KUBE-SERVICES -d 10.254.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4
-A KUBE-SERVICES -d 10.254.0.1/32 -p tcp -m comment --comment "default/kubernetes: cluster IP" -m tcp --dport 443 -j KUBE-SVC-6N4SJQIF3IX3FORG
-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS
-A KUBE-SVC-6N4SJQIF3IX3FORG -m comment --comment "default/kubernetes:" -j KUBE-SEP-722QG7UQNTPWDFBY
-A KUBE-SVC-ERIFXISQEP7F7OF4 -m comment --comment "kube-system/kube-dns:dns-tcp" -j KUBE-SEP-WT6RQUWXRXGAUOJF
-A KUBE-SVC-LYRG26ZZO4GOQOI3 -m comment --comment "default/ng:" -j KUBE-SEP-7F6QLYX4EVXMHVGW
-A KUBE-SVC-TCOU7JCQXEZGVUNU -m comment --comment "kube-system/kube-dns:dns" -j KUBE-SEP-SFIQGU7OZTZRBGQ6
我已经解决了这个问题,添加了一条路线:
ip route add 10.254.0.0/24 dev flannel.1
10.254.0.0/24
是我的--service-cluster-ip-range
。这是有效的,但对我来说,这听起来比真正的修复更幸运。我还可以在集群中检查、测试或改进什么?