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

标签 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 上有一些 cluster-ip:

$ 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,则会失败。

我使用 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

这是WAD还是一个问题?

最佳答案

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

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

关于kubernetes - 我可以从k8s节点直接访问K8s ClusterIP吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017973/

相关文章:

带有 hostPath 挂载的谷歌云上的 Kubernetes

Kubernetes:为自定义资源创建事件

kubernetes - openshift 3.11 安装失败 - 无法更新 cni 配置 : No networks found in/etc/cni/net. d",

kubernetes - kubectl 端口转发报告 `error: error upgrading connection: unable to upgrade connection: pod does not exist`

amazon-web-services - 如何从 kubernetes pod 中识别主机云提供商?

kubernetes - Openshift vs Rancher有什么区别?

kubernetes - Istio Ingress 路由失败,对 Kubernetes 中的 Shiny 服务器出现 400 Bad request

kubernetes - 如何使用 Helm 从列表中迭代创建 pod?

kubernetes - kubernetes 集群中 CPU 使用率最高的前三个 pod

使用yaml文件进行Kubernetes滚动部署