我可以直接从k8s节点访问K8s ClusterIP吗?

时间:2016-05-04 03:38:18

标签: kubernetes

我在ubuntu 14.04.4上使用k8s 1.2

这是关于我的一个k8s minion节点的一些信息:

# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.4 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.4 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

# uname -a
Linux k8s-010 3.19.0-47-generic #53~14.04.1-Ubuntu SMP Mon Jan 18 16:09:14 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

你看,我将linux内核升级到3.19.0-47。

这是此节点上的kube-proxy日志:

# cat /var/log/upstart/kube-proxy.log.1
I0429 17:55:11.397842     985 server.go:200] Using iptables Proxier.
I0429 17:55:11.397941     985 server.go:213] Tearing down userspace rules.
I0429 17:55:12.408962     985 conntrack.go:36] Setting nf_conntrack_max to 262144
I0429 17:55:12.409050     985 conntrack.go:41] Setting conntrack hashsize to 65536
I0429 17:55:12.409288     985 conntrack.go:46] Setting nf_conntrack_tcp_timeout_established to 86400

我的k8s上有一些CLusetIp:

$ kubectl --namespace=enlighten get svc
NAME      CLUSTER-IP        EXTERNAL-IP   PORT(S)     AGE
mongo     192.168.15.118    <none>        27017/TCP   1d
mysql     192.168.4.191     <none>        3306/TCP    23h
redis     192.168.193.134   <none>        6379/TCP    1d

我发现此群集中的pod可以访问此CLusterIP。 但是,如果我尝试直接从节点主机访问此clusterIP,则失败。

是WAD还是问题?

4 个答案:

答案 0 :(得分:0)

简短的回答是kube-proxy为每个服务生成IPtables规则,以便可以从主机和pod访问它。

如有疑问,请在运行kube-proxy的主机上执行iptables -t nat -n -v ,然后搜索服务的IP。如果您需要帮助,可以在此处将输出发布为评论。

答案 1 :(得分:0)

@antoine cotten

感谢您的回复。

我无法在ubuntu上执行命令,出现语法错误,但我可以使用iptables-save来转储规则。由于有很多规则,我会过滤相关性:

# iptables-save |grep -e mysql -e 192.168.4.191 -e "-A KUBE-MARK-MASQ" -e KUBE-SEP-HLHD6IM4G76NUUUM
:KUBE-SEP-HLHD6IM4G76NUUUM - [0:0]
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
-A KUBE-SEP-HLHD6IM4G76NUUUM -s 172.17.45.2/32 -m comment --comment "enlighten/mysql:" -j KUBE-MARK-MASQ
-A KUBE-SEP-HLHD6IM4G76NUUUM -p tcp -m comment --comment "enlighten/mysql:" -m tcp -j DNAT --to-destination 172.17.45.2:3306
-A KUBE-SERVICES -d 192.168.4.191/32 -p tcp -m comment --comment "enlighten/mysql: cluster IP" -m tcp --dport 3306 -j KUBE-SVC-FIZ3LEJD226YKZ4B
-A KUBE-SVC-FIZ3LEJD226YKZ4B -m comment --comment "enlighten/mysql:" -j KUBE-SEP-HLHD6IM4G76NUUUM

答案 2 :(得分:0)

如果你只是访问 clusterIp ,它就无法访问 clusterIp:service_port ,这没关系!

答案 3 :(得分:0)

这是预期的行为。群集中的网络与外部隔离。要访问群集内的服务,有一些方法需要您进行其他设置。负载平衡器,外部ip和节点端口的方式都是从服务端进行设置的。有关更多详细信息,请参阅kuberneres官方文档的服务部分。

这是我引用的内容的链接。 https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

更新:一个简单的工作流程:<script> $(function() { $.ajaxSetup({ headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') } }); }); </script> 如果要从节点(主节点)进行访问。

相关问题