Myluzh Blog

Strive to become a dream architect.

K8S使用NodePort时,无法在主机上看到监听的端口 - 探究原因

发布时间: 2023-12-7 文章作者: myluzh 分类名称: Kubernetes


0x00 前言
在新版K8S中,即便 Service 使用 nodeport 暴露,在 node 中使用netstat -anp 或者ss -nlt命令上也看不到 kube-proxy 监听的端口了,但是 nodeport 访问是正常的。
Kubernetes服务不是作为侦听特定端口的进程来实现的。取而代之的是使用iptables (或IPVS),服务基本上是iptables规则。这就是为什么它们不会出现在你的netstat中。
详细查看:https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-iptables

0x01 你需要先了解kube-proxy的三种工作模式
1、userspace
userspace模式是 kube-proxy 使用的第一代模式,该模式在 kubernetes v1.0 版本开始支持使用,该模式kube-proxy会为每一个Service创建一个监听端口,发向Cluster IP的请求被Iptables规则重定向到kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接,以将请求转发到Pod上。该模式下,kube-proxy充当了一个四层负责均衡器的角色。由于kube-proxy运行在userspace中,在进行转发处理时会增加内核和用户空间之间的数据拷贝,虽然比较稳定,但是效率比较低,不推荐使用。
2、iptables
iptables 模式是 kube-proxy 使用的第二代模式,该模式在 kubernetes v1.1 版本开始支持,从 v1.2 版本开始成为 kube-proxy 的默认模式。
该模式下kube-proxy为service后端的每个Pod创建对应的iptables规则,直接将发向Cluster IP的请求重定向到一个Pod IP。该模式的优点是较userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。
3、ipvs
ipvs 模式被 kube-proxy 采纳为第三代模式,模式在 kubernetes v1.8 版本开始引入,在 v1.9 版本中处于 beta 阶段,在 v1.11 版本中正式开始使用。
ipvs模式和iptables类似,kube-proxy监控Pod的变化并创建相应的ipvs规则。ipvs相对iptables转发效率更高。除此以外,ipvs支持更多的LB算法。如果要设置Kube-proxy为ipvs模式,必须在操作系统中安装IPVS内核模块,否则会降级为iptables。

0x02 如何查看自己k8s集群的kube-proxy使用的是iptables还是ipvs?
方法1:通过 ps -ef | grep kube-proxy 查看--proxy-mode参数内容。
方法2:查看kube-proxy运行日志。

0x03 查找防火墙的端口转发
如果是iptables,查找nodeport 31000端口
[root@k8s-master01 ~]# iptables -tnat -L | grep 31000
KUBE-EXT-FC2LKBLU44TPG3GB  tcp  --  anywhere             anywhere             /* hellok8s/hellok8s:hellosvcp */ tcp dpt:31000
如果是ipvs,查找nodeport 31000端口
[root@k8s-master01 ~]# ipvsadm -Ln | grep 31000
TCP  172.16.10.20:31000 rr


参考文章:
kube-proxy的三种工作模式
宿主机k8s中netstat看不到端口但可以访问端口 

标签: k8s kube-porxy iptables ipvs

发表评论